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