圖解TCP:三次握手祷安,四次揮手

什么是“三次握手姥芥,四次揮手”?

TCP 是一種面向連接的單播協(xié)議汇鞭,在發(fā)送數(shù)據(jù)前凉唐,通信雙方必須在彼此間建立一條連接。

所謂的“連接”霍骄,其實(shí)是客戶(hù)端和服務(wù)器的內(nèi)存里保存的一份關(guān)于對(duì)方的信息台囱,如 IP 地址、端口號(hào)等读整。

TCP 可以看成是一種字節(jié)流簿训,它會(huì)處理 IP 層或以下的層的丟包、重復(fù)以及錯(cuò)誤問(wèn)題米间。

在連接的建立過(guò)程中强品,雙方需要交換一些連接的參數(shù)。這些參數(shù)可以放在 TCP 頭部屈糊。

TCP 提供了一種可靠的榛、面向連接、字節(jié)流逻锐、傳輸層的服務(wù):

  • 采用三次握手建立一個(gè)連接夫晌;
  • 采用四次揮手來(lái)關(guān)閉一個(gè)連接。

TCP運(yùn)輸連接的三個(gè)階段:

  • 連接建立昧诱。
  • 數(shù)據(jù)傳送晓淀。
  • 連接釋放。

三次握手

三次握手就好比兩個(gè)人在街上隔著50米看見(jiàn)了對(duì)方盏档,但是因?yàn)殪F霾等原因不能100%確認(rèn)要糊,所以要通過(guò)招手的方式相互確定對(duì)方是否認(rèn)識(shí)自己。

張三首先向李四招手(syn)妆丘,李四看到張三向自己招手后锄俄,向?qū)Ψ近c(diǎn)了點(diǎn)頭擠出了一個(gè)微笑(ack)。

張三看到李四微笑后確認(rèn)了李四成功辨認(rèn)出了自己(進(jìn)入estalished狀態(tài))勺拣。

但是李四還有點(diǎn)狐疑奶赠,向四周看了一看,有沒(méi)有可能張三是在看別人呢药有,他也需要確認(rèn)一下毅戈。

所以李四也向張三招了招手(syn)苹丸,張三看到李四向自己招手后知道對(duì)方是在尋求自己的確認(rèn),于是也點(diǎn)了點(diǎn)頭擠出了微笑(ack)苇经,李四看到對(duì)方的微笑后確認(rèn)了張三就是在向自己打招呼(進(jìn)入established狀態(tài))赘理。

于是兩人加快步伐,走到了一起扇单,相互擁抱商模。

我們看到這個(gè)過(guò)程中一共是四個(gè)動(dòng)作:張三招手--李四點(diǎn)頭微笑--李四招手--張三點(diǎn)頭微笑。其中李四連續(xù)進(jìn)行了2個(gè)動(dòng)作蜘澜,先是點(diǎn)頭微笑(回復(fù)對(duì)方)施流,然后再次招手(尋求確認(rèn)),實(shí)際上可以將這兩個(gè)動(dòng)作合一鄙信,招手的同時(shí)點(diǎn)頭和微笑(syn+ack)瞪醋。于是四個(gè)動(dòng)作就簡(jiǎn)化成了三個(gè)動(dòng)作,張三招手--李四點(diǎn)頭微笑并招手--張三點(diǎn)頭微笑装诡。這就是三次握手的本質(zhì)银受,中間的一次動(dòng)作是兩個(gè)動(dòng)作的合并。

我們看到有兩個(gè)中間狀態(tài)鸦采,syn_sent和syn_rcvd宾巍,這兩個(gè)狀態(tài)叫著「半打開(kāi)」?fàn)顟B(tài),就是向?qū)Ψ秸惺至死涤伲沁€沒(méi)來(lái)得及看到對(duì)方的點(diǎn)頭微笑蜀漆。syn_sent是主動(dòng)打開(kāi)方的「半打開(kāi)」?fàn)顟B(tài)谅河,syn_rcvd是被動(dòng)打開(kāi)方的「半打開(kāi)」?fàn)顟B(tài)咱旱。客戶(hù)端是主動(dòng)打開(kāi)方绷耍,服務(wù)器是被動(dòng)打開(kāi)方吐限。

數(shù)據(jù)傳輸

TCP 數(shù)據(jù)傳輸就是兩個(gè)人隔空對(duì)話(huà),差了一點(diǎn)距離褂始,所以需要對(duì)方反復(fù)確認(rèn)聽(tīng)見(jiàn)了自己的話(huà)诸典。

張三喊了一句話(huà)(data),李四聽(tīng)見(jiàn)了之后要向張三回復(fù)自己聽(tīng)見(jiàn)了(ack)崎苗。

如果張三喊了一句狐粱,半天沒(méi)聽(tīng)到李四回復(fù),張三就認(rèn)為自己的話(huà)被大風(fēng)吹走了胆数,李四沒(méi)聽(tīng)見(jiàn)肌蜻,所以需要重新喊話(huà),這就是tcp重傳必尼。

也有可能是李四聽(tīng)到了張三的話(huà)蒋搜,但是李四向張三的回復(fù)被大風(fēng)吹走了篡撵,以至于張三沒(méi)聽(tīng)見(jiàn)李四的回復(fù)。張三并不能判斷究竟是自己的話(huà)被大風(fēng)吹走了還是李四的回復(fù)被大風(fēng)吹走了豆挽,張三也不用管育谬,重傳一下就是。

既然會(huì)重傳帮哈,李四就有可能同一句話(huà)聽(tīng)見(jiàn)了兩次膛檀,這就是「去重」〉「重傳」和「去重」工作操作系統(tǒng)的網(wǎng)絡(luò)內(nèi)核模塊都已經(jīng)幫我們處理好了宿刮,用戶(hù)層是不用關(guān)心的。

張三可以向李四喊話(huà)私蕾,同樣李四也可以向張三喊話(huà)僵缺,因?yàn)閠cp鏈接是「雙工的」,雙方都可以主動(dòng)發(fā)起數(shù)據(jù)傳輸踩叭。不過(guò)無(wú)論是哪方喊話(huà)磕潮,都需要收到對(duì)方的確認(rèn)才能認(rèn)為對(duì)方收到了自己的喊話(huà)。

張三可能是個(gè)高射炮容贝,一說(shuō)連說(shuō)了八句話(huà)自脯,這時(shí)候李四可以不用一句一句回復(fù),而是連續(xù)聽(tīng)了這八句話(huà)之后斤富,一起向?qū)Ψ交貜?fù)說(shuō)前面你說(shuō)的八句話(huà)我都聽(tīng)見(jiàn)了膏潮,這就是批量ack。但是張三也不能一次性說(shuō)了太多話(huà)满力,李四的腦子短時(shí)間可能無(wú)法消化太多焕参,兩人之間需要有協(xié)商好的合適的發(fā)送和接受速率,這個(gè)就是「TCP窗口大小」油额。

網(wǎng)絡(luò)環(huán)境的數(shù)據(jù)交互同人類(lèi)之間的對(duì)話(huà)還要復(fù)雜一些叠纷,它存在數(shù)據(jù)包亂序的現(xiàn)象。同一個(gè)來(lái)源發(fā)出來(lái)的不同數(shù)據(jù)包在「網(wǎng)際路由」上可能會(huì)走過(guò)不同的路徑潦嘶,最終達(dá)到同一個(gè)地方時(shí)涩嚣,順序就不一樣了。操作系統(tǒng)的網(wǎng)絡(luò)內(nèi)核模塊會(huì)負(fù)責(zé)對(duì)數(shù)據(jù)包進(jìn)行排序掂僵,到用戶(hù)層時(shí)順序就已經(jīng)完全一致了航厚。

四次揮手

TCP斷開(kāi)鏈接的過(guò)程和建立鏈接的過(guò)程比較類(lèi)似,只不過(guò)中間的兩部并不總是會(huì)合成一步走锰蓬,所以它分成了4個(gè)動(dòng)作幔睬,張三揮手(fin)——李四傷感地微笑(ack)——李四揮手(fin)——張三傷感地微笑(ack)。

之所以中間的兩個(gè)動(dòng)作沒(méi)有合并互妓,是因?yàn)閠cp存在「半關(guān)閉」?fàn)顟B(tài)溪窒,也就是單向關(guān)閉坤塞。張三已經(jīng)揮了手,可是人還沒(méi)有走澈蚌,只是不再說(shuō)話(huà)摹芙,但是耳朵還是可以繼續(xù)聽(tīng),李四呢繼續(xù)喊話(huà)宛瞄。等待李四累了浮禾,也不再說(shuō)話(huà)了,超張三揮了揮手份汗,張三傷感地微笑了一下盈电,才徹底結(jié)束了。

