圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

2022.07.25
圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

我們注意到了TIME_WAIT狀態,客戶端發送最後一個ACK段後,連接不會立即終止,由於不能保證最後發送的數據包確實已經到達,客戶端或服務器最初將保持時間等待狀態,直到ACK 段和任何新FIN 段的最大生命週期(MSL,Maximum Segment Lifetime )才能徹底進入CLOSED狀態。

​本節,瑞哥繼續帶您圖解網絡,探究一下TCP四次揮手斷開連接背後的原理。

讓我們直接開始!

TCP三次握手簡單回顧

TCP 是一種全雙工協議,為了建立連接,通過三次握手就能建立可靠的鏈路:

  • 首先客戶端將發送一個SYN消息(SYNchronize 的縮寫)表示客戶端要建立與服務端的連接。
  • 服務端收到客戶端的SYN報文後,回复SYN-ACK報文,包括一個SYN序列號和一個ACK號。
  • 客戶端收到服務端的SYN-ACK 消息後,向服務端發送ACK消息。

圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

TCP三次握手簡單過程

TCP四次揮手

生活中的例子

連接的兩端都可以終止TCP 連接,甚至單側終止也是可能的,這也稱為半開連接,即使一方已經斷開連接,另一方仍然可以傳輸數據。

我們說的四次揮手,指的是雙方斷開連接。

我們先以生活中例子來解釋一下:

圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

四次揮手-生活中的例子:分手

小美和小明是大學同學,剛上大學的時候,小明高大帥氣,還會打籃球,小美對他非常崇拜,小明也非常喜歡小美,就這樣,在一個夜黑風高的夜晚,他們成了情侶。

不過隨著時間的推移,加上環境的變化,兩個人漸漸失去了熱情,所以小美向小明提出了分手。分手的過程就類似於TCP四次揮手:

  • 第一次:小美對小明說“小明,相處那麼長時間了,我覺得我們不合適,分手吧”
  • 第二次:小明聽完其實沒有太吃驚,但是也不能直接答應啊,不然不就成了鐵打的渣男了嘛,所以第二次揮手,他禮貌的說了一下“別,我還有話和你說,其實你蠻好的,不僅人長得漂亮,性格也挺好的,也通情達理,學習也蠻刻苦的,非常開心在大學能夠遇到你!”
  • 第三次:小明嗶哩啪啦也講的差不多了,是時候露出真面目了,隨後他就對小美說“既然你想好了,我再糾纏你也沒意思,那就和平分手吧~”
  • 第四次:小美聽完小明一大堆虛偽的話,非常生氣,就甩了一句“那就這樣了,互刪微信吧,再見!”

然後小明的微信上就會出現大大的紅感嘆號!

圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

微信拉黑

這就是四次揮手,是不是很形象?

下次假如閣下忘了TCP四次揮手的步驟,我想你可以把自己當作渣男想像一下

好了,咱們言歸正傳,我們好好分析一下TCP四次揮手的原理。

四次揮手原理分析

圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

四次揮手過程

如圖,客戶端想要和服務端斷開連接:

  • 客户端会发送一个 FIN 消息,FIN是FINISH的缩写,FIN 消息的目的是使 TCP 能够优雅地终止已建立的连接,然后客户端进入称为FIN-WAIT 状态的状态,在 FIN-WAIT 状态下,客户端继续接收来自服务端的消息,并继续处理已经在队列中的消息,但客户端不会发送任何额外的数据。

这个可以联想,小美在发分手消息过程中,男朋友小明一直在发消息给小美,小美没看的消息就进入到了队列,队列中的消息,小美还是会看的,但是不会再主动回复这些消息。

  • 服务端向客户端发送ACK消息,确认他已经收到了结束的消息了,这个时候服务端将不再接受来自客户端的数据。
  • 服务端可以继续向客户端发送数据(最后交代点事情),如果服务端没有更多数据要发送,它也会通过发送 FIN 消息来终止连接。
  • 然后客户端向服务端发送ACK确认收到了服务端主动断开的消息。

至此,TCP连接断开!

圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

TCP四次挥手——带序列号

如图,M和N都是序列号,分别代表是客户端和服务端,也是为了区别服务端和客户端的,比如看到M就想到消息是来自于客户端,看到N就想到消息来自于服务端。

所以过程又变成:

  • 客户端向服务端发送FIN M给服务端。
  • 服务端向客户端发送 ACK M+1,客户端收到M+1,就知道服务端收到了自己的Finish消息。
  • 服务端向客户端发送FIN N代表是服务端主动向客户端发送结束消息。
  • 客户端向服务端回复ACK N+1消息,服务端看到是自己的N,所以就知道客户端也收到了自己的结束消息了。

至此TCP就成功断开连接了。

断开连接的最大生命周期

这里还是举个例子,小美在发完“那就这样了,互删微信吧,再见!”的消息后,会最多等待四分钟,给小明机会去挽留:

圖解網絡:揭開TCP四次揮手背後的原理,結合男女朋友分手的例子

等待四分钟

假如在这四分钟内,小明没有挽留,那不好意思,彻底结束吧!Game Over!

在【四次挥手原理分析】图中,我们注意到了TIME_WAIT状态,客户端发送最后一个 ACK段后,连接不会立即终止,由于不能保证最后发送的数据包确实已经到达,客户端或服务器最初将保持时间等待状态,直到 ACK 段和任何新 FIN 段的最大生命周期(MSL,Maximum Segment Lifetime )才能彻底进入CLOSED状态。

这种机制主要出于两种考虑:

  • 防止使用相同源地址、源端口、目的地址和目的端口的其他 TCP 连接接收到延迟的数据段。
  • 保证TCP连接被远程正确关闭,即等待被动关闭连接的一方收到ACK对应的消息。