TCP(傳輸控制協議)的可靠傳輸是通過一系列機制保證數據準確、有序、不丟失地到達接收方。以下是TCP可靠傳輸的詳細過程及核心機制:
1. 數據分塊與序列號(Seq)
分塊:應用層數據被分割成適合傳輸的TCP報文段(MSS,通常1460字節)。
序列號(Seq):每個字節都被編號,Seq表示該報文段第一個字節的序號。
例如:發送一個1000字節的數據,若Seq=1,則下一個報文段的Seq=1001。
2. 確認應答(ACK)
ACK機制:接收方收到數據后,必須發送ACK確認報文,告知發送方已成功接收。
ACK號?=?期望收到的下一個字節的序號(即最后一個成功接收的字節序號 +1)。
例如:收到Seq=1、長度=1000的數據,則返回ACK=1001。
累積確認:TCP通常對按序到達的連續數據批量確認(如ACK=1001表示1000及之前的所有字節已接收)。
3. 超時重傳(Retransmission)
RTO(Retransmission Timeout):發送方為每個報文段啟動定時器,若超時未收到ACK,則重傳。
RTO動態計算:基于RTT(往返時間)自適應調整(如Karn算法、Jacobson算法)。
快速重傳:如果收到3個重復ACK(如連續收到ACK=1001),說明后續數據可能丟失,立即重傳而不等待超時。
4. 滑動窗口(Flow Control)
窗口大小(Window):接收方通過TCP頭部的
Window
字段告知可用緩沖區大小,控制發送方的速率(流量控制)。發送方只能發送窗口內未被確認的數據。
窗口動態滑動:隨著ACK的到達,窗口向前移動。
5. 順序控制與重排序
亂序處理:接收方通過Seq號對亂序報文段排序,僅對連續數據返回ACK。
SACK(選擇性確認):可選機制,顯式告知發送方哪些數據塊已接收(解決非連續ACK的問題)。
6. 連接管理與狀態維護
三次握手:建立連接時同步初始序列號(ISN),確保雙方準備好傳輸。
過程:SYN → SYN-ACK → ACK。
四次揮手:可靠釋放連接,確保數據全部傳輸完畢。
過程:FIN → ACK → FIN → ACK。
7. 擁塞控制(Congestion Control)
慢啟動(Slow Start):窗口從1個MSS開始,按指數增長(每RTT翻倍)。
擁塞避免(AIMD):達到閾值后,窗口線性增長。
快速恢復:發生擁塞時(如丟包),窗口減半并進入線性增長階段。
可靠傳輸全過程示例
假設主機A向主機B發送數據:
發送數據:
A發送Seq=1、長度=1000的數據。
B收到后返回ACK=1001,窗口大小=3000。
滑動窗口:
A收到ACK=1001后,窗口向右滑動,繼續發送Seq=1001、2001、3001的數據。
丟包處理:
若Seq=2001丟失,B仍返回ACK=1001(重復ACK)。
A收到3個ACK=1001后,快速重傳Seq=2001。
擁塞控制:
網絡擁塞時,A檢測到丟包,將窗口從4000減半至2000,進入擁塞避免階段。
關鍵點總結
機制 | 作用 |
---|---|
序列號(Seq) | 標識數據字節順序,解決亂序問題。 |
確認應答(ACK) | 接收方反饋成功接收的數據范圍。 |
超時重傳 | 確保丟失數據被重新發送。 |
滑動窗口 | 流量控制,防止接收方緩沖區溢出。 |
擁塞控制 | 動態調整發送速率,避免網絡過載。 |
連接管理 | 通過握手/揮手確保傳輸的可靠啟動和關閉。 |
為什么TCP是可靠的?
無丟失:通過ACK和重傳保證。
無重復:序列號去重。
無亂序:序列號和滑動窗口排序。
無錯誤:通過校驗和(Checksum)驗證數據完整性。