tcp爲什麼需要3次握手4次揮手

一、起因

   在網絡請求中,爲了提升性能,通常會採用長連接的方式避免在每一次交互都進行網絡鏈接的創建和關閉,而長連接就是tpc的鏈接方式。因而有必要對tcp的創建鏈接和關閉有所瞭解。在網絡上查詢了一些知識,加以理解,整理成了如下的總結,然後給組裝到自己的認識體系中。

 

二、創建鏈接三次握手

    tpc創建鏈接需要三次握手:

         1)client 發送鏈接請求到server

         2)server發送響應請求給到client

         3)client再次發送響應請求給到server端

     三次握手之前是知道,但爲什麼要用三次握手,而不是兩次、四次呢?

     現在能查到的解釋是有兩種:1)爲了避免已失效的鏈接再次到達服務端而引起的錯誤,2)是網絡中存在延遲的網絡分組。這兩個解釋對應的事同樣的。

     要解決的問題是:client向server發送了一個創建鏈接的請求,但由於網絡原因,在達到客戶端的超時時間後還沒有收到server端的響應,客戶端就重發一次建鏈請求,這次順利的創建鏈接,然後開始進行數據傳輸,然後關閉鏈接。當關閉鏈接後,client第一次發送的建鏈請求才到達server,如果按照兩次握手,server任務鏈接創建成功,而client發現server的響應請求超出了時間,直接進行丟棄,也不向server發送通知請求。而server還在等待客戶端發送數據,這樣就會造成server資源浪費。

      三次握手和我們去飯店點餐有些類似:1)食客先選擇菜品 2)服務員查看點餐單,然後再向食客重複一遍 3)食客確定,然後服務員會把菜品報給廚房開始烹製。如果是兩次握手,那就有可能出現食客說這個菜品我們沒有點啊或者是我們點了那個菜品怎麼沒有上啊。。

     另外,二次握手可能會存在死鎖問題:client向server發送建鏈請求,server然後向clent發送確認請求,然後server向client發送數據。當由於網絡原因或client的問題,導致client未能獲取到server發送的響應請求,就會一直等待server發送確認響應,但此時server確一直在發送數據,而不再發送確認響應,導致死鎖問題。

      上述的解釋存在幾個前提:

      1)client在創建網絡連接時,如果server在規定時間內沒有響應,將會從自己的存儲中移除該次的創建網絡請求數據

      2)client只有在接收到server發出響應請求,驗證通過後,才接受server發出的數據

 

三、關閉鏈接四次握手

 

  tcp關閉鏈接四次握手原因在於tpc鏈接是全雙工通道,需要雙向關閉。

  client向server發送關閉請求,表示client不再發送數據,server響應。此時server端仍然可以向client發送數據,待server端發送數據結束後,就向client發送關閉請求,然後client確認。

  類似的例子是面試,面試本身是一個雙向溝通的過程,也即全雙工。面試官吧啦吧啦向面試人員問了一堆問題,問完了告訴面試人員我沒有問題了,面試人員確認。但這個時候面試人員還是可以向面試官問問題了,等面試人員也問完了,向面試官說:我也沒有問題了,面試官說:好的,我們就到此爲止,後續有hr同學聯繫你,這次的面試結束。

 

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