?本節(jié),瑞哥繼續(xù)帶您圖解網(wǎng)絡(luò),探究一下TCP四次揮手?jǐn)嚅_連接背后的原理。

讓我們直接開始!


【資料圖】

TCP三次握手簡單回顧

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

首先客戶端將發(fā)送一個SYN消息(SYNchronize 的縮寫)表示客戶端要建立與服務(wù)端的連接。服務(wù)端收到客戶端的SYN報文后,回復(fù)SYN-ACK報文,包括一個SYN序列號和一個ACK號??蛻舳耸盏椒?wù)端的 SYN-ACK 消息后,向服務(wù)端發(fā)送ACK消息。

TCP三次握手簡單過程

TCP四次揮手生活中的例子

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

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

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

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

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

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

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

然后小明的微信上就會出現(xiàn)大大的紅感嘆號!

微信拉黑

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

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

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

四次揮手原理分析

四次揮手過程

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

客戶端會發(fā)送一個 FIN 消息,F(xiàn)IN是FINISH的縮寫,F(xiàn)IN 消息的目的是使 TCP 能夠優(yōu)雅地終止已建立的連接,然后客戶端進(jìn)入稱為FIN-WAIT 狀態(tài)的狀態(tài),在 FIN-WAIT 狀態(tài)下,客戶端繼續(xù)接收來自服務(wù)端的消息,并繼續(xù)處理已經(jīng)在隊列中的消息,但客戶端不會發(fā)送任何額外的數(shù)據(jù)。

這個可以聯(lián)想,小美在發(fā)分手消息過程中,男朋友小明一直在發(fā)消息給小美,小美沒看的消息就進(jìn)入到了隊列,隊列中的消息,小美還是會看的,但是不會再主動回復(fù)這些消息。

服務(wù)端向客戶端發(fā)送ACK消息,確認(rèn)他已經(jīng)收到了結(jié)束的消息了,這個時候服務(wù)端將不再接受來自客戶端的數(shù)據(jù)。服務(wù)端可以繼續(xù)向客戶端發(fā)送數(shù)據(jù)(最后交代點(diǎn)事情),如果服務(wù)端沒有更多數(shù)據(jù)要發(fā)送,它也會通過發(fā)送 FIN 消息來終止連接。然后客戶端向服務(wù)端發(fā)送ACK確認(rèn)收到了服務(wù)端主動斷開的消息。

至此,TCP連接斷開!

TCP四次揮手——帶序列號

如圖,M和N都是序列號,分別代表是客戶端和服務(wù)端,也是為了區(qū)別服務(wù)端和客戶端的,比如看到M就想到消息是來自于客戶端,看到N就想到消息來自于服務(wù)端。

所以過程又變成:

客戶端向服務(wù)端發(fā)送FIN M給服務(wù)端。服務(wù)端向客戶端發(fā)送ACK M+1,客戶端收到M+1,就知道服務(wù)端收到了自己的Finish消息。服務(wù)端向客戶端發(fā)送FIN N代表是服務(wù)端主動向客戶端發(fā)送結(jié)束消息。客戶端向服務(wù)端回復(fù)ACK N+1消息,服務(wù)端看到是自己的N,所以就知道客戶端也收到了自己的結(jié)束消息了。

至此TCP就成功斷開連接了。

斷開連接的最大生命周期

這里還是舉個例子,小美在發(fā)完“那就這樣了,互刪微信吧,再見!”的消息后,會最多等待四分鐘,給小明機(jī)會去挽留:

等待四分鐘

假如在這四分鐘內(nèi),小明沒有挽留,那不好意思,徹底結(jié)束吧!Game Over!

在【四次揮手原理分析】圖中,我們注意到了TIME_WAIT狀態(tài),客戶端發(fā)送最后一個 ACK段后,連接不會立即終止,由于不能保證最后發(fā)送的數(shù)據(jù)包確實(shí)已經(jīng)到達(dá),客戶端或服務(wù)器最初將保持時間等待狀態(tài),直到 ACK 段和任何新 FIN 段的最大生命周期(MSL,Maximum Segment Lifetime )才能徹底進(jìn)入CLOSED狀態(tài)。

這種機(jī)制主要出于兩種考慮:

防止使用相同源地址、源端口、目的地址和目的端口的其他 TCP 連接接收到延遲的數(shù)據(jù)段。保證TCP連接被遠(yuǎn)程正確關(guān)閉,即等待被動關(guān)閉連接的一方收到ACK對應(yīng)的消息。

標(biāo)簽: