第五章 傳輸層
一、傳輸層基本功能
-
進程到進程的邏輯通信
- 套接字(Socket):
IP地址:端口號
- IP地址:標識主機(網絡層功能)
- 端口號:16位整數(0-65535),標識進程
- 熟知端口(0-1023):如 HTTP(80)、FTP(21)
- 注冊端口(1024-49151):由 IANA 分配(如 MySQL 3306)
- 動態端口(49152-65535):臨時分配
- 套接字(Socket):
-
數據單元
- 傳輸層:報文段(TCP)/ 用戶數據報(UDP)
- 對比其他層:
- 物理層:比特流
- 鏈路層:幀
- 網絡層:IP 數據報
二、TCP與UDP協議對比
特性 | TCP | UDP |
---|---|---|
連接管理 | 三次握手、四次揮手 | 無連接 |
可靠性 | 保證交付(ACK確認、重傳機制) | 不保證交付 |
有序性 | 按序交付(序列號、確認號) | 可能亂序 |
流量控制 | 滑動窗口機制 | 無流量控制 |
擁塞控制 | 慢啟動、擁塞避免等算法 | 無擁塞控制 |
首部長度 | 20字節(最小)+ 選項 | 8字節 |
傳輸效率 | 較低(首部開銷大,確認機制) | 較高(首部開銷小,無確認) |
三、TCP協議深度解析
-
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 控制位詳解:
- URG:緊急指針有效(用于緊急數據)
- ACK:確認號有效(僅當
ACK=1
時,確認號字段有效) - PSH:接收方應盡快將數據交付給應用層
- RST:重置連接(用于異常終止)
- SYN:同步序號(連接建立時使用)
- FIN:結束傳輸(連接釋放時使用)
- 控制位詳解:
-
可靠性機制
- 超時重傳:若發送方未在超時時間內收到 ACK,重傳數據
- 流量控制:通過滑動窗口(Window 字段)告知對方接收能力
- 擁塞控制:
- 慢啟動:初始窗口小,指數增長
- 擁塞避免:窗口線性增長,避免網絡擁塞
- 快速重傳:連續收到 3 個重復 ACK 時,立即重傳
-
三次握手
客戶端 服務器| || SYN (seq=x) ||------------------>|| | SYN-ACK (seq=y, ack=x+1)|<------------------|| ACK (seq=x+1, ack=y+1) ||------------------>|
- 狀態轉換:
- 客戶端:
CLOSED
→SYN_SENT
→ESTABLISHED
- 服務器:
CLOSED
→LISTEN
→SYN_RCVD
→ESTABLISHED
- 客戶端:
- 狀態轉換:
-
四次揮手
客戶端 服務器| || FIN (seq=u) ||------------------>|| | ACK (ack=u+1)|<------------------|| | FIN (seq=v, ack=u+1)|<------------------|| ACK (ack=v+1) ||------------------>|
- 狀態轉換:
- 客戶端:
ESTABLISHED
→FIN_WAIT_1
→FIN_WAIT_2
→TIME_WAIT
→CLOSED
- 服務器:
ESTABLISHED
→CLOSE_WAIT
→LAST_ACK
→CLOSED
- 客戶端:
- TIME_WAIT 狀態:等待 2MSL(最大段壽命),確保所有報文段消失
- 狀態轉換:
四、UDP協議深度解析
-
UDP報文結構
0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | Source | Dest | Length | Checksum | | Port | Port | | | +--------+--------+--------+--------+ | data...
- 校驗和:可選字段,覆蓋首部和偽首部(包含源/目的 IP 地址)
-
校驗和計算
- 發送方:將數據補全為偶數個字節,計算二進制反碼和,存入校驗和字段
- 接收方:重新計算校驗和,若與字段值不同則丟棄
五、常見協議與端口號
協議 | 端口號 | 說明 |
---|---|---|
HTTP | 80 | 超文本傳輸協議(明文) |
HTTPS | 443 | 安全 HTTP(TLS/SSL 加密) |
FTP | 21(控制) | 文件傳輸協議(數據端口 20) |
SSH | 22 | 安全外殼協議(加密遠程登錄) |
DNS | 53 | 域名解析服務 |
DHCP | 67/68 | 動態主機配置協議(服務器/客戶端) |
SMTP | 25 | 簡單郵件傳輸協議(發送郵件) |
POP3 | 110 | 郵局協議版本 3(接收郵件) |
六、重點題型解析
-
TCP與UDP對比題
- 答案:均為傳輸層協議,提供進程間通信,但 TCP 可靠、面向連接,UDP 不可靠、無連接
-
三次握手作用
- 答案:同步雙方初始序號(防止歷史連接干擾),分配資源(緩存、變量)
-
TCP滑動窗口機制
- 答案:發送方根據接收方窗口大小調整發送速率,避免接收方緩沖區溢出
-
UDP適用場景
- 答案:視頻通話(實時性優先)、DNS 查詢(小數據量)、直播(允許丟包)
七、擴展知識
TCP狀態轉換圖詳解
TCP協議通過狀態機管理連接的建立、維護和釋放。狀態轉換圖描述了TCP連接在不同階段的狀態變遷,涵蓋了客戶端和服務器端的主動/被動操作。以下是核心內容:
一、狀態分類與含義
狀態 | 描述 |
---|---|
CLOSED | 初始狀態,表示連接未建立或已完全關閉。 |
LISTEN | 服務器端監聽端口,等待客戶端連接請求(僅服務器端可見)。 |
SYN_SENT | 客戶端發送SYN后等待確認(主動打開連接)。 |
SYN_RCVD | 服務器端收到SYN后發送SYN+ACK,等待客戶端ACK(被動打開連接)。 |
ESTABLISHED | 連接已建立,數據可雙向傳輸。 |
FIN_WAIT_1 | 主動關閉方發送FIN后等待ACK(首次關閉請求)。 |
FIN_WAIT_2 | 收到對端ACK后,等待對端FIN(僅主動關閉方可見)。 |
TIME_WAIT | 主動關閉方發送最終ACK后等待2MSL(防止舊報文干擾新連接)。 |
CLOSE_WAIT | 被動關閉方收到FIN后發送ACK,等待本地應用關閉連接。 |
LAST_ACK | 被動關閉方發送FIN后等待ACK(最終關閉請求)。 |
CLOSING | 雙方同時發送FIN(罕見狀態,需額外處理)。 |
二、狀態轉換路徑
1. 常規連接建立(三次握手)
- 客戶端:
CLOSED → SYN_SENT → ESTABLISHED
- 服務器端:
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED
2. 常規連接關閉(四次揮手)
- 主動關閉方(如客戶端):
ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
- 被動關閉方(如服務器端):
ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
3. 同時打開連接(雙方主動發起)
- 客戶端A:
CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED
- 客戶端B:
CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED
- 觸發條件:雙方同時發送SYN,交換ACK后直接進入
ESTABLISHED
。
4. 同時關閉連接(雙方主動關閉)
- 雙方均發送FIN后進入
CLOSING
狀態,最終通過交換ACK進入TIME_WAIT
和CLOSED
。
三、關鍵狀態解析
-
TIME_WAIT(2MSL等待)
- 作用:
- 確保最后一個ACK被對端接收(若丟失,對端重傳FIN,可再次發送ACK)。
- 防止舊連接的延遲報文干擾新連接(通過2MSL超時清除殘留報文)。
- MSL值:通常為30秒(Linux)或2分鐘(RFC建議),總等待時間為2×MSL。
- 作用:
-
CLOSE_WAIT(被動關閉等待)
- 常見問題:若服務器端長期處于此狀態,可能因未調用
close()
導致連接泄漏(需檢查代碼邏輯)。
- 常見問題:若服務器端長期處于此狀態,可能因未調用
-
SYN_RCVD(半連接狀態)
- 風險:服務器端收到SYN但未完成握手時,可能遭受SYN洪水攻擊(需通過SYN Cookie等機制防御)。
四、狀態轉換觸發條件
操作/事件 | 狀態變化 |
---|---|
客戶端調用connect() | CLOSED → SYN_SENT |
服務器調用listen() | CLOSED → LISTEN |
收到SYN并回復SYN+ACK | LISTEN → SYN_RCVD (服務器端) |
收到ACK完成三次握手 | SYN_RCVD → ESTABLISHED (服務器端) |
主動調用close() | ESTABLISHED → FIN_WAIT_1 (主動關閉方) |
收到FIN并回復ACK | ESTABLISHED → CLOSE_WAIT (被動關閉方) |
被動方調用close() | CLOSE_WAIT → LAST_ACK |
收到最終ACK | LAST_ACK → CLOSED (被動關閉方) |
五、特殊場景與處理
-
FIN_WAIT_2持續
- 原因:對端未發送FIN(如進程崩潰)。
- 解決:系統超時機制強制關閉(默認超時時間可配置)。
-
TIME_WAIT過多
- 影響:占用端口資源,導致新連接無法綁定相同端口。
- 優化:
- 調整內核參數(如
net.ipv4.tcp_tw_reuse
)。 - 確保HTTP服務器主動關閉連接(將TIME_WAIT轉移至客戶端)。
- 調整內核參數(如
-
RST報文觸發
- 場景:收到無效報文(如端口未監聽)時,直接發送RST強制關閉連接。
六、狀態轉換圖示例
客戶端路徑(主動關閉):
CLOSED → SYN_SENT → ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED服務器路徑(被動關閉):
CLOSED → LISTEN → SYN_RCVD → ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
七、調試與監控工具
- netstat命令:
netstat -ant | grep <端口號> # 查看當前TCP連接狀態
- ss命令(替代netstat):
ss -tulnp # 顯示所有TCP/UDP監聽端口及進程
- Wireshark抓包:分析握手/揮手過程中的報文序列和狀態變化。
總結:理解TCP狀態轉換圖是排查網絡問題(如連接泄漏、端口占用)的關鍵。需結合代碼邏輯(如close()
調用位置)和系統參數調優,確保連接高效釋放。
- 關鍵狀態:
ESTABLISHED
(連接成功)、CLOSE_WAIT
(被動關閉等待)
MTU與MSS
- MTU(最大傳輸單元):鏈路層允許的最大數據幀長度(通常 1500 字節)
- MSS(最大段長度):TCP 報文段數據部分的最大長度(
MTU - IP首部 - TCP首部
)
. TCP粘包問題 - 原因:TCP 將多個小報文合并發送,導致應用層無法區分邊界
- 解決方案:添加消息長度字段、使用分隔符(如 HTTP 的
Content-Length
)