目錄
什么是“三次握手” “四次揮手”?
三個標記位?
三次握手?
四次揮手?
為什么握手三次,揮手需要四次?
為什么要等2MSL?
什么是“三次握手” “四次揮手”?
三次握手(Three-way Handshake):其實就是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。進行三次握手的主要作用就是為了確認雙方的接收能力和發送能力是否正常、指定自己的初始化序列號為后面的可靠性傳送做準備。
四次揮手(Four-way handshake):TCP 連接的拆除需要發送四個包,因此稱為四次揮手。
三個標記位?
SYN(Synchronize):用于建立連接的初始握手。發送方發送一個SYN報文段給接收方,請求建立連接。
ACK(Acknowledgement):用于確認數據的傳輸。當成功接收到數據后,接收方發送一個帶有ACK標記的報文段回復發送方,確認已經收到了數據。?
FIN(Finish):用于關閉連接。當發送方發送完所有數據后,會發送一個帶有FIN標記的報文段,請求關閉連接。? 接收方在收到FIN報文段后,發送一個帶有ACK標記的報文段進行確認,并使用一個定時器在一段時間后關閉連接。
剛開始客戶端處于 Closed 的狀態,服務端處于 Listen 狀態。?
三次握手?
第一次握手:客戶端發送網絡包,服務端收到了。
這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。
第二次握手:服務端發包,客戶端收到了。
這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。不過此時服務器并不能確認客戶端的接收能力是否正常。
第三次握手:客戶端發包,服務端收到了。
這樣服務端就能得出結論:客戶端的接收、發送能力正常,服務器自己的發送、接收能力也正常。?
? ? ? ? ?到此,三次握手的過程就算結束了。最后,當服務器收到客戶端的 ACK 報文之后,也處于 ESTABLISHED 狀態。此時,連接就已經建立成功了。?
四次揮手?
第一次揮手:客戶端向服務器發送一個FIN(結束)請求,表示客戶端不再發送數據。此時客戶端處于FIN_WAIT_1狀態。
第二次揮手:服務器收到請求后,回復客戶端一個ACK響應確認,但這個響應可能還攜帶有未傳輸完的數據。此時服務器處于CLOSE_WAIT狀態。注意,在第三次揮手之前,數據還是可以從服務器傳送到客戶端的。
第三次揮手:服務器完成數據傳輸后,向客戶端發送一個FIN請求,表示服務器也沒有數據要發送了。此時服務器狀態變為LAST_ACK狀態。
第四次揮手:客戶端收到服務器的請求后,回復服務器一個ACK響應確認。此時客戶端處于TIME_WAIT狀態,需要經過一段時間確保服務器收到自己的應答報文后,才會進入CLOSED狀態。
?
? ? ? ? 到這里,四次揮手就已經結束了。最后,服務器收到ACK報文后,就關閉連接,也處于CLOSED狀態了。
為什么握手三次,揮手需要四次?
? ? ? ? 因為當握手時,服務端收到客戶端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當服務端收到FIN報文時,很可能并不會立即關閉,所以只能先回復一個ACK報文,告訴客戶端,“你發的FIN報文我收到了”。只有等到我服務端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。所以需要四次揮手。
為什么要等2MSL?
? ? ? ?為了保證客戶端發送的最后一個ACK報文段能夠到達服務器。因為這個ACK有可能丟失,從而導致處在LAST-ACK狀態的服務器收不到對FIN-ACK的確認報文。服務器會超時重傳這個FIN-ACK,接著客戶端再重傳一次確認,重新啟動時間等待計時器。最后客戶端和服務器都能正常的關閉。假設客戶端不等待2MSL,而是在發送完ACK之后直接釋放關閉,一但這個ACK丟失的話,服務器就無法正常的進入關閉連接狀態。