其實這個問題就是說,為什么tcp不能兩次握手,或者一次握手就建立連接,和三次握手時怎么解決兩次握手中的問題的。
為什么不能一次握手很容易理解,TCP是面向連接的,一次握手肯定建立不了連接,一條信息發出去連個回信都沒有怎么連接?所以問題在為什么不能兩次握手,這個問題也很容易網上說的也不少,假設只有兩次握手,比如圖中的1,2步,當A想要建立連接時發送一個SYN,然后等待ACK,結果這個SYN因為網絡問題沒有及時到達B,所以A在一段時間內沒收到ACK后,在發送一個SYN,B也成功收到,然后A也收到ACK,這時A發送的第一個SYN終於到了B,對於B來說這是一個新連接請求,然后B又為這個連接申請資源,返回ACK,然而這個SYN是個無效的請求,A收到這個SYN的ACK后也並不會理會它,而B卻不知道,B會一直為這個連接維持着資源,造成資源的浪費
那三次握手為什么可以?兩次握手的問題在於服務器端不知道一個SYN是否是無效的,而三次握手機制因為客戶端會給服務器回復第二次握手,也意味着服務器會等待客戶端的第三次握手,如果第三次握手遲遲不來,服務器便會認為這個SYN是無效的,釋放相關資源。但這時有個問題就是客戶端完成第二次握手便認為連接已建立,而第三次握手可能在傳輸中丟失,服務端會認為連接是無效的,這時如果Client端向Server寫數據,Server端將以RST包響應,方能感知到Server的錯誤。
總的來說,三次握手可以保證任何一次握手出現問題,都是可以被發現或補救的
第一次握手A發送SYN傳輸失敗,A,B都不會申請資源,連接失敗。如果一段時間內發出多個SYN連接請求,那么A只會接受它最后發送的那個SYN的SYN+ACK回應,忽略其他回應全部回應,B中多申請的資源也會釋放
第二次握手B發送SYN+ACK傳輸失敗,A不會申請資源,B申請了資源,但收不到A的ACK,過一段時間釋放資源。如果是收到了多個A的SYN請求,B都會回復SYN+ACK,但A只會承認其中它最早發送的那個SYN的回應,並回復最后一次握手的ACK
第三次握手ACK傳輸失敗,B沒有收到ACK,釋放資源,對於后序的A的傳輸數據返回RST。實際上B會因為沒有收到A的ACK會多次發送SYN+ACK,次數是可以設置的,如果最后還是沒有收到A的ACK,則釋放資源,對A的數據傳輸返回RST