TCP/IP協議中三次握手(Three-way Handshake)與四次揮手(Four-way Wave)
- 一、TCP三次握手(Three-way Handshake)
- 二、TCP四次揮手(Four-way Wave)
- 三、常見問題解答
- 總結
- 為什么三次握手不能減少到兩次?
- 為什么三次握手不能增加到四次?
- 為什么四次揮手不能減少到三次?
- 總結:
以下是關于TCP/IP協議中三次握手(Three-way Handshake)與四次揮手(Four-way Wave)的詳細整理:
一、TCP三次握手(Three-way Handshake)
目的:建立可靠的TCP連接,確保雙方同步序列號并確認通信能力。
過程(分3步):
- 第一次握手(SYN請求)
- 客戶端發送TCP報文,設置標志位
SYN=1
,隨機生成初始序列號Seq=X
,表示請求連接。 - 客戶端進入
SYN_SENT
狀態,等待服務器響應。
- 客戶端發送TCP報文,設置標志位
- 第二次握手(SYN+ACK響應)
- 服務器收到請求后,發送TCP報文:
- 標志位
SYN=1, ACK=1
,確認號Ack=X+1
,自身生成初始序列號Seq=Y
。
- 標志位
- 服務器進入
SYN_RCVD
狀態,表示已準備好連接。
- 服務器收到請求后,發送TCP報文:
- 第三次握手(ACK確認)
- 客戶端收到服務器的響應后,發送TCP報文:
- 標志位
ACK=1
,確認號Ack=Y+1
,序列號Seq=X+1
。
- 標志位
- 雙方進入
ESTABLISHED
狀態,連接正式建立,開始數據傳輸。
- 客戶端收到服務器的響應后,發送TCP報文:
關鍵點:
- 通過序列號與確認號機制確保雙方同步,防止舊連接數據干擾。
- 第二次握手合并
SYN
與ACK
,提高效率(服務器確認客戶端的連接能力并同步自身序列號)。
二、TCP四次揮手(Four-way Wave)
目的:優雅關閉TCP連接,確保雙方數據完全傳輸并釋放資源。
過程(分4步):
- 第一次揮手(FIN請求關閉)
- 客戶端發送TCP報文,設置標志位
FIN=1
,序列號Seq=U
,表示停止發送數據。 - 客戶端進入
FIN_WAIT_1
狀態,等待服務器確認。
- 客戶端發送TCP報文,設置標志位
- 第二次揮手(ACK確認關閉請求)
- 服務器收到
FIN
后,發送TCP報文:- 標志位
ACK=1
,確認號Ack=U+1
,序列號Seq=V
(當前發送數據的序列號)。
- 標志位
- 服務器進入
CLOSE_WAIT
狀態,通知應用層處理關閉請求,但仍可向客戶端發送剩余數據。
- 服務器收到
- 第三次揮手(FIN請求反向關閉)
- 服務器發送完剩余數據后,發送TCP報文:
- 標志位
FIN=1, ACK=1
,確認號Ack=U+1
,序列號Seq=W
(可能為V+1
)。
- 標志位
- 服務器進入
LAST_ACK
狀態,等待客戶端最終確認。
- 服務器發送完剩余數據后,發送TCP報文:
- 第四次揮手(ACK確認反向關閉)
- 客戶端收到服務器的
FIN
后,發送TCP報文:- 標志位
ACK=1
,確認號Ack=W+1
,序列號Seq=U+1
。
- 標志位
- 客戶端進入
TIME_WAIT
狀態(持續2MSL時間),確認服務器收到后正式關閉。
- 客戶端收到服務器的
關鍵點:
- 四次揮手而非三次:因TCP是全雙工模式,雙方需獨立關閉數據流。
- 2MSL(Maximum Segment Lifetime)等待:
- 確保最后一個
ACK
可靠到達服務器,防止連接異常中斷。 - 允許網絡中未送達的數據包自然消亡,避免新舊連接混淆。
- 確保最后一個
三、常見問題解答
- 為什么建立連接是三次握手,而關閉是四次揮手?
- 三次握手:服務器收到客戶端的
SYN
請求后,可同時發送SYN
(同步序列號)和ACK
(確認),因此合并為一次響應。 - 四次揮手:服務器收到
FIN
后需先確認(ACK
),但可能仍有數據待發送,需延遲發送FIN
,導致分兩步。
- 三次握手:服務器收到客戶端的
- TIME_WAIT狀態的作用?
- 防止延遲的重復
FIN
或ACK
干擾新連接(若立即關閉,可能誤認為新連接數據是舊數據)。 - 確保網絡中的舊數據包徹底消失(2MSL通常是數據包的生存周期)。
- 防止延遲的重復
總結
三次握手通過“請求-響應-確認”機制建立可靠連接,而四次揮手通過雙向獨立關閉確保數據完整性。理解這些機制是網絡編程和故障排查的基礎,尤其在處理連接延遲、丟包等問題時至關重要。
- SYN 請求連接
- ACK 已正確接收數據
- FIN 是一種停止請求信號
- Seq 是 序列號(Sequence Number)的縮寫
- Seq=X 中X是一個變量,
- Ack 是 確認號 他也有自己的變量
TCP/IP協議中的三次握手和四次揮手是確保可靠連接建立與關閉的核心機制,其步驟數量經過精心設計,不能隨意增減。以下是具體原因:
為什么三次握手不能減少到兩次?
- 雙向確認需求:
○ 第一次握手(客戶端發SYN):服務器確認客戶端的發送能力。
○ 第二次握手(服務器發SYN+ACK):客戶端確認服務器的接收和發送能力。
○ 第三次握手(客戶端發ACK):服務器確認客戶端的接收能力。
○ 若減少為兩次(如省略第三次握手):
■ 服務器無法確認客戶端的接收能力,可能導致連接建立后,客戶端無法接收服務器的數據,造成通信失敗。 - 序列號同步:
○ 三次握手通過交換Seq和Ack號,確保雙方初始序列號同步,避免后續數據傳輸混亂。
○ 兩次握手無法完成雙向同步,可能導致數據丟失或重復。
為什么三次握手不能增加到四次?
- 效率與資源消耗:
○ 三次握手已滿足可靠性和同步需求,額外步驟會增加延遲和資源消耗(如TCP報文的傳輸和處理)。 - 無實際增益:
○ 第三次握手的ACK已確認雙方狀態,再次確認不會提升可靠性,反而可能引入更多潛在問題(如超時重傳機制復雜性增加)。
為什么四次揮手不能減少到三次?
- 全雙工特性:
○ TCP連接支持雙向數據傳輸(如客戶端和服務器可同時發送數據)。
○ 關閉需獨立處理兩個方向的數據流:
■ 第一次揮手:客戶端停止發送數據(FIN)。
■ 第三次揮手:服務器停止發送數據(FIN)。
○ 若合并為三次(如服務器收到FIN后立即發FIN+ACK):
■ 服務器可能仍有數據未發送完,導致數據丟失。
■ 客戶端無法區分FIN和ACK的合并響應,可能誤判連接狀態。 - 確保數據完整性:
○ 第二次揮手(ACK)確認客戶端的關閉請求,允許服務器繼續發送剩余數據。
○ 第三次揮手(FIN)通知客戶端服務器已無數據發送,觸發客戶端進入TIME_WAIT狀態等待確認。
○ 若減少步驟,可能無法保證所有數據已被傳輸和確認。
總結:
● 三次握手:通過三次交互確保雙向通信能力和序列號同步,減少或增加步驟都會破壞可靠性或效率。
● 四次揮手:因TCP全雙工特性,必須分別關閉兩個方向的數據流,合并步驟可能導致數據丟失或未完成關閉。
這種設計平衡了可靠性、效率和復雜性,是TCP/IP協議核心機制的關鍵組成部分。