《計算機網路》(謝希仁 譯)中講了原因:
1.採用兩次握手,那麼若client向server發起的包a1如果在傳輸鏈路上遇到的故障,導致傳輸到server的時間相當滯後,在這個時間段由於client沒有收到server的對於包a1的確認,那麼就會重傳乙個包a2,假設伺服器正常收到了a2的包,然後返回確認b2包。由於沒有第三次握手,這個時候client和server已經建立連線了。再假設a1包隨後在鏈路中傳到了server,這個時候server又會返回b1包確認,但是由於client已經清除了a1包,所以client會丟棄掉這個確認包,但是server會保持這個相當於「殭屍」的連線。
所以採用兩次握手,有可能會浪費server的網路資源。
形象解釋:
1,客戶發乙個曖昧的訊息,給服務員
2,服務員收到,看了訊息,很高興,馬上回信(此時客戶還不知道服務收到)
3,客戶特別高興收到服務員關係確認的訊息,(但是服務員還不知道客戶收到了,如果沒收到得重發,理論上來說,直到海枯石爛=-=)
4,服務員終於收到了客戶關係確認的訊息,懸著的心終於放下了
5,於是客戶跟服務員真正建立了 一條可靠的通道,畢竟兩人都知道那是行得通的。。。
所以至少得三次才能確認關係
不用三次的話,server不能確定client是否收到自己的訊息
如果沒有收到,可能client根本沒收到,或者client響應了,但server沒收到
如果你用過對講機你就會明白:
c ->s: 你能聽到嗎?
s->c: 聽到。你能聽到我嗎?
c->s:聽到。
為什麼 TCP 建立連線需要三次握手
因為這是為了防止出現失效的連線請求報文段被服務端接收的情況,從而產生錯誤。可以想象如下場景。客戶端傳送了乙個連線請求 a,但是因為網路原因造成了超時,這時 tcp 會啟動超時重傳的機制再次傳送乙個連線請求 b。此時請求順利到達服務端,服務端應答完就建立了請求,然後接收資料後釋放了連線。假設這時候連線...
為什麼TCP是三次握手
tcp 三次握手 首先簡單介紹一下tcp三次握手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack ...
TCP為什麼是三次握手?
tcp的三次握手過程 1 第一次握手 建立連線時,客戶先傳送syn 1,seq x到伺服器,客戶端進入syn send狀態,等待伺服器確認 2 第二次握手 伺服器收到syn包後必須確認收到客戶的syn包,傳送ack ack x 1 同時自己也傳送乙個syn包 seq k 此時伺服器進入syn rec...