TCP之三次握手與四次揮手

三次握手

三次握手的過程是爲了確認雙方的接收與發送能力是否正常。

1、第一次握手:客戶端給服務器發送一個 SYN 報文,這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。

2、第二次握手:服務器收到 SYN 報文之後,會應答一個 SYN+ACK 報文,這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器並不能確認客戶端的接收能力是否正常。

3、第三次握手:客戶端收到 SYN+ACK 報文之後,會迴應一個 ACK 報文,這樣服務端就能得出結論:客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。

4、服務器收到 ACK 報文之後,三次握手建立完成。

具體過程:

當客戶端發出第一個連接請求報文段時並沒有丟失,而是在某個網絡節點出現了長時間的滯留,以至於延誤了連接請求在某個時間之後纔到達服務器。這應該是一個早已失效的報文段。但是服務器在收到此失效的連接請求報文段後,以爲是客戶端的一個新請求,於是就想客戶端發出了確認報文段,同意建立連接。假設不採用三次握手,那麼只要服務器發出確認後,新的連接就可以建立了。但是由於客戶端沒有發出建立連接的請求,因此不會管服務器的確認,也不會向服務器發送數據,但服務器卻以爲新的運輸連接已經建立,一直在等待,所以,服務器的資源就白白浪費掉了。

 

四次揮手

tcp是全雙工通信,服務端和客服端都能發送和接收數據。

tcp在斷開連接時,需要服務端和客服端都確定對方將不再發送數據。

  • 第1次揮手由客戶端向服務端發起,服務端收到信息後就能確定客戶端已經停止發送數據。
  • 第2次揮手由服務端向客戶端發起,客戶端收到消息後就能確定服務端已經知道客戶端不會再發送數據。
  • 第3次握手由服務端向客戶端發起,客戶端收到消息後就能確定服務端已經停止發送數據。
  • 第4次揮手由客戶端向服務端發起,服務端收到信息後就能確定客戶端已經知道服務端不會再發送數據。

爲什麼需要四次揮手?而三次卻不可以

主要是爲了確認客戶端和服務器端都已經關閉了,避免出現以下兩種情況(此處暫時忽略超時機制)

1)客戶端不知道服務器端已經關閉,還在繼續發送消息,浪費網絡資源。

2)服務器端不知道客戶端已經關閉,還在等着客戶端發來的消息,浪費服務器資源。

爲什麼2、3次揮手不能合在一次揮手中?

因爲TCP是一個全雙工協議,必須單獨拆除每一條信道。4次揮手的目的是終止數據傳輸,並回收資源,在客服端第1次揮手時,服務端可能還在發送數據。所以第2次揮手和第3次揮手不能合併。

此時客服端雖然不再發送數據了,但是還可以接收數據,服務端可能還有數據要發送給A,所以兩次揮手不能合併爲一次。揮手次數比握手多一次,是因爲握手過程,通信只需要處理連接。而揮手過程,通信需要處理數據+連接

文章參考自:

https://www.jianshu.com/p/7ddb0e7867ac

https://www.toutiao.com/i6688291520291799564/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1591503831&app=news_article&utm_source=weixin&utm_medium=toutiao_android&use_new_style=0&req_id=2020060712235001013109907710D616FD&group_id=6688291520291799564

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