TCP/IP三次握手和四次揮手

一 首先我們看下TCP報(bào)文頭


image.png

說(shuō)明:
1 源端口號(hào)(16位):標(biāo)識(shí)發(fā)送端端口號(hào)
2 目的端口號(hào)(16位):標(biāo)識(shí)目的端口號(hào)
3 序列號(hào):表示發(fā)送數(shù)據(jù)的位置侦另,字段長(zhǎng)為32位尉共。每發(fā)送一次數(shù)據(jù)硫麻,就累加一次該數(shù)據(jù)字節(jié)數(shù)的大小
序列號(hào)并非從0開(kāi)始,而是由發(fā)送端生成一個(gè)隨機(jī)數(shù)發(fā)送給目標(biāo)機(jī)器,然后再將每轉(zhuǎn)發(fā)過(guò)去的字節(jié)數(shù)累加到初始值上表示數(shù)據(jù)的位置浇辜。
4 確認(rèn)應(yīng)答號(hào):表示下一次應(yīng)該收到的數(shù)據(jù)的序列號(hào)唾戚,字段長(zhǎng)為32字節(jié)。發(fā)送端收到這個(gè)確認(rèn)應(yīng)答以后可以認(rèn)為在這個(gè)序號(hào)以前的數(shù)據(jù)都已經(jīng)被正常接收熊镣。
PS:序號(hào)的優(yōu)點(diǎn)如下
(1)保證報(bào)文按序到達(dá)募书。
(2)保證可靠性。
(3)保證效率鬼吵。
(4)精準(zhǔn)的報(bào)告哪些報(bào)文已經(jīng)收到篮赢,哪些需要重傳
5 首部長(zhǎng)度:該字段長(zhǎng)度為4位,單位為4字節(jié)(32位)涣脚。TCP首部長(zhǎng)度不包括選項(xiàng)的話寥茫,是20個(gè)字節(jié),20/4=5妙同,5的二進(jìn)制序列:0101膝迎,報(bào)頭長(zhǎng)度也叫數(shù)據(jù)偏移,所以該字段可以設(shè)置為5芒涡,選項(xiàng)字段最大的是40字節(jié),所以赠群,TCP首部長(zhǎng)度為最大為20+40=60字節(jié)旱幼,該字段可以設(shè)置的最大長(zhǎng)度為60/4=15。
6 保留:該字段主要是為了以后擴(kuò)展時(shí)使用冬三,其長(zhǎng)度為4位缘缚。一般設(shè)置為0,即使收到的包在該字段不為0窝爪,此包也不會(huì)丟棄
7控制位:字段長(zhǎng)為6齐媒,每一位從左到右分別為:URG、ACK啃勉、PSH双妨、RST、SYN泣特、FIN挑随。當(dāng)對(duì)應(yīng)的值為1,表示有具體含義膏孟。
字段|含義
—|:—
URG|緊急指針是否有效拌汇。為1,表示某一位需要被優(yōu)先處理魁淳。
ACK|確認(rèn)號(hào)是否有效,一般置為1昆稿。
PSH|提示接收端應(yīng)用程序立即從TCP緩沖區(qū)把數(shù)據(jù)讀走息拜。
RST|對(duì)方要求重新建立連接,復(fù)位岛抄。
SYN|請(qǐng)求建立連接狈茉,并在其序列號(hào)的字段進(jìn)行序列號(hào)的初始值設(shè)定掸掸。建立連接扰付,設(shè)置為1.
FIN|希望斷開(kāi)連接。
8 窗口大杏疠骸:接收緩沖區(qū)的大小盐固,TCP不允許發(fā)送超過(guò)此處所示大小的數(shù)據(jù)
9 校驗(yàn)和:發(fā)送端填充,CRC校驗(yàn)志电,接收校驗(yàn)不通過(guò)蛔趴,則認(rèn)為數(shù)據(jù)有問(wèn)題。和UDP的區(qū)別是鱼蝉,UDP校驗(yàn)的是數(shù)據(jù)本身箫荡,TCP校驗(yàn)的不僅包含TCP首部,而且包含TCP數(shù)據(jù)部分吉挣。
我們?cè)谥刂v一下在三次握手和四次揮手中的用到序列號(hào)、確認(rèn)號(hào)及標(biāo)志位终吼。

  1. 序列號(hào)seq
    占4個(gè)字節(jié)氯哮,用來(lái)標(biāo)記數(shù)據(jù)段的順序,TCP把連接中發(fā)送的所有數(shù)據(jù)字節(jié)都編上一個(gè)序號(hào)姆打,第一個(gè)字節(jié)的編號(hào)由本地隨機(jī)產(chǎn)生肠虽,給字節(jié)編上序號(hào)后税课,就給每一個(gè)報(bào)文段指派一個(gè)序號(hào),序列號(hào)seq就是這個(gè)報(bào)文段中的第一個(gè)字節(jié)的數(shù)據(jù)編號(hào)垒玲。

  2. 確認(rèn)號(hào)ack
    占4個(gè)字節(jié)找颓,期待收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào),序列號(hào)表示報(bào)文段攜帶數(shù)據(jù)的第一個(gè)字節(jié)的編號(hào)佛析,而確認(rèn)號(hào)指的是期望接受到下一個(gè)字節(jié)的編號(hào)帘不,因此擋墻報(bào)文段最后一個(gè)字節(jié)的編號(hào)+1即是確認(rèn)號(hào)。