上面有一個(gè)非常特殊的狀態(tài)time_wait杯活,它是主動(dòng)關(guān)閉的一方在回復(fù)完對(duì)方的揮手后進(jìn)入的一個(gè)長(zhǎng)期狀態(tài)匆帚,這個(gè)狀態(tài)標(biāo)準(zhǔn)的持續(xù)時(shí)間是4分鐘,4分鐘后才會(huì)進(jìn)入到closed狀態(tài)旁钧,釋放套接字資源吸重。不過(guò)在具體實(shí)現(xiàn)上這個(gè)時(shí)間是可以調(diào)整的。

它就好比主動(dòng)分手方要承擔(dān)的責(zé)任歪今,是你提出的要分手嚎幸,你得付出代價(jià)。這個(gè)后果就是持續(xù)4分鐘的time_wait狀態(tài)寄猩,不能釋放套接字資源(端口)嫉晶,就好比守寡期,這段時(shí)間內(nèi)套接字資源(端口)不得回收利用田篇。

它的作用是重傳最后一個(gè)ack報(bào)文替废,確保對(duì)方可以收到。因?yàn)槿绻麑?duì)方?jīng)]有收到ack的話(huà)斯辰,會(huì)重傳fin報(bào)文舶担,處于time_wait狀態(tài)的套接字會(huì)立即向?qū)Ψ街匕l(fā)ack報(bào)文坡疼。

同時(shí)在這段時(shí)間內(nèi)彬呻,該鏈接在對(duì)話(huà)期間于網(wǎng)際路由上產(chǎn)生的殘留報(bào)文(因?yàn)槁窂竭^(guò)于崎嶇,數(shù)據(jù)報(bào)文走的時(shí)間太長(zhǎng)柄瑰,重傳的報(bào)文都收到了闸氮,原始報(bào)文還在路上)傳過(guò)來(lái)時(shí),都會(huì)被立即丟棄掉教沾。4分鐘的時(shí)間足以使得這些殘留報(bào)文徹底消逝蒲跨。不然當(dāng)新的端口被重復(fù)利用時(shí),這些殘留報(bào)文可能會(huì)干擾新的鏈接授翻。

4分鐘就是2個(gè)MSL或悲,每個(gè)MSL是2分鐘孙咪。MSL就是maximium segment lifetime——最長(zhǎng)報(bào)文壽命。這個(gè)時(shí)間是由官方RFC協(xié)議規(guī)定的巡语。至于為什么是2個(gè)MSL而不是1個(gè)MSL翎蹈,我還沒(méi)有看到一個(gè)非常滿(mǎn)意的解釋。

四次揮手也并不總是四次揮手男公,中間的兩個(gè)動(dòng)作有時(shí)候是可以合并一起進(jìn)行的荤堪,這個(gè)時(shí)候就成了三次揮手,主動(dòng)關(guān)閉方就會(huì)從fin_wait_1狀態(tài)直接進(jìn)入到time_wait狀態(tài)枢赔,跳過(guò)了fin_wait_2狀態(tài)澄阳。

為什么要“三次握手,四次揮手”踏拜?

三次握手

客戶(hù)端和服務(wù)端通信前要進(jìn)行連接碎赢,三次握手的作用就是雙方都能明確自己和對(duì)方的收、發(fā)能力是正常的:

第一次握手:客戶(hù)端發(fā)送網(wǎng)絡(luò)包速梗,服務(wù)端收到了揩抡。這樣服務(wù)端就能得出結(jié)論:客戶(hù)端的發(fā)送能力、服務(wù)端的接收能力是正常的镀琉。

第二次握手:服務(wù)端發(fā)包峦嗤,客戶(hù)端收到了。這樣客戶(hù)端就能得出結(jié)論:服務(wù)端的接收屋摔、發(fā)送能力烁设,客戶(hù)端的接收、發(fā)送能力是正常的钓试。

從客戶(hù)端的視角來(lái)看装黑,我接到了服務(wù)端發(fā)送過(guò)來(lái)的響應(yīng)數(shù)據(jù)包,說(shuō)明服務(wù)端接收到了我在第一次握手時(shí)發(fā)送的網(wǎng)絡(luò)包弓熏,并且成功發(fā)送了響應(yīng)數(shù)據(jù)包恋谭,這就說(shuō)明,服務(wù)端的接收挽鞠、發(fā)送能力正常疚颊。

而另一方面,我收到了服務(wù)端的響應(yīng)數(shù)據(jù)包信认,說(shuō)明我第一次發(fā)送的網(wǎng)絡(luò)包成功到達(dá)服務(wù)端材义,這樣,我自己的發(fā)送和接收能力也是正常的嫁赏。

第三次握手:客戶(hù)端發(fā)包其掂,服務(wù)端收到了。這樣服務(wù)端就能得出結(jié)論:客戶(hù)端的接收潦蝇、發(fā)送能力款熬,服務(wù)端的發(fā)送深寥、接收能力是正常的。

第一贤牛、二次握手后翩迈,服務(wù)端并不知道客戶(hù)端的接收能力以及自己的發(fā)送能力是否正常。

而在第三次握手時(shí)盔夜,服務(wù)端收到了客戶(hù)端對(duì)第二次握手作的回應(yīng)负饲。從服務(wù)端的角度,我在第二次握手時(shí)的響應(yīng)數(shù)據(jù)發(fā)送出去了喂链,客戶(hù)端接收到了返十。所以,我的發(fā)送能力是正常的椭微。而客戶(hù)端的接收能力也是正常的洞坑。

經(jīng)歷了上面的三次握手過(guò)程,客戶(hù)端和服務(wù)端都確認(rèn)了自己的接收蝇率、發(fā)送能力是正常的迟杂。

之后就可以正常通信了。

四次揮手

TCP 連接是雙向傳輸?shù)膶?duì)等的模式本慕,就是說(shuō)雙方都可以同時(shí)向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)排拷。

當(dāng)有一方要關(guān)閉連接時(shí),會(huì)發(fā)送指令告知對(duì)方锅尘,我要關(guān)閉連接了监氢。這時(shí)對(duì)方會(huì)回一個(gè) ACK,此時(shí)一個(gè)方向的連接關(guān)閉藤违。

但是另一個(gè)方向仍然可以繼續(xù)傳輸數(shù)據(jù)浪腐,等到發(fā)送完了所有的數(shù)據(jù)后,會(huì)發(fā)送一個(gè) FIN 段來(lái)關(guān)閉此方向上的連接顿乒。接收方發(fā)送 ACK 確認(rèn)關(guān)閉連接议街。

注意,接收到 FIN 報(bào)文的一方只能回復(fù)一個(gè) ACK, 它是無(wú)法馬上返回對(duì)方一個(gè) FIN 報(bào)文段的璧榄,因?yàn)榻Y(jié)束數(shù)據(jù)傳輸?shù)摹爸噶睢笔巧蠈討?yīng)用層給出的特漩,我只是一個(gè)“搬運(yùn)工”,我無(wú)法了解“上層的意志”犹菱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拾稳,一起剝皮案震驚了整個(gè)濱河市吮炕,隨后出現(xiàn)的幾起案子腊脱,更是在濱河造成了極大的恐慌,老刑警劉巖龙亲,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陕凹,死亡現(xiàn)場(chǎng)離奇詭異悍抑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)杜耙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)搜骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人佑女,你說(shuō)我怎么就攤上這事记靡。” “怎么了团驱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵摸吠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嚎花,道長(zhǎng)寸痢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任紊选,我火速辦了婚禮啼止,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兵罢。我一直安慰自己献烦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布卖词。 她就那樣靜靜地躺著仿荆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坏平。 梳的紋絲不亂的頭發(fā)上拢操,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音舶替,去河邊找鬼令境。 笑死,一個(gè)胖子當(dāng)著我的面吹牛顾瞪,可吹牛的內(nèi)容都是我干的舔庶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陈醒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惕橙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起钉跷,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弥鹦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體彬坏,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朦促,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栓始。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务冕。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幻赚,靈堂內(nèi)的尸體忽然破棺而出禀忆,到底是詐尸還是另有隱情,我是刑警寧澤落恼,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布油湖,位于F島的核電站,受9級(jí)特大地震影響领跛,放射性物質(zhì)發(fā)生泄漏乏德。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一吠昭、第九天 我趴在偏房一處隱蔽的房頂上張望喊括。 院中可真熱鬧,春花似錦矢棚、人聲如沸郑什。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蘑拯。三九已至,卻和暖如春兜粘,著一層夾襖步出監(jiān)牢的瞬間申窘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工孔轴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剃法,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓路鹰,卻偏偏與公主長(zhǎng)得像贷洲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晋柱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容