TCP建立連接爲什麼是三次握手,而不是兩次或四次?

TCP建立連接爲什麼是三次握手,而不是兩次或四次?

首先應該清楚一點:不論握手多少次都不能確認一條信道一定是“可靠”的,但通過3次握手可以至少確認它是“可用”的,再往上加握手次數不過是提高它是“可用”的這個結論的可信度。

也就是說任意次的握手都是“不可靠”的,握手成功只能說明握手時的通信是正常的,並不能保證握手後的通信是正常的。握手只能保證儘可能的可靠,而不可能保證絕對可靠。

1.那爲什麼不是兩次握手?

是爲了防止已失效的連接請求報文段突然又傳送到了服務端,造成服務端資源的浪費。

這句話怎樣理解?

在一次TCP連接中,客戶端A向服務端B發送連接請求SYN報文段,假如這個報文段沒有及時被服務端B接收,而是滯留在網絡的某處,於是客戶端A超時重傳,再次發送請求連接並且順利與服務端B建立了連接,交換數據後斷開連接。

滯留在網絡中的某處的陳舊報文就變成了失效的連接請求報文。

但如果這個失效的請求SYN報文段,現在又突然傳送到了服務端B處,設想這時是使用兩次握手而不是三次握手,服務端B就以爲客戶端A現在建立請求連接,於是服務端B發出確認,新的連接就建立了,服務端B分配資源,等待客戶端A傳送數據,但客戶端A並沒有想要建立TCP連接,不會理會服務端B發送的應答,也不會向服務端B傳送數據,於是服務端B就白白等待,空耗資源。

使用三次握手可以避免這個情況。服務端B收到客戶端A的失效的陳舊SYN報文段,向客戶端A發送SYN報文段,選擇自己的序號seq=y,確認收到客戶端A的SYN報文段,確認號ack=x+1。第三次握手客戶端A收到B的SYN報文段後,從確認號就可得知不應理睬這個SYN報文段(因爲A現在並沒有發送seq=x的報文段)。

這時,客戶端A會發送復位報文段,這個復位報文段中,RST=1,ACK=1,確認號ack=y+1。

服務端B收到A的復位報文,就知道不建立TCP連接,不會分配資源等待A發送數據。

2.爲什麼不是四次握手?

既然兩次握手不可以,那四次握手,五次握手呢?

因爲三次握手已經能說明握手時的通信是正常的,四次握手、五次握手就顯得浪費了。



 

發佈了20 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章