TCP建立連接為什么是三次握手而不是兩次握手?
《計算機網絡》(謝希仁 譯)中講了原因: 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:聽到。