TCP的連接建立和斷開(kāi)

TCP首部

TCP報(bào)文格式.png
  • 源端口和目的端口
    用于確定發(fā)送端和接收端的應(yīng)用進(jìn)程遏乔。
    { 客戶(hù)IP:客戶(hù)端口,服務(wù)IP:服務(wù)端口 } 四元組唯一確定互聯(lián)網(wǎng)中的每一個(gè)TCP連接雙方。

    • 服務(wù)端最大并發(fā)數(shù)是多少?
      理論上是這個(gè)4元組的所有數(shù)量。
  • 序號(hào)
    用來(lái)標(biāo)識(shí)從TCP發(fā)送端向TCP接收端發(fā)送的數(shù)據(jù)字節(jié)流瞭空,表示這個(gè)報(bào)文段中的第N個(gè)數(shù)據(jù)字節(jié)。范圍 0 ~ (2^32-1)

  • 確認(rèn)序號(hào)
    發(fā)送端所期望收到的下一字節(jié)序號(hào)。確認(rèn)序號(hào)應(yīng)該是 上次已成功收到的數(shù)據(jù)字節(jié)序+1

  • 4位首部長(zhǎng)度
    包括TCP首部長(zhǎng)度咆畏,為什么要只包括首部長(zhǎng)度而不是像UDP中包括首部和數(shù)據(jù)的總長(zhǎng)度南捂?因?yàn)門(mén)CP首部長(zhǎng)度是不固定的,而UDP的首部長(zhǎng)度是固定的旧找。

  • 標(biāo)志位

    • URG 緊急指針有效
    • ACK 確認(rèn)序號(hào)有效
    • PSH 接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層
    • RST 重建連接
    • SYN 同步序號(hào)用來(lái)發(fā)起一個(gè)連接
    • FIN 發(fā)送端完成發(fā)送任務(wù)
  • 窗口大小
    用于流量控制溺健,參考TCP流量控制

  • 選項(xiàng)
    最常見(jiàn)的可選字段是最長(zhǎng)報(bào)文大小钮蛛,又稱(chēng)為MSS(Maximum Segment Size)鞭缭,每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(SYN報(bào)文)中指明這個(gè)選項(xiàng),它指明本端所能接收的最大長(zhǎng)度的報(bào)文段魏颓,這樣做岭辣,通常是為了避免報(bào)文分段。

TCP完整狀態(tài)遷移圖

TCP狀態(tài)遷移圖.png

TCP連接建立

  • 客戶(hù)發(fā)送一個(gè)SYN報(bào)文段指明客戶(hù)打算連接的服務(wù)器的端口甸饱,以及初始序號(hào)ISN沦童。

  • 服務(wù)器發(fā)回包含服務(wù)器的初始序號(hào)的SYN報(bào)文段作為應(yīng)答,同時(shí)將確認(rèn)序號(hào)設(shè)置為客戶(hù)的ISN+1以對(duì)客戶(hù)的SYN報(bào)文段進(jìn)行確認(rèn)叹话。所以1個(gè)SYN報(bào)文將用一個(gè)字節(jié)序偷遗。

  • 客戶(hù)發(fā)回一個(gè)確認(rèn)序號(hào)為服務(wù)器的ISN加1的ACK報(bào)文對(duì)服務(wù)器的SYN報(bào)文進(jìn)行確認(rèn)。


    TCP連接建立.png
  • TCP連接為什么需要3次握手驼壶,為什么不是2次或者4次氏豌?

    總的來(lái)說(shuō)是為了防止已失效的的連接請(qǐng)求報(bào)文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯(cuò)誤辅柴。

    假設(shè)client發(fā)出的第一個(gè)連接請(qǐng)求報(bào)文段并沒(méi)有丟失箩溃,而是在某個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間的滯留了瞭吃,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)server碌嘀。

    本來(lái)這是一個(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并沒(méi)有發(fā)出建立連接的請(qǐng)求怯疤,因此不會(huì)理睬server的確認(rèn),也不會(huì)向server發(fā)送數(shù)據(jù)催束。但server卻以為新的運(yùn)輸連接已經(jīng)建立集峦,并一直等待client發(fā)來(lái)數(shù)據(jù)。這樣,server的很多資源就白白浪費(fèi)掉了塔淤。

    采用 "三次握手" 的辦法可以防止上述現(xiàn)象發(fā)生摘昌。例如剛才那種情況,client不會(huì)向server的確認(rèn)發(fā)出確認(rèn)高蜂。server由于收不到確認(rèn)聪黎,就知道client并沒(méi)有要求建立連接。

連接建立超時(shí)

當(dāng)服務(wù)器

半打開(kāi)連接

TCP連接的一端異常崩潰备恤,或者在未通知對(duì)端的情況下關(guān)閉連接稿饰。比如一個(gè)常見(jiàn)的情況是TCP連接的一端異常斷電,就會(huì)導(dǎo)致TCP的半開(kāi)連接露泊。如果沒(méi)有數(shù)據(jù)傳輸湘纵,對(duì)端就不會(huì)知道本端的異常而一直處于ESTABLISHED狀態(tài)(TCP也可以自己配置keepalive選項(xiàng)實(shí)現(xiàn)心跳)。此時(shí)如果發(fā)生數(shù)據(jù)傳輸滤淳,會(huì)產(chǎn)生RST梧喷。

注意區(qū)分半打開(kāi)連接和半關(guān)閉連接。

同時(shí)打開(kāi)

對(duì)于TCP脖咐,同時(shí)打開(kāi)铺敌,它僅僅建立一條連接而不是2條。同時(shí)是4次握手


同時(shí)打開(kāi).jpg

TCP連接的終止

因?yàn)門(mén)CP的連接是一個(gè)全雙工的屁擅,所以每一個(gè)方向必須單獨(dú)關(guān)閉偿凭。

當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)就發(fā)送一個(gè)FIN給對(duì)方來(lái)終止這個(gè)方向上的連接。收到一個(gè)FIN只是意味著在這一方向上沒(méi)有數(shù)據(jù)流動(dòng)派歌。
1弯囊、客戶(hù)端發(fā)送一個(gè)FIN,用來(lái)終結(jié)客戶(hù)到服務(wù)端的連接胶果。
2匾嘱、服務(wù)端收到這個(gè)FIN,它發(fā)回一個(gè)確認(rèn)客戶(hù)的ACK報(bào)文早抠,和SYN一樣霎烙,F(xiàn)IN也將占用一個(gè)字節(jié)序列。
3蕊连、服務(wù)端也向客戶(hù)發(fā)送一個(gè)FIN報(bào)文悬垃。
4、客戶(hù)發(fā)回一個(gè)確認(rèn)已收到服務(wù)端的FIN報(bào)文的ACK報(bào)文甘苍。

TCP正常連接關(guān)閉.png
  • 2MSL等待狀態(tài)
    TIME_WAIT狀態(tài)也稱(chēng)為2MSL狀態(tài)尝蠕。
    而MSL是指任何報(bào)文段在被丟棄前在網(wǎng)絡(luò)內(nèi)最長(zhǎng)時(shí)間。

    為什么需要等待2MSL载庭?

    • 當(dāng)TCP執(zhí)行主動(dòng)關(guān)閉看彼,并發(fā)送最后一個(gè)ACK扇谣,在TIME_WAIT狀態(tài)停留的時(shí)間為2倍的MSL,這樣可以讓TCP可以有時(shí)間再次發(fā)送最后一個(gè)ACK闲昭,防止丟失(另一端超時(shí)并重發(fā)最后的FIN)
    • 在發(fā)送完ACK報(bào)文段后罐寨,再經(jīng)過(guò)2MSL時(shí)間,就可以使本連接持續(xù)的時(shí)間所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失序矩。這樣就可以使下一個(gè)新的連接中不會(huì)出現(xiàn)這種舊的連接請(qǐng)求的報(bào)文段

    處于2MSL等待期間鸯绿,插口中使用的本地端口在默認(rèn)情況下不再使用,所以任何處于2MSL等待時(shí)簸淀,任何遲到的報(bào)文將被丟棄瓶蝴。

  • FIN_WAIT_2狀態(tài)
    在FIN_WAIT_2狀態(tài)我們已經(jīng)發(fā)出了FIN,并且另一端已對(duì)它進(jìn)行確認(rèn)租幕。但只有當(dāng)另一端的進(jìn)程完成關(guān)閉(對(duì)端發(fā)送FIN)舷手,我們這端才會(huì)從FIN_WAIT_2狀態(tài)進(jìn)入TIME_WAIT狀態(tài)。這意味著我們這端可能永遠(yuǎn)保持這一狀態(tài)劲绪,另一端也就處于CLOSE_WAIT狀態(tài)男窟。

