為什么要“三次握手,四次揮手”


三次握手
換個易於理解的視角來看為什么要3次握手。
客戶端和服務端通信前要進行連接,“3次握手”的作用就是雙方都能明確自己和對方的收、發能力是正常的。

  • 第一次握手:客戶端發送網絡包,服務端收到了。這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。
  • 第二次握手:服務端發包,客戶端收到了。這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。 從客戶端的視角來看,我接到了服務端發送過來的響應數據包,說明服務端接收到了我在第一次握手時發送的網絡包,並且成功發送了響應數據包,這就說明,服務端的接收、發送能力正常。而另一方面,我收到了服務端的響應數據包,說明我第一次發送的網絡包成功到達服務端,這樣,我自己的發送和接收能力也是正常的。
  • 第三次握手:客戶端發包,服務端收到了。這樣服務端就能得出結論:客戶端的接收、發送能力,服務端的發送、接收能力是正常的。 第一、二次握手后,服務端並不知道客戶端的接收能力以及自己的發送能力是否正常。而在第三次握手時,服務端收到了客戶端對第二次握手作的回應。從服務端的角度,我在第二次握手時的響應數據發送出去了,客戶端接收到了。所以,我的發送能力是正常的。而客戶端的接收能力也是正常的。

經歷了上面的三次握手過程,客戶端和服務端都確認了自己的接收、發送能力是正常的。之后就可以正常通信了。
每次都是接收到數據包的一方可以得到一些結論,發送的一方其實沒有任何頭緒。我雖然有發包的動作,但是我怎么知道我有沒有發出去,而對方有沒有接收到呢?
而從上面的過程可以看到,最少是需要三次握手過程的。兩次達不到讓雙方都得出自己、對方的接收、發送能力都正常的結論。其實每次收到網絡包的一方至少是可以得到:對方的發送、我方的接收是正常的。而每一步都是有關聯的,下一次的“響應”是由於第一次的“請求”觸發,因此每次握手其實是可以得到額外的結論的。比如第三次握手時,服務端收到數據包,表明看服務端只能得到客戶端的發送能力、服務端的接收能力是正常的,但是結合第二次,說明服務端在第二次發送的響應包,客戶端接收到了,並且作出了響應,從而得到額外的結論:客戶端的接收、服務端的發送是正常的。
用表格總結一下:

四次揮手
TCP連接是雙向傳輸的對等的模式,就是說雙方都可以同時向對方發送或接收數據。當有一方要關閉連接時,會發送指令告知對方,我要關閉連接了。這時對方會回一個ACK,此時一個方向的連接關閉。但是另一個方向仍然可以繼續傳輸數據,等到發送完了所有的數據后,會發送一個FIN段來關閉此方向上的連接。接收方發送ACK確認關閉連接。注意,接收到FIN報文的一方只能回復一個ACK, 它是無法馬上返回對方一個FIN報文段的,因為結束數據傳輸的“指令”是上層應用層給出的,我只是一個“搬運工”,我無法了解“上層的意志”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM