三次握手
三次握手的過程是爲了確認雙方的接收與發送能力是否正常。
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,所以兩次揮手不能合併爲一次。揮手次數比握手多一次,是因爲握手過程,通信只需要處理連接。而揮手過程,通信需要處理數據+連接。
文章參考自: