TCP三次握手原因、過程、失敗以及不採用三次握手的後果

爲什麼必須是三次握手?

  大家都知道傳輸層(點擊這裏去傳輸層)中的TCP協議是面向連接的,提供可靠的連接服務,其中最出名的就是三次握手和四次揮手,今天先講解三次握手(四次揮手點這裏),如下圖
在這裏插入圖片描述
  喜歡鑽牛角尖的我在學習三次握手的時候就想到了幾個問題:爲什麼三次握手是三次?不是一次、兩次或者更多?如果是兩次或者是一次會出現什麼情況?帶着這個問題我找了好多資料,發現了其中的奧祕。

一次握手的情況:

  由於TCP是面向連接的,一次很明顯時不可能的,因爲客戶端發出連接消息後,卻沒有接收到來自服務端的迴應,客戶端就無法確定服務端接是否收到了連接請求,當然也就不能確定是否連接成功。
在這裏插入圖片描述

兩次握手的情況:

  既然一次客戶端接收不到服務端的迴應,那就連接兩次,接收到迴應就說明服務端接收到了連接請求,可以連理連接了。結果並不是這樣。
如果客戶端想建立連接,給服務端發了一個連接請求(SYN),但是由於網絡中種種情況,導致沒有及時到達服務端,這就導致客戶端在很長一段時間中沒有收到回覆消息(ACK),這時客戶端又給服務端發送一個SYN,這次的發送和接收的很順利,很快就收到了ACK,但是這時之前的SYN終於到了服務端,服務端規規矩矩的爲這個SYN申請資源,然後返回ACK。由於之前的SYN已經失效了,所以客戶端也不會去理會這個ACK,但是傻乎乎的服務端並不知道這個SYN已經失效了,一直爲他委會着資源,這就造成了資源的浪費。
在這裏插入圖片描述

三次握手的情況:

  一發一收的兩次握手既然不行,那麼三次握手就可以了嗎?接着往下看。
  在兩次握手中服務端不知道當前這個SYN是不是有效的,三次握手就很好的解決了這個問題,第三次握手就是客戶端給服務端回覆第二次握手,這也就是說服務端會等第三次握手的到來,如果第三次握手遲遲不來,服務端就可以識別這個SYN是無效的,就會將他的資源釋放了。還有一種情況就是第三次握手由於網絡中的種種原因失敗了,這時候客戶端認爲自己已經連接好了,就會給服務端發送數據,服務端由於沒有收到第三次握手,就會以RST包對客戶端響應,收到RST的的客戶端就知道第三次握手沒有成功,就會重新連接。在謝希仁著《計算機網絡》第四版中講“三次握手”的目的是“爲了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤”。
在這裏插入圖片描述
四次握手和兩次握手的情況一樣,五次握手和三次握手的情況一樣,以此類推,奇數次握手的情況與三次握手相同,同理偶數次握手與兩次握手一樣,所以爲了更快的連接,就使用三次握手最合適。

每次握手失敗對應的措施:

第一次握手失敗:

  如果第一次的SYN傳輸失敗,兩端都不會申請資源。如果一段時間後之前的SYN發送成功了,這時客戶端只會接收他最後發送的SYN的SYN+ACK迴應,其他的一概忽略,服務端也是如此,會將之前多申請的資源釋放了。

第二次握手失敗:

  如果服務端發送的SYN+ACK傳輸失敗,客戶端由於沒有收到這條響應,不會申請資源,雖然服務端申請了資源,但是遲遲收不到來自客戶端的ACK,也會將該資源釋放。

第三次握手失敗:

  如果第三次握手的ACK傳輸失敗,導致服務端遲遲沒有收到ACK,就會釋放資源,這時候客戶端認爲自己已經連接好了,就會給服務端發送數據,服務端由於沒有收到第三次握手,就會以RST包對客戶端響應。但是實際上服務端會因爲沒有收到客戶端的ACK多次發送SYN+ACK,次數是可以設置的,如果最後還是沒有收到客戶端的ACK,則釋放資源。

  這是我自己理解,有什麼不合適的地方,歡迎各位大佬批評指正。

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