# TCP的三次握手與四次揮手是什么
## 引言
在計算機網絡通信中,TCP(傳輸控制協議)是互聯網協議套件中最核心的協議之一,負責在不可靠的網絡環境中提供可靠的、面向連接的通信服務。TCP連接的建立和終止過程分別通過**三次握手(Three-way Handshake)**和**四次揮手(Four-way Handshake)**機制實現。本文將深入解析這兩個過程的原理、作用及常見問題。
---
## 一、TCP協議基礎
### 1.1 TCP的特點
- **面向連接**:通信前需建立連接,結束后釋放連接。
- **可靠傳輸**:通過確認、重傳、流量控制等機制保證數據準確送達。
- **全雙工通信**:雙方可同時發送和接收數據。
- **基于字節流**:數據被看作無結構的字節序列。
### 1.2 TCP報文結構
TCP報文頭部包含以下關鍵字段:
- **序列號(Sequence Number)**:標識數據字節流的順序。
- **確認號(Acknowledgment Number)**:期望收到的下一個字節序號。
- **控制標志位**:
- `SYN`:同步序列號,用于建立連接。
- `ACK`:確認標志。
- `FIN`:終止連接標志。
---
## 二、三次握手:建立連接
### 2.1 握手過程
三次握手的目標是同步雙方的初始序列號(ISN),并確認雙方的收發能力正常。
1. **第一次握手(SYN=1)**
- 客戶端發送`SYN=1`報文,隨機生成初始序列號`seq=x`。
- 進入`SYN_SENT`狀態。
2. **第二次握手(SYN=1, ACK=1)**
- 服務端收到`SYN`后,回復`SYN=1`和`ACK=1`,確認號`ack=x+1`,并發送自己的初始序列號`seq=y`。
- 進入`SYN_RCVD`狀態。
3. **第三次握手(ACK=1)**
- 客戶端確認服務端的`SYN`,發送`ACK=1`,確認號`ack=y+1`。
- 雙方進入`ESTABLISHED`狀態,連接建立完成。
```plaintext
客戶端 服務端
|-------- SYN=1, seq=x ------->|
|<-- SYN=1, ACK=1, seq=y, ack=x+1 --|
|------- ACK=1, ack=y+1 ------>|
SYN
但不完成握手,耗盡服務端資源。防御手段包括SYN Cookie
機制。由于TCP是全雙工的,每個方向需單獨關閉連接。
第一次揮手(FIN=1)
FIN=1
報文,序列號seq=u
。FIN_WT_1
狀態。第二次揮手(ACK=1)
ACK=1
,確認號ack=u+1
。CLOSE_WT
狀態,客戶端進入FIN_WT_2
狀態。第三次揮手(FIN=1)
FIN=1
報文,序列號seq=v
。LAST_ACK
狀態。第四次揮手(ACK=1)
FIN
,發送ACK=1
,確認號ack=v+1
。TIME_WT
狀態,等待2MSL
后關閉;服務端直接關閉。客戶端 服務端
|-------- FIN=1, seq=u ------->|
|<-- ACK=1, ack=u+1 -----------|
|<-------- FIN=1, seq=v -------|
|------- ACK=1, ack=v+1 ------>|
FIN
,待數據發送完畢后再發送自己的FIN
。FIN
。2MSL
(報文最大生存時間)確保網絡中所有舊報文失效。特性 | 三次握手 | 四次揮手 |
---|---|---|
目的 | 建立連接 | 終止連接 |
交互次數 | 3次 | 4次 |
是否需同步 | 同步序列號 | 無序列號同步需求 |
握手階段丟包:
SYN
丟失,會超時重傳。SYN+ACK
丟失,客戶端重傳SYN
。揮手階段丟包:
FIN
丟失,會觸發超時重傳機制。shutdown()
函數實現單向關閉。TCP的三次握手和四次揮手是保障可靠通信的核心機制。三次握手解決了連接初始化時的同步與驗證問題,而四次揮手則適應了全雙工通信的特性,確保連接優雅關閉。理解這些過程有助于診斷網絡問題(如連接超時、端口占用等),并為高性能網絡編程奠定基礎。
思考題:如果TCP采用兩次握手建立連接,會存在哪些風險?
答案:可能導致歷史重復連接占用資源,或無法驗證服務端的接收能力。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。