TCP協議詳解:首部格式與連接管理
一、TCP首部格式
TCP首部最小20字節,最大60字節,包含以下字段:
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 源端口號(16bit) | 目的端口號(16bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 序列號(32bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 確認號(32bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 數據偏移(4bit)| 保留(6bit) |U|A|P|R|S|F| 窗口大小(16bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 校驗和(16bit) | 緊急指針(16bit) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 選項(可選,最多40字節) |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
| 數據部分 |
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±+
關鍵字段說明:
- 源/目的端口:各占2字節,標識發送方和接收方的應用進程
- 序列號/確認號:各占4字節,用于可靠傳輸
- 控制標志位:
- URG:緊急指針有效
- ACK:確認號有效
- PSH:接收方應盡快交付應用層
- RST:連接復位
- SYN:同步序列號(連接建立)
- FIN:發送方數據發送完畢(連接釋放)
二、TCP三次握手(連接建立)
客戶端 服務端
| |
| SYN=1, seq=x |
|--------------------------------->|
| |
| SYN=1, ACK=1, seq=y, ack=x+1 |
|<---------------------------------|
| |
| ACK=1, seq=x+1, ack=y+1 |
|--------------------------------->|
| |
握手過程:
- SYN_SENT:客戶端發送SYN包(SYN=1, seq=x)進入SYN_SENT狀態
- SYN_RCVD:服務端回復SYN+ACK包(SYN=1, ACK=1, seq=y, ack=x+1)進入SYN_RCVD狀態
- ESTABLISHED:客戶端發送ACK包(ACK=1, seq=x+1, ack=y+1)雙方進入連接狀態
📌 為什么需要三次握手?
- 防止歷史重復連接初始化導致的資源浪費
- 同步雙方的初始序列號
- 避免資源浪費(防止服務端因無效請求維持連接)
三、TCP四次揮手(連接釋放)
客戶端 服務端
| |
| FIN=1, seq=u |
|--------------------------------->|
| |
| ACK=1, ack=u+1 |
|<---------------------------------|
| |
| FIN=1, seq=v |
|<---------------------------------|
| |
| ACK=1, seq=u+1, ack=v+1 |
|--------------------------------->|
| |
揮手過程:
- FIN_WAIT_1:主動方發送FIN包(FIN=1, seq=u)進入FIN_WAIT_1狀態
- CLOSE_WAIT:被動方回復ACK包(ACK=1, ack=u+1)進入CLOSE_WAIT狀態
- FIN_WAIT_2:主動方收到ACK后進入FIN_WAIT_2狀態
- LAST_ACK:被動方發送FIN包(FIN=1, seq=v)進入LAST_ACK狀態
- TIME_WAIT:主動方回復ACK包(ACK=1, seq=u+1, ack=v+1)進入TIME_WAIT狀態(等待2MSL)
- CLOSED:雙方最終關閉連接
?? TIME_WAIT狀態的作用:
- 確保最后一個ACK能到達對端
- 讓網絡中殘留的報文段失效(等待2MSL時間)
四、常見問題解答
Q1: 為什么連接是三次握手而關閉要四次揮手?
A: 因為TCP是全雙工的,關閉時需要分別關閉兩個方向的數據流。當收到FIN時只表示對方不再發送數據,但本方可能還需要發送剩余數據。
Q2: SYN洪泛攻擊是什么?
A: 攻擊者偽造大量SYN包但不完成握手,導致服務端維持大量半開連接。防御方法包括SYN Cookie、增加積壓隊列等。
Q3: TIME_WAIT狀態為什么要持續2MSL?
A: MSL是報文最大生存時間。2MSL可以保證:
- 本方最后一個ACK能到達對端(最多MSL)
- 如果對端沒收到,重傳的FIN會在下一個MSL內到達