TCP的三次握手和四次揮手

1 三次握手

TCP是面向連接的束凑,無論哪一方向另一方發(fā)送數(shù)據(jù)之前晒旅,都必須在雙方之間建立一個(gè)連接。

在TCP/IP協(xié)議中汪诉,TCP協(xié)議提供可靠的連接服務(wù)废恋,連接是通過三次握手進(jìn)行初始化的。三次握手的目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào)扒寄,并交換TCP窗口大小信息鱼鼓。

image.png

名詞解釋:

SYN:synchronous 同步。SYN是6個(gè)控制位中的一個(gè)该编,值為1時(shí)表示當(dāng)前報(bào)文段的作用是同步序號(hào)迄本。

seq:Sequence Number 序號(hào)。第一個(gè)字節(jié)的編號(hào)课竣,在“TCP報(bào)文結(jié)構(gòu)“中有介紹嘉赎。

ACK:Acknowledgement 確認(rèn)字符。ACK是6個(gè)控制位中的一個(gè)于樟,值為1時(shí)表示前一個(gè)報(bào)文段已確認(rèn)收到公条。

ack:小寫的ack表示確認(rèn)號(hào)。即接收方期望接收的下一個(gè)字節(jié)的編號(hào)迂曲。

第一次握手:

客戶端發(fā)送SYN報(bào)文段靶橱,將SYN位置為1,seq為X(X為一個(gè)隨機(jī)數(shù))路捧;然后客戶端進(jìn)入SYN_SEND狀態(tài)关霸,等待服務(wù)器的確認(rèn)。

注意:這個(gè)報(bào)文段中不包括確認(rèn)號(hào)杰扫,也沒有定義窗口大小队寇。SYN報(bào)文段是一個(gè)控制報(bào)文段,它不攜帶任何數(shù)據(jù)章姓。但是它消耗了一個(gè)序號(hào)佳遣,當(dāng)數(shù)據(jù)傳送開始時(shí)炭序,序號(hào)就應(yīng)當(dāng)加1。

第二次握手:

服務(wù)器發(fā)送SYN+ACK報(bào)文段苍日,其中SYN和ACK這兩個(gè)控制位都置為1惭聂。

這個(gè)報(bào)文段有兩個(gè)目的:

  1. 服務(wù)器使用這個(gè)報(bào)文段來同步它的初始序號(hào)(seq),以便從服務(wù)器向客戶端發(fā)送字節(jié)相恃。

  2. 服務(wù)器通過ACK標(biāo)志告訴客戶端已經(jīng)收到來自客戶端的SYN報(bào)文段辜纲。同時(shí)設(shè)置ack表示希望從客戶端收到的下一個(gè)字節(jié)編號(hào),也因?yàn)樵O(shè)置了ack拦耐,服務(wù)器還定義了接收窗口的大小(rwnd)耕腾。

此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)。

注意:SYN+ACK報(bào)文段不攜帶任何數(shù)據(jù)杀糯,但要消耗一個(gè)序號(hào)扫俺。

第三次握手:

客戶端發(fā)送ACK報(bào)文段。

ACK標(biāo)志和確認(rèn)號(hào)(ack)用于告訴服務(wù)器已經(jīng)收到來自服務(wù)器的SYN+ACK報(bào)文段固翰。

序號(hào)(seq)和第一次握手的SYN報(bào)文段的序號(hào)一樣狼纬,也就是說這個(gè)ACK報(bào)文段不消耗任何序號(hào)。但在某些實(shí)現(xiàn)中骂际,連接階段的第三個(gè)報(bào)文段(ACK報(bào)文段)可以攜帶客戶端的第一個(gè)數(shù)據(jù)塊疗琉,此時(shí),第三個(gè)報(bào)文段必須有一個(gè)新的序號(hào)來表示數(shù)據(jù)中的第一個(gè)字節(jié)編號(hào)歉铝。結(jié)論就是:ACK報(bào)文段如果不攜帶數(shù)據(jù)就不消耗序號(hào)盈简。

此時(shí)客戶端和服務(wù)器都進(jìn)入了ESTABLISHED狀態(tài),完成TCP三次握手太示。(單詞解釋:establish:建立)

為什么要三次握手柠贤?

為了防止已經(jīng)失效的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)器,因而產(chǎn)生錯(cuò)誤类缤。

具體例子:

client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒有丟失臼勉,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server呀非。本來這是一個(gè)早已失效的報(bào)文段坚俗。但server收到此失效的連接請(qǐng)求報(bào)文段后镜盯,就誤認(rèn)為是client再次發(fā)出的一個(gè)新的連接請(qǐng)求岸裙。于是就向client發(fā)出確認(rèn)報(bào)文段,同意建立連接速缆。假設(shè)不采用“三次握手”降允,那么只要server發(fā)出確認(rèn),新的連接就建立了艺糜。由于現(xiàn)在client并沒有發(fā)出建立連接的請(qǐng)求剧董,因此不會(huì)理睬server的確認(rèn)幢尚,也不會(huì)向server發(fā)送數(shù)據(jù)。但server卻以為新的運(yùn)輸連接已經(jīng)建立翅楼,并一直等待client發(fā)來數(shù)據(jù)尉剩。這樣,server的很多資源就白白浪費(fèi)掉了毅臊。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生理茎。

2 四次揮手

客戶端和服務(wù)器通過三次握手建立了TCP連接,當(dāng)數(shù)據(jù)傳送完畢管嬉,需要斷開連接皂林,對(duì)于TCP的斷開連接,有“四次揮手過程”蚯撩。

image.png

第一次揮手:

主動(dòng)方(可以是客戶端或者服務(wù)器)础倍,設(shè)置seq=x,向被動(dòng)方發(fā)送一個(gè)FIN報(bào)文段(FIN報(bào)文段可以包含要發(fā)送的最后一塊數(shù)據(jù))胎挎;此時(shí)沟启,主動(dòng)方進(jìn)入FIN_WAIT_1狀態(tài);這表示主動(dòng)方已經(jīng)沒有數(shù)據(jù)要發(fā)送給被動(dòng)方了犹菇。

第二次揮手:

被動(dòng)方收到了主動(dòng)方的FIN報(bào)文段美浦,向主動(dòng)方回了一個(gè)ACK報(bào)文段,ack=x+1项栏;此時(shí)主動(dòng)方進(jìn)入FIN_WAIT_2狀態(tài)浦辨;這表示被動(dòng)方告訴主動(dòng)方,我“同意”你的關(guān)閉請(qǐng)求沼沈。

第三次揮手:

被動(dòng)方向主動(dòng)方發(fā)送FIN報(bào)文段流酬,請(qǐng)求關(guān)閉連接;此時(shí)被動(dòng)方進(jìn)入LAST_ACK狀態(tài)列另。

第四次揮手:

主動(dòng)方收到被動(dòng)方的FIN報(bào)文段芽腾,向被動(dòng)方發(fā)送ACK報(bào)文段,然后主動(dòng)方進(jìn)入TIME_WAIT狀態(tài)页衙;被動(dòng)方收到主動(dòng)方的ACK報(bào)文段后摊滔,就關(guān)閉連接;此時(shí)主動(dòng)方等待2MSL(MSL:Maximum Segment Lifetime店乐,報(bào)文段最大生存時(shí)間)后依然沒有收到回復(fù)艰躺,則證明被動(dòng)方已正常關(guān)閉,那么主動(dòng)方也可以關(guān)閉了眨八。

為什么要四次揮手腺兴?

TCP協(xié)議是一種面向連接的、可靠的廉侧、基于字節(jié)流的運(yùn)輸層通信協(xié)議页响。TCP是全雙工模式篓足,這就意味著,當(dāng)主機(jī)1發(fā)出FIN報(bào)文段時(shí)闰蚕,只是表示主機(jī)1已經(jīng)沒有數(shù)據(jù)要發(fā)送了栈拖,主機(jī)1告訴主機(jī)2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了没陡;但是辱魁,這個(gè)時(shí)候主機(jī)1還是可以接受來自主機(jī)2的數(shù)據(jù);當(dāng)主機(jī)2返回ACK報(bào)文段時(shí)诗鸭,表示它已經(jīng)知道主機(jī)1沒有數(shù)據(jù)發(fā)送了染簇,但是主機(jī)2還是可以發(fā)送數(shù)據(jù)到主機(jī)1的;當(dāng)主機(jī)2也發(fā)送了FIN報(bào)文段時(shí)强岸,這個(gè)時(shí)候就表示主機(jī)2也沒有數(shù)據(jù)要發(fā)送了锻弓,就會(huì)告訴主機(jī)1规揪,我也沒有數(shù)據(jù)要發(fā)送了竿滨,之后彼此就會(huì)愉快的中斷這次TCP連接。

為什么要等待2MSL辽旋?

原因有二:

  1. 保證TCP協(xié)議的全雙工連接能夠可靠的關(guān)閉

  2. 保證這次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失

第一點(diǎn):如果主機(jī)1直接CLOSED了妓盲,那么由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因杂拨,導(dǎo)致主機(jī)2沒有收到主機(jī)1最后回復(fù)的ACK。那么主機(jī)2就會(huì)在超時(shí)之后繼續(xù)發(fā)送FIN悯衬,此時(shí)由于主機(jī)1已經(jīng)CLOSED了弹沽,就找不到與重發(fā)的FIN對(duì)應(yīng)的連接。所以筋粗,主機(jī)1不是直接進(jìn)入CLOSED策橘,而是要保持TIME_WAIT狀態(tài)。當(dāng)再次收到FIN的時(shí)候娜亿,能夠保證對(duì)方收到ACK丽已,最后正確的關(guān)閉連接。