3. 確認(rèn)ACK

占1個(gè)比特位储狭,僅當(dāng)ACK=1捣郊,確認(rèn)號(hào)字段才有效呛牲。ACK=0,確認(rèn)號(hào)無(wú)效着茸。

  1. 同步SYN
    連接建立時(shí)用于同步序號(hào)。當(dāng)SYN=1猜绣,ACK=0表示:這是一個(gè)連接請(qǐng)求報(bào)文段敬特。若同意連接,則在響應(yīng)報(bào)文段中使用SYN=1辣之,ACK=1.因此皱炉,SYN=1表示這是一個(gè)連接請(qǐng)求,或連接接收?qǐng)?bào)文奏夫,SYN這個(gè)標(biāo)志位只有在TCP建立連接才會(huì)被置為1历筝,握手完成后SYN標(biāo)志位被置為0.

  2. 終止FIN
    用來(lái)釋放一個(gè)

6 TCP/IP 三次握手過(guò)程:


image.png

三次握手的過(guò)程
step1:第一次握手
建立連接時(shí)梳猪,客戶端發(fā)送SYN包到服務(wù)器蒸痹,其中包含客戶端的初始序號(hào)seq=x叠荠,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn)逃呼。(其中者娱,SYN=1,ACK=0推姻,表示這是一個(gè)TCP連接請(qǐng)求數(shù)據(jù)報(bào)文框沟;序號(hào)seq=x增炭,表明傳輸數(shù)據(jù)時(shí)的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)是x)隙姿。

step2:第二次握手
服務(wù)器收到請(qǐng)求后防症,必須確認(rèn)客戶的數(shù)據(jù)包。同時(shí)自己也發(fā)送一個(gè)SYN包饲嗽,即SYN+ACK包奈嘿,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)裙犹。(其中確認(rèn)報(bào)文段中,標(biāo)識(shí)位SYN=1袄膏,ACK=1掺冠,表示這是一個(gè)TCP連接響應(yīng)數(shù)據(jù)報(bào)文,并含服務(wù)端的初始序號(hào)seq(服務(wù)器)=y斥黑,以及服務(wù)器對(duì)客戶端初始序號(hào)的確認(rèn)號(hào)ack(服務(wù)器)=seq(客戶端)+1=x+1)眉厨。

step3:第三次握手
客戶端收到服務(wù)器的SYN+ACK包憾股,向服務(wù)器發(fā)送一個(gè)序列號(hào)(seq=x+1),確認(rèn)號(hào)為ack(客戶端)=y+1耻姥,此包發(fā)送完畢有咨,客戶端和服務(wù)器進(jìn)入ESTAB_LISHED(TCP連接成功)狀態(tài),完成三次握手婉商。

