文章目錄
- 一、傳輸可靠性的6方面保障
- 二、分段機制
- 三、超時重傳機制
- 四、流量控制
- 五、擁塞控制
提示:以下是本篇文章正文內容,下面案例可供參考
源網站
按TCP/IP 4層體系,TCP位于傳輸層,為應用層提供服務
一、傳輸可靠性的6方面保障
- 基于數據塊的傳輸:待傳輸的數據被分割成TCP認為合適的數據塊(報文段或段),再向下傳給網絡層
- 基于序號的數據包去重和重排:每個包有一個序列號,通過這個序列號進行排序和去重
- 校驗和:保持頭部和數據的校驗和,防止數據中傳輸過程中發生變化。基于偽頭部+反碼計算。
- 超時重傳機制:丟包或延遲的情況下重發數據包,直到接收到對方的ACK。重傳機制主要有:基于計時器的重傳、快速重傳、選擇性重傳SACK和重復選擇性重傳D-SACK
- 流量控制:利用滑動窗口實現流量控制
- 擁塞控制:當網絡擁塞時減少數據發送。TCP在發送數據時主要考慮1.接收方的接收能力;2.網絡的擁塞程度。接收能力由滑動窗口表示,量化了接收方的剩余緩沖區的大小;擁塞程度由擁塞窗口表示,量化了發送方認為可以在網絡中傳輸的數據量
三次握手和四次揮手機制也是保障可靠性的基礎機制,有這個機制才能有上面的6個方面。
TCP報文頭部:
二、分段機制
分段機制是將應用層數據分割成適合網絡傳輸的報文段,分割邏輯是基于Maximum Segment Size(MSS,單個TCP報文段能攜帶的應用層數據最大長度)和滑動窗口動態調整的。
MSS的典型值:以太網(MTU=1500字節)下,MSS=MTU-IP(20)-TCP(20)=1460字節
MSS的作用:避免IP層分片,減小傳輸開銷和丟包風險;確保報文段能適配路徑上的最小MTU,避免在傳輸的時候被IP協議分片
分段的具體流程如下:
- 應用層程序調用send將數據存入發送緩沖區
- 按MSS分割數據:假設MSS=1460字節,應用層存入數據是3000字節,報文段1=1460字節,seq=1;報文段2=1460字節,seq=1461;報文段3=80字節,seq=2921;
- 給上面的報文段123添加TCP頭部(如序列號、ACK號、窗口大小)
- 滑動窗口發送:在窗口內的報文段立即發送,窗口外的存在緩沖區內等待發送
影響分段的動態因素: 路徑MTU發現;擁塞窗口;接收窗口;
TCP分段是必要的機制,但是IP層分片則是需要盡可能避免的
三、超時重傳機制
超時重傳觸發條件:發送方發送一個數據段后啟動重傳計時器RTO Timer,如果在RTO時間內沒有收到對應的ACK就重傳這個數據段。
重傳的關鍵組件和流程:
- RTO Timer組件:每個已發送但未確認(未收到ACK)的報文段都會關聯一個獨立的RTO計時器。計時器到期后出發重傳,重置計時器并將超時時間設置為上一次RTO的2倍。其中RTO最小在Linux系統里是1秒。
- 動態RTO計算:使用Jacobson/Karels算法,基于往返時間RTT動態調整RTO
常見重傳場景:
- 首次超時重傳:重傳丟失報文段,并重置 RTO 計時器,將超時時間設置為上一次RTO的2倍。
- 快速重傳:收到3個重復ACK時,立即重傳丟失報文(不用等待RTO超時)
發送方發送 Seq=1,2,3,4,5
接收方收到 Seq=1,3,4,5(Seq=2 丟失)
接收方連續回復 3 個 ACK=2
發送方立即重傳 Seq=2 - 選擇性重傳SACK:通過 SACK 選項明確通知發送方哪些數據已接收,哪些缺失。ACK=5001, SACK=6001-7000 (表示5000之前的數據已收到,但5001-6000丟失,6001-7000已接收)
- 重復選擇性重傳D-SACK:在 SACK 的基礎上,額外攜帶信息,告知發送方有哪些數據包自己重復接收了
四、流量控制
TCP 利用滑動窗口實現流量控制。流量控制涉及到發送方和接收方的發送緩沖區和接收緩沖區,雙方都維護一個發送窗口和接收窗口。
發送窗口: TCP發送窗口可以分成4部分
- 已經發送并且確認的 TCP 段(已經發送并確認);
- 已經發送但是沒有確認的 TCP 段(已經發送未確認);
- 未發送但是接收方準備接收的 TCP 段(可以發送);
- 未發送并且接收方也并未準備接受的 TCP 段(不可發送);
TCP 接收窗口可以劃分成三個部分:
已經接收并且已經
- 確認的 TCP 段(已經接收并確認);
- 等待接收且允許發送方發送 TCP 段(可以接收未確認);
- 不可接收且不允許發送方發送 TCP 段(不可接收)。
五、擁塞控制
為了進行擁塞控制,TCP 發送方要維持一個 擁塞窗口(cwnd) 的狀態變量。擁塞控制窗口的大小取決于網絡的擁塞程度,并且動態變化。發送方讓自己的發送窗口取為擁塞窗口和接收方的接受窗口中較小的一個。TCP擁塞控制算法有4種:
- 慢開始:主機開始發送數據的時候,通過對cwnd加倍的方法從小到大增大發送窗口
- 擁塞避免:每經過一個往返時間 RTT, 就把發送方的cwnd加1, 讓擁塞窗口 cwnd 緩慢增大
- 快重傳和快恢復:當發送方連續收到3個重復的ACK時,立即重傳丟失的報文段,而不等待RTO到期;在快重傳觸發后,不立即將cwnd降為1MSS,而是通過半窗恢復策略平滑過渡,避免吞吐量斷崖式下降。