TCP報文結構
? ?
TCP報文由**首部(Header)和數據(Data)**兩部分組成。首部包括固定部分(20字節)和可選選項(最多40字節),總長度最大為60字節。
1. 首部固定部分
-
源端口(16位)和目的端口(16位)
-
標識發送和接收的應用程序(如HTTP默認端口80)。
-
-
序列號(32位)
-
表示當前報文段數據部分的第一個字節的序號,確保數據按序傳輸。
-
-
確認號(32位)
-
期望收到的下一個字節的序號,表示接收方已正確接收之前的所有數據。
-
-
數據偏移(4位)
-
指示首部長度(以4字節為單位)。例如,值為
5
表示首部長度20字節。
-
-
保留字段(6位)
-
未使用,必須置0。
-
-
控制位(6位)
-
URG:緊急指針有效,優先處理緊急數據。
-
ACK:確認號有效(連接建立后通常為1)。
-
PSH:接收方應立即將數據推送給應用層。
-
RST:強制重置異常連接。
-
SYN:建立連接時同步序列號。
-
FIN:正常關閉連接。
-
-
窗口大小(16位)
-
接收方的可用緩沖區大小,用于流量控制(滑動窗口機制)。
-
-
校驗和(16位)
-
計算包括偽首部(源/目的IP、協議類型、TCP長度)、TCP首部和數據,確保數據完整性。
-
-
緊急指針(16位)
-
當URG=1時有效,指向緊急數據的結束位置。
-
2. 選項部分(可變長度,最多40字節)
-
MSS(最大報文段長度):在三次握手時協商,避免IP分片。
-
窗口擴大因子:擴展窗口大小(原16位窗口最大為65535)。
-
時間戳:計算往返時間(RTT)和防止序列號回繞(PAWS機制)。
-
SACK(選擇性確認):允許接收方報告非連續接收的數據塊,提升重傳效率。
3. 填充字段
-
確保首部長度是4字節的倍數。
4. 數據部分
-
上層協議(如HTTP、FTP)傳遞的數據,長度由MSS和窗口大小共同決定。
TCP的特點
- 面向連接:TCP發送數據前需要通過三次握手建立全雙工通信,結束數據發送后通過四次揮手關閉連接
- 可靠性:TCP通過確認和重傳、快速重傳、擁塞控制、流量控制、有序性、超時重傳等機制確保數據可靠傳輸
- 確認和重傳:接收方收到數據后會發送確認ACK給發送方,若發送方經過超時時間未收到ACK,則會重傳
- 流量控制:接收方會通過滑動窗口(循環數組,用三個指針給他分區)的機制告訴發送方可接收數據的大小,避免發送方發送大量數據擁塞在接收方的緩沖區
- 擁塞控制:發送方根據網絡的擁塞情況動態調整發送速率,避免造成網絡擁塞
- 有序性:接收方根據TCP頭部的序列號重新對數據進行排序
- 頭部開銷大:TCP報文頭部(源/目的端口+**序列號/確認號**+首部長度+**標志位(SYN/ACK/FIN/RST)**+**窗口大小(RWND)**+校驗和),增加傳輸開銷
- 源/目的端口 標識了應用進程;序列號和確認號可以進行確認和重傳,同時保證數據有序;
- 標志位(指示TCP會話期間的特定狀態):**SYN-同步,ACK-確認數據包接收,FIN-結束**,RST-重置TCP連接,URG-緊急數據,PSH-立即推送數據,
- 全雙工通信:TCP協議允許通信雙方同時進行數據的發送和接收
TCP超時重傳
- RTT(Round-Trip Time)往返時延:數據包在網絡中的往返時延(網絡波動造成RTT**動態變化**)
- ?RTO(Retransmission Timeout)超時重傳時間:RTO應略大于RTT。太大會降低網絡的傳輸效率;小于RTT則會造成不必要的超時重傳,增大網絡負荷
- 發送方在RTO內未收到ACK,說明網絡嚴重擁塞,發送方重置CWND(擁塞窗口)進行**慢啟動**,逐步增加發送量,降低網絡過載風險
- 擁塞窗口CWND :發送方維護的變量,初始值默認為1 MSS(1460 Byte)
- 慢啟動閾值_ssthresh:窗口增長模式的切換點;初始值較高(如接收方通告窗口大小)發生擁塞時動態調整
- 慢啟動算法流程:
- 初始化階段:TCP連接建立后/超時重傳后,set CWND= 1 MSS,ssthresh初始為較大值
- 指數增長階段:每收到一個和ack,cwnd增加1MSS(每個RTT內,CWND翻倍):
- 假設RTT固定100ms,初始CWND= 1 MSS
- 第0ms,發送一個報文 cwnd =1
- 第100ms:收到ack,cwnd=2(第100-200ms 發送2個報文)
- 第200ms:收到2個ack,每個ack觸發cwnd+1, cwnd=4(第200-300ms 發送四個報文)
- 第300ms:收到4個ack,cwnd=8;
- 切換至**擁塞避免**:<u>*cwnd >= ssthresh*</u> 時,結束慢啟動進入**線性增長**的擁塞避免階段(每RTT,CWND增長1 MSS)
- 擁塞處理**:
- 超時丟包:嚴重擁塞,重置ssthresh=MAX(CWND/2,2 MSS),CWND = 1 MSS,重新***慢啟動***
- 快速重傳/恢復:(重復ACK觸發)調整ssthresh= CWND/2 ,CWND=ssthresh+3(3個重復的ACK),直接進入***擁塞避免***
TCP快速重傳
????????發送方連續收到**三個重復ACK**(RFC經驗)時,說明網絡單包丟失,發送方CWND減半,進行快速重傳