未連接隊(duì)列
在三次握手協(xié)議中,服務(wù)器維護(hù)一個(gè)未連接隊(duì)列盯捌,該隊(duì)列為每個(gè)客戶端的SYN包(syn=j)開(kāi)設(shè)一個(gè)條目蘑秽,該條目表明服務(wù)器已收到SYN包肠牲,并向客戶發(fā)出確認(rèn),正在等待客戶的確認(rèn)包時(shí)渡嚣,刪除該條目肥印,服務(wù)器進(jìn)入ESTAB_LISHED狀態(tài)

7 斷開(kāi)連接TCP/IP


image.png

step1:第一次揮手
首先深碱,客戶端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送种蘸,然后等待服務(wù)器的確認(rèn)竞膳。其中終止標(biāo)志位FIN=1坦辟,序列號(hào)seq=u章办。

step2:第二次揮手
服務(wù)器收到這個(gè)FIN,它發(fā)送一個(gè)ACK挪蹭,確認(rèn)ack為收到的序號(hào)加一休偶。

step3:第三次揮手
關(guān)閉服務(wù)器到客戶端的連接,發(fā)送一個(gè)FIN給客戶端词顾。

step4:第四次揮手
客戶端收到FIN后肉盹,并發(fā)回一個(gè)ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)seq設(shè)置為收到序號(hào)加一骤肛。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉窍蓝,而另一方執(zhí)行被動(dòng)關(guān)閉。

客戶端發(fā)送FIN后秕豫,進(jìn)入終止等待狀態(tài)混移,服務(wù)器收到客戶端連接釋放報(bào)文段后侮穿,就立即給客戶端發(fā)送確認(rèn),服務(wù)器就進(jìn)入CLOSE_WAIT狀態(tài)回铛,此時(shí)TCP服務(wù)器進(jìn)程就通知高層應(yīng)用進(jìn)程克锣,因而從客戶端到服務(wù)器的連接就釋放了袭祟。此時(shí)是“半關(guān)閉狀態(tài)”,即客戶端不可以發(fā)送給服務(wù)器您没,服務(wù)器可以發(fā)送給客戶端胆绊。
此時(shí),如果服務(wù)器沒(méi)有數(shù)據(jù)報(bào)發(fā)送給客戶端仆抵,其應(yīng)用程序就通知TCP釋放連接肢础,然后發(fā)送給客戶端連接釋放數(shù)據(jù)報(bào),并等待確認(rèn)剩盒】埽客戶端發(fā)送確認(rèn)后,進(jìn)入TIME_WAIT狀態(tài)跟匆,但是此時(shí)TCP連接還沒(méi)有釋放玛臂,然后經(jīng)過(guò)等待計(jì)時(shí)器設(shè)置的2MSL后封孙,才進(jìn)入到CLOSED狀態(tài)。

2.為什么需要2MSL時(shí)間泡徙?
首先堪藐,MSL即Maximum Segment Lifetime挑围,就是最大報(bào)文生存時(shí)間,是任何報(bào)文在網(wǎng)絡(luò)上的存在的最長(zhǎng)時(shí)間模捂,超過(guò)這個(gè)時(shí)間報(bào)文將被丟棄∪ⅲ《TCP/IP詳解》中是這樣描述的:MSL是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)內(nèi)的最長(zhǎng)時(shí)間寓搬。RFC 793中規(guī)定MSL為2分鐘,實(shí)際應(yīng)用中常用的是30秒镣典、1分鐘、2分鐘等澎剥。

