為什么tcp協(xié)議三次握手

image.png

在三次握手中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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容