異常關(guān)閉

終止一個(gè)連接的正常方式是一方發(fā)送FIN。有時(shí)這種也稱(chēng)為有序釋放贾富,因?yàn)樵谒信抨?duì)數(shù)據(jù)都已發(fā)送之后才發(fā)送FIN歉眷,正常情況下沒(méi)有任何數(shù)據(jù)丟失。
但也有可能發(fā)送一個(gè)RST報(bào)文段而不是FIN來(lái)中途釋放一個(gè)連接颤枪,這被稱(chēng)為異常釋放汗捡。
收到RST報(bào)文段不會(huì)產(chǎn)生任何響應(yīng),也不會(huì)進(jìn)行確認(rèn)畏纲。收到RST的一方將終止該連接扇住,并通知應(yīng)用層連接復(fù)位。

半關(guān)閉

TCP 提供了連接的一端在結(jié)束它的發(fā)送后還能接收來(lái)自另一端數(shù)據(jù)的能力盗胀,這就是所謂的半關(guān)閉艘蹋。


半關(guān)閉.jpg
同時(shí)關(guān)閉
同時(shí)關(guān)閉.jpg

參考資料
《TCP/IP詳解 卷1:協(xié)議》[美] W.Richard Stevens

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市读整,隨后出現(xiàn)的幾起案子簿训,更是在濱河造成了極大的恐慌咱娶,老刑警劉巖米间,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膘侮,居然都是意外死亡屈糊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)琼了,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逻锐,“玉大人夫晌,你說(shuō)我怎么就攤上這事∶劣眨” “怎么了晓淀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盏档。 經(jīng)常有香客問(wèn)我凶掰,道長(zhǎng),這世上最難降的妖魔是什么蜈亩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任懦窘,我火速辦了婚禮,結(jié)果婚禮上稚配,老公的妹妹穿的比我還像新娘畅涂。我一直安慰自己,他們只是感情好道川,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布午衰。 她就那樣靜靜地躺著,像睡著了一般冒萄。 火紅的嫁衣襯著肌膚如雪苇经。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天宦言,我揣著相機(jī)與錄音扇单,去河邊找鬼。 笑死奠旺,一個(gè)胖子當(dāng)著我的面吹牛蜘澜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播响疚,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鄙信,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了忿晕?” 一聲冷哼從身側(cè)響起装诡,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎践盼,沒(méi)想到半個(gè)月后鸦采,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咕幻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年渔伯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肄程。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锣吼,死狀恐怖选浑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玄叠,我是刑警寧澤古徒,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站读恃,受9級(jí)特大地震影響描函,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狐粱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一舀寓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肌蜻,春花似錦互墓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至豆挽,卻和暖如春育谬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帮哈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工膛檀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娘侍。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓咖刃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親憾筏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚎杨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 最近在惡補(bǔ)計(jì)算機(jī)網(wǎng)絡(luò)方面的知識(shí),之前對(duì)于TCP的三次握手和四次分手也是模模糊糊氧腰,對(duì)于其中的細(xì)節(jié)更是渾然不知枫浙,最近看...
    微醺歲月閱讀 9,511評(píng)論 4 129
  • 18.1 引言 TCP是一個(gè)面向連接的協(xié)議。無(wú)論哪一方向另一方發(fā)送數(shù)據(jù)之前古拴,都必須先在雙方之間建立一條連接箩帚。本章將...
    張芳濤閱讀 3,342評(píng)論 0 13
  • 為什么會(huì)有TCP/IP協(xié)議 在世界上各地,各種各樣的電腦運(yùn)行著各自不同的操作系統(tǒng)為大家服務(wù)斤富,這些電腦在表達(dá)同一種信...
    RaphetS閱讀 278,901評(píng)論 12 294
  • TCP/IP詳解 網(wǎng)絡(luò)協(xié)議通常分不同層次進(jìn)行開(kāi)發(fā)膏潮,每一層分別負(fù)責(zé)不同的通信功能一個(gè)協(xié)議族,比如TCP/IP满力,是一組...
    謎碌小孩閱讀 1,243評(píng)論 0 5
  • 一焕参、OSI七層模型與TCP/IP協(xié)議簡(jiǎn)介 OSI模型(Open System Interconnection Re...
    做有趣的惡魔閱讀 1,162評(píng)論 1 3