TCP的TIME_WAIT需要等待2MSL哑姚,當(dāng)TCP的一端發(fā)起主動(dòng)關(guān)閉芜茵,三次揮手完成后發(fā)送第四次揮手的ACK包后就進(jìn)入這個(gè)狀態(tài),等待2MSL時(shí)間主要目的是:防止最后一個(gè)ACK包對(duì)方?jīng)]有收到绞佩,那么對(duì)方在超時(shí)后將重發(fā)第三次握手的FIN包品山,主動(dòng)關(guān)閉端接到重發(fā)的FIN包后可以再發(fā)一個(gè)ACK應(yīng)答包躬贡。在TIME_WAIT狀態(tài)時(shí)兩端的端口不能使用拂玻,要等到2MSL時(shí)間結(jié)束才可以繼續(xù)使用。當(dāng)連接處于2MSL等待階段時(shí)任何遲到的報(bào)文段都將被丟棄魄懂。

3.為什么是四次揮手闯第,而不是三次或是五次咳短、六次?
雙方關(guān)閉連接要經(jīng)過(guò)雙方都同意篡腌。所以勾效,首先是客服端給服務(wù)器發(fā)送FIN,要求關(guān)閉連接杨伙,服務(wù)器收到后會(huì)發(fā)送一個(gè)ACK進(jìn)行確認(rèn)限匣。服務(wù)器然后再發(fā)送一個(gè)FIN,客戶端發(fā)送ACK確認(rèn)睛约,并進(jìn)入TIME_WAIT狀態(tài)哲身。等待2MSL后自動(dòng)關(guān)閉勘天。

總結(jié):
(1)為了保證客戶端發(fā)送的最后一個(gè)ACK報(bào)文段能夠到達(dá)服務(wù)器。即最后一個(gè)確認(rèn)報(bào)文可能丟失商膊,服務(wù)器會(huì)超時(shí)重傳晕拆,然后服務(wù)器發(fā)送FIN請(qǐng)求關(guān)閉連接材蹬,客戶端發(fā)送ACK確認(rèn)实幕。一個(gè)來(lái)回是兩個(gè)報(bào)文生命周期。

如果沒(méi)有等待時(shí)間堤器,發(fā)送完確認(rèn)報(bào)文段就立即釋放連接的話昆庇,服務(wù)器就無(wú)法重傳,因此也就收不到確認(rèn)闸溃,就無(wú)法按步驟進(jìn)入CLOSED狀態(tài)整吆,即必須收到確認(rèn)才能close。
(2)防止已經(jīng)失效的連接請(qǐng)求報(bào)文出現(xiàn)在連接中辉川。經(jīng)過(guò)2MSL表蝙,在這個(gè)連續(xù)持續(xù)的時(shí)間內(nèi),產(chǎn)生的所有報(bào)文段就可以都從網(wǎng)絡(luò)消失乓旗。

源文章地址:https://blog.csdn.net/ZWE7616175/article/details/80432486 轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寸齐,隨后出現(xiàn)的幾起案子欲诺,更是在濱河造成了極大的恐慌,老刑警劉巖渺鹦,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扰法,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毅厚,警方通過(guò)查閱死者的電腦和手機(jī)塞颁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吸耿,“玉大人祠锣,你說(shuō)我怎么就攤上這事⊙拾玻” “怎么了伴网?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妆棒。 經(jīng)常有香客問(wèn)我澡腾,道長(zhǎng),這世上最難降的妖魔是什么糕珊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任动分,我火速辦了婚禮,結(jié)果婚禮上红选,老公的妹妹穿的比我還像新娘澜公。我一直安慰自己,他們只是感情好喇肋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布坟乾。 她就那樣靜靜地躺著,像睡著了一般苟蹈。 火紅的嫁衣襯著肌膚如雪糊渊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天慧脱,我揣著相機(jī)與錄音渺绒,去河邊找鬼。 笑死菱鸥,一個(gè)胖子當(dāng)著我的面吹牛宗兼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氮采,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼殷绍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鹊漠?” 一聲冷哼從身側(cè)響起主到,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茶行,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后登钥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畔师,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年牧牢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了看锉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔鳍,死狀恐怖伯铣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轮纫,我是刑警寧澤腔寡,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站掌唾,受9級(jí)特大地震影響蹬蚁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郑兴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一犀斋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧情连,春花似錦叽粹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至挽拔,卻和暖如春辆脸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背螃诅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工啡氢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人术裸。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓倘是,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袭艺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搀崭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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