第二點(diǎn):如果主機(jī)1直接CLOSED买决,然后又再向主機(jī)2發(fā)起一個(gè)新連接沛婴,我們不能保證這個(gè)新連接與剛關(guān)閉的連接的端口號(hào)是不同的。也就是說有可能新連接和老連接的端口號(hào)是相同的督赤。一般來說不會(huì)發(fā)生什么問題嘁灯,但是還是有特殊情況出現(xiàn):假設(shè)新連接和已經(jīng)關(guān)閉的老連接端口號(hào)是一樣的,如果前一次連接的某些數(shù)據(jù)仍然滯留在網(wǎng)絡(luò)中(稱為L(zhǎng)ost Duplicate)够挂,這些延遲數(shù)據(jù)在建立新連接之后才到達(dá)主機(jī)2旁仿,由于新連接和老連接的端口號(hào)是一樣的藕夫,TCP協(xié)議就認(rèn)為那個(gè)延遲的數(shù)據(jù)是屬于新連接的孽糖,這樣就和真正的新連接的數(shù)據(jù)包發(fā)生混淆了枯冈。所以TCP連接要在TIME_WAIT狀態(tài)等待2倍MSL,保證本次連接的所有數(shù)據(jù)都從網(wǎng)絡(luò)中消失办悟。

以上內(nèi)容摘自:

https://github.com/LRH1993/android_interview/blob/master/computer-networks/tcpip.md

《TCP/IP協(xié)議族》第四版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尘奏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子病蛉,更是在濱河造成了極大的恐慌炫加,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺然,死亡現(xiàn)場(chǎng)離奇詭異俗孝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)魄健,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赋铝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沽瘦,你說我怎么就攤上這事革骨。” “怎么了析恋?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵良哲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我助隧,道長(zhǎng)筑凫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任并村,我火速辦了婚禮漏健,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橘霎。我一直安慰自己蔫浆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布姐叁。 她就那樣靜靜地躺著瓦盛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪外潜。 梳的紋絲不亂的頭發(fā)上原环,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音处窥,去河邊找鬼嘱吗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谒麦。 我是一名探鬼主播俄讹,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绕德!你這毒婦竟也來了患膛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤耻蛇,失蹤者是張志新(化名)和其女友劉穎踪蹬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臣咖,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跃捣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夺蛇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枝缔。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚊惯,靈堂內(nèi)的尸體忽然破棺而出愿卸,到底是詐尸還是另有隱情,我是刑警寧澤截型,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布趴荸,位于F島的核電站,受9級(jí)特大地震影響宦焦,放射性物質(zhì)發(fā)生泄漏发钝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一波闹、第九天 我趴在偏房一處隱蔽的房頂上張望酝豪。 院中可真熱鬧,春花似錦精堕、人聲如沸孵淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘫证。三九已至,卻和暖如春庄撮,著一層夾襖步出監(jiān)牢的瞬間背捌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工洞斯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毡庆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像么抗,于是被迫代替她去往敵國(guó)和親毅否。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • TCP報(bào)文格式 TCP提供一種面向連接的乖坠,可靠的字節(jié)流服務(wù)搀突。 TCP首部的數(shù)據(jù)格式如下刀闷。(如果不計(jì)任選字段熊泵,通常是...
    不變甄心閱讀 244評(píng)論 0 0
  • 前言: TCP協(xié)議是計(jì)算機(jī)的基礎(chǔ),他本身是一個(gè)非常非常復(fù)雜的協(xié)議甸昏。 本文只是蜻蜓點(diǎn)水顽分,將從網(wǎng)絡(luò)基礎(chǔ)以及TCP的相關(guān)...
    Janti閱讀 608評(píng)論 0 4
  • TCP協(xié)議介紹TCP(Transmission Control Protocol),是一個(gè)面向連接的協(xié)議施蜜,在運(yùn)用次...
    解憂太后閱讀 619評(píng)論 0 5
  • 最近在惡補(bǔ)計(jì)算機(jī)網(wǎng)絡(luò)方面的知識(shí)卒蘸,之前對(duì)于TCP的三次握手和四次分手也是模模糊糊,對(duì)于其中的細(xì)節(jié)更是渾然不知翻默,最近看...
    微醺歲月閱讀 9,531評(píng)論 4 128
  • 武志紅老師的心理學(xué)課程缸沃,關(guān)于課程安排:為什么在心理學(xué)課程的第一周,就來說“命運(yùn)”呢修械?其實(shí)包含了我們專欄的初衷趾牧,希望...
    芷榮說閱讀 313評(píng)論 0 0