1. 程式人生 > >TCP建立連線為什麼是三次握手,為什麼不是兩次或四次?

TCP建立連線為什麼是三次握手,為什麼不是兩次或四次?

tcp 三次握手

第一次握手:客戶端傳送TCP包,置SYN標誌位為1,將初始序號X,儲存在包頭的序列號(Seq)裡。
第二次握手:服務端迴應確認包,置SYN標誌位為1,置ACK為X+1,將初始序列號Y,儲存在包頭的序列號裡。
第三次握手:客戶端對服務端的確認包進行確認,置SYN標誌位為0,置ACK為Y+1,置序列號為Z。

為什麼不是兩次
重新看一遍圖(S-服務端,C-客戶端)

第一次握手後,S可以確認自己收報文與C發報文的功能都正常,而C呢,它什麼都不能確認。
第二次握手後,C可以確認自己的收發報文與S的收發報文功能都正常,也就是認為連線已建立。
那麼第三次呢,S也可以確認雙方能夠正常通訊。

假想一下,如果我們去掉了第三次呢?
如果只是第二次建立的話,服務端和客戶端就已經建立,但是如果客戶端沒有收到服務端的迴應?這個時候,客戶端認為沒有建立,服務端卻為認為建立成功,並儲存了必要的資源,如果出現大量的這樣的情況。那麼伺服器會奔潰。
因此第三次握手是必要的。

為什麼不是四次
因為三次握手後,C和S至少可以確認之前的通訊情況,但無法確認之後的情況。 所以如果四次還是五次或是更多次都是徒勞的。