一:過程
第一次(SYN):
客戶端發送一個帶有SYN標志的TCP報文段給服務器,設置SYN=1,并攜帶初始序列號Seq=x(隨機值),進入SYN_SENT狀態。等待服務器相應。
第二次(SYN+ACK):
服務器收到客戶端發送的SYN報文段后,如果同意建立連接,會發送報文段給客戶端:
設置SYN=1,攜帶服務器的初始序列號Seq=y(隨機值)。
設置ACK=1,確認號Ack=x+1,表示已收到客戶端的Seq=x。
服務器進入SYN_RVCD狀態。
第三次(ACK):
客戶端收到服務器發送的SYN+ACK報文段后,會發送報文段給服務器:
設置ACK=1,確認號Ack=y+1,表示已收到服務器的Seq=y。
序列號Seq=x+1,繼續之前的序列。
客戶端進入ESTABLISHED狀態。
收到客戶端的ACK后,服務器也進入ESTABLISHED狀態,連接建立成功,可以開始進行數據傳輸。
二:為什么要3次?
1.確認雙方都能發送和接收數據:
第一次握手確認客戶端的發送能力和服務器的接受能力。
第二次握手確認服務器的發送能力和客戶端的接受能力。
第三次握手確認客戶端的發送能力和服務器的接受能力。
2.防止舊的連接請求誤導對方:
通過三次握手,雙方都能確認對方的狀態是最新的,有效避免了網絡中舊的、延遲的SYN包造成的錯誤連接。
3.防止重復數據包干擾:
三次握手確保雙方都能有效處理重復的數據包,并建立一個唯一的連接。
三:為什么不是2次?
無法確認雙向通信
TCP是全雙工協議,需要確保客戶端和服務器都能發送和接收數據。
兩次握手過程:客戶端->SYN->服務器? 服務器->ACK->客戶端
問題:
服務器發送ACK后,認為連接已建立,但客戶端可能未收到ACK(比如網絡丟包)。服務器無法確認客戶端是否收到ACK。
后果:
服務器單方面認為連接成功,可能開始發送數據,而客戶端未準備好,導致數據丟失。
無法同步服務器的序列號
TCP使用序列號確保數據按序傳輸。
兩次握手中,服務器的ACK只確認了客戶端的序列號(x),但未發送自己的序列號(y)。
問題:客戶端無法知道服務器的初始序列號,后續數據傳輸可能因為序列號不同步而混亂。
后果:缺乏雙向序列號同步,無法保證可靠傳輸。
無法防止舊連接干擾
網絡中可能存在延遲的舊數據包,比如之前的SYN。
兩次握手時:
客戶端發送舊SYN,服務器收到后返回ACK。
服務器認為連接建立,但客戶端未發送新連接。
問題:兩次握手無法區分新舊連接,服務器可能誤處理舊包。
后果:舊數據干擾新連接,導致不可靠性。
四:為什么不是四次握手?
四次也可以,但是多余,效率低。