TCP三次握手的思考,爲什麼要有三次握手

    大家都知道TCP有三次握手的過程,今天我就仔細想了想爲什麼TCP要有三次握手

    先貼一張三次握手的示意圖,說明一點是在三次握手中A是在第二次握手後申請緩存資源,B是在第一次握手後申請

    其實這個問題就是說,爲什麼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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章