首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

TCP 協定核心機制全解析:可靠傳輸、連線管理與擁塞控制

     編輯:關於VC++

TCP 可靠傳輸基石

TCP 透過多重機制確保資料可靠交付:

  • 資料分塊:應用層資料流切分為適當大小的段 (Segment)
  • 確認重傳:發送後啟動計時器,超時未收到 ACK 則重傳
  • 延遲確認:接收端延遲數分之一秒發送 ACK,提高效率
  • 端到端檢驗和:涵蓋標頭與資料,錯誤則丟棄不確認
  • 排序與去重:序號機制確保順序交付並丟棄重複資料
  • 流量控制:滑動視窗機制防止快速發送端淹沒緩慢接收端

TCP 標頭結構詳解

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          來源埠號         |          目的埠號         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        序號 (Sequence Number)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      確認號 (Acknowledgment Number)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  資料位移 |保留|U|A|P|R|S|F|       視窗大小        |
|           |   |R|C|S|S|Y|I|                               |
|           |   |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           檢驗和          |         緊急指標          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    選項 (Options)                       | 填充 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         資料 (Data)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

關鍵欄位深度解析

欄位長度核心功能
序號32-bit標識段中第一個資料位元組的位元組流序號
確認號32-bit期望收到的下一個序號 (僅當 ACK=1 時有效)
資料位移4-bit標頭長度 (以 32-bit 為單位),最大 60 bytes
6 個旗標6-bitURG, ACK, PSH, RST, SYN, FIN 可同時置 1
視窗大小16-bit接收緩衝區剩餘容量 (bytes),最大 65,535
檢驗和16-bit強制性,涵蓋偽標頭 + TCP 標頭 + 資料
緊急指標16-bit指向緊急資料最後一個位元組 (相對序號偏移)

連線建立與終止:三次握手與四次揮手

三次握手建立連線

  1. SYN=1, seq=x → 客戶主動開啟,進入 SYN_SENT
  2. SYN=1, ACK=1, seq=y, ack=x+1 → 伺服器被動開啟,進入 SYN_RCVD
  3. ACK=1, seq=x+1, ack=y+1 → 客戶確認,雙方進入 ESTABLISHED

注意:SYN 佔用一個序號,ISN (Initial Sequence Number) 需隨機產生以防舊連線干擾。

四次揮手終止連線

  1. FIN=1, seq=u → 主動關閉方結束發送,進入 FIN_WAIT_1
  2. ACK=1, ack=u+1 → 被動方確認,進入 CLOSE_WAIT
  3. FIN=1, seq=v → 被動方結束發送,進入 LAST_ACK
  4. ACK=1, ack=v+1 → 主動方確認,進入 TIME_WAIT (2MSL)

關鍵狀態機制

  • TIME_WAIT (2MSL):確保最後 ACK 到達,防止舊連線封包干擾新連線
  • 靜默時間:重啟後 MSL 秒內不建立新連線
  • 半關閉:單向關閉仍可接收資料
  • 同時開啟/關閉:罕見但需處理,同時開啟交換 4 個段

TCP 超時重傳與擁塞控制

四大計時器

  1. 重傳計時器:等待 ACK
  2. 持久計時器:視窗為 0 時週期性探查
  3. 保活計時器:空閒 2 小時發送探測,預設 10 次、間隔 75 秒
  4. 2MSL 計時器:測量 TIME_WAIT 狀態持續時間

RTT 測量與 RTO 計算

採指數加權移動平均 (EWMA) 追蹤 RTT 變化:

SRTT = (1-α) * SRTT + α * RTT_sample
RTTVAR = (1-β) * RTTVAR + β * |SRTT - RTT_sample|
RTO = SRTT + 4 * RTTVAR

擁塞控制四大演算法

演算法核心邏輯觸發條件
慢啟動cwnd 指數增長 (每收 1 ACK, cwnd++)連線建立、超時後
擁塞避免cwnd 線性增長 (每 RTT 增加 1 MSS)cwnd ≥ ssthresh
快速重傳收到 3 個重複 ACK 立即重傳3 Duplicate ACKs
快速恢復ssthresh = cwnd/2, cwnd = ssthresh + 3 MSS快速重傳後

ICMP 錯誤處理

  • Source Quench:觸發慢啟動 (cwnd=1),ssthresh 不變
  • Host/Net Unreachable:視為暫時性,繼續重傳直到超時

進階效能優化

  • 路徑 MTU 發現:設 DF bit,收到 ICMP "Fragmentation Needed" 調整 MSS
  • 長肥管道 (LFN):容量 = 頻寬 × RTT,需視窗擴大選項支援
  • 視窗擴大選項:將 16-bit 視窗擴展至 32-bit (scale factor)
  • 時間戳選項:精確測量 RTT,支援 PAWS (防止序號回繞)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved