TCP可靠性的體現(xiàn):seq和ack機(jī)制

提到TCP和UDP的區(qū)別杰妓,很容易想到的就是TCP的可靠性蓬痒,那TCP是通過(guò)什么機(jī)制實(shí)現(xiàn)了可靠性的呢?解釋這個(gè)之前先來(lái)區(qū)分TCP中的大寫(xiě)ACK和小寫(xiě)ack围肥。看一張經(jīng)典的TCP三次握手過(guò)程圖:

TCP三次握手過(guò)程圖

這張圖里似乎有個(gè)大寫(xiě)的ACK也有個(gè)小寫(xiě)的ack蜂怎,這也是容易混淆的地方穆刻。

大寫(xiě)的ACK是控制位,在TCP報(bào)文頭中有8個(gè)標(biāo)志比特派敷,也就是TCP報(bào)文頭中有8位大小的數(shù)據(jù)是標(biāo)志位蛹批,看一下TCP報(bào)文格式更好理解:

TCP報(bào)文

它們中的多個(gè)可以同時(shí)被設(shè)置成1:

CWR(Congestion Window Reduce):擁塞窗口減少標(biāo)志,用來(lái)表明它接收到了設(shè)置ECE標(biāo)志的TCP包篮愉。并且腐芍,發(fā)送方收到消息之后,通過(guò)減小發(fā)送窗口的大小來(lái)降低發(fā)送速率试躏。

ECE(ECN Echo):用來(lái)在TCP三次握手時(shí)表明一個(gè)TCP端是具備ECN功能的猪勇。在數(shù)據(jù)傳輸過(guò)程中,它也用來(lái)表明接收到的TCP包的IP頭部的ECN被設(shè)置為 11颠蕴,即網(wǎng)絡(luò)線路擁堵泣刹。

URG(Urgent):表示本報(bào)文段中發(fā)送的數(shù)據(jù)是否包含緊急數(shù)據(jù)。URG=1時(shí)表示有緊急數(shù)據(jù)犀被。當(dāng)URG=1時(shí)椅您,后面的緊急指針字段才有效。

ACK:表示前面的確認(rèn)號(hào)字段是否有效寡键。ACK=1時(shí)表示有效掀泳。只有當(dāng) ACK=1時(shí),前面的確認(rèn)號(hào)字段才有效。TCP規(guī)定,連接建立后讯柔,ACK必須為 1。

PSH(Push):告訴對(duì)方收到該報(bào)文段后是否立即把數(shù)據(jù)推送給上層马僻。如果值為1,表示應(yīng)當(dāng)立即把數(shù)據(jù)提交給上層注服,而不是緩存起來(lái)韭邓。

RST:表示是否重置連接措近。如果RST=1,說(shuō)明TCP連接出現(xiàn)了嚴(yán)重錯(cuò)誤(如主機(jī)崩潰)仍秤,必須釋放連接熄诡,然后再重新建立連接。

SYN:在建立連接時(shí)使用诗力,用來(lái)同步序號(hào)凰浮。當(dāng)SYN=1,ACK=0時(shí)苇本,表示這是一個(gè)請(qǐng)求建立連接的報(bào)文段袜茧;當(dāng)SYN=1,ACK=1時(shí)瓣窄,表示對(duì)方同意建立連接笛厦。SYN=1時(shí),說(shuō)明這是一個(gè)請(qǐng)求建立連接或同意建立連接的報(bào)文俺夕。只有在前兩次握手中SYN才為1裳凸。

FIN:標(biāo)記數(shù)據(jù)是否發(fā)送完畢。如果 FIN=1劝贸,表示數(shù)據(jù)已經(jīng)發(fā)送完成姨谷,可以釋放連接。

這是大寫(xiě)的ACK映九,而小寫(xiě)的ack是確認(rèn)序列號(hào)梦湘,和它一對(duì)的是seq即順序序列號(hào),也就是上圖TCP報(bào)文格式中的Sequence Number和Acknowledgment Number件甥。

前面說(shuō)了這么多只是為了區(qū)分TCP中的大寫(xiě)ACK和小寫(xiě)ack捌议,也沒(méi)其他方法就用大小寫(xiě)區(qū)分吧,本文關(guān)注的重點(diǎn)就是TCP中的seq和ack機(jī)制引有,通過(guò)它們實(shí)現(xiàn)了TCP的可靠性傳輸瓣颅,當(dāng)然TCP通過(guò)很多方面去保證了可靠性傳輸,這里seq和ack機(jī)制是防止數(shù)據(jù)丟失丟包的機(jī)制譬正。

順序號(hào)seq:用來(lái)標(biāo)識(shí)從TCP源端向TCP目的端發(fā)送的數(shù)據(jù)字節(jié)流弄捕,它表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)的順序號(hào)。理解起來(lái)就是TCP用順序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)导帝。由上圖TCP報(bào)文格式中可以看出序號(hào)是 32bit 的無(wú)符號(hào)數(shù),序號(hào)到達(dá) 后又重新開(kāi)始計(jì)數(shù)穿铆。當(dāng)建立一個(gè)新的連接時(shí)您单,順序號(hào)字段包含由這個(gè)主機(jī)選擇的該連接的初始順序號(hào) ISN ( Initial Sequence Number ),也就是說(shuō)seq并不一定是從0開(kāi)始的荞雏,所以剛在畫(huà)TCP三次握手的時(shí)候虐秦,寫(xiě)的seq=x平酿,即使還沒(méi)有數(shù)據(jù)傳輸,seq包含了ISN后就成了一個(gè)隨機(jī)數(shù)悦陋,并不是0蜈彼。

確認(rèn)號(hào)ack:理解起來(lái)就一句話,所期望收到的下一個(gè)順序號(hào)seq俺驶。

TCP為應(yīng)用層提供全雙工服務(wù)幸逆,這意味數(shù)據(jù)能在兩個(gè)方向上獨(dú)立地進(jìn)行傳輸,也就是說(shuō)服務(wù)端和客戶(hù)端都可能成為數(shù)據(jù)接收或者數(shù)據(jù)發(fā)送的一端暮现。

數(shù)據(jù)發(fā)送端在發(fā)送TCP報(bào)文時(shí)还绘,計(jì)算在本次seq計(jì)數(shù)內(nèi),之前所有發(fā)送的報(bào)文中數(shù)據(jù)長(zhǎng)度之和是多少栖袋,也就是計(jì)數(shù)記到哪里了拍顷,這就是seq。然后再計(jì)算之前所有收到的報(bào)文中收到的數(shù)據(jù)長(zhǎng)度之和是多少塘幅,這就是ack昔案。需要注意的是seq和ack是分開(kāi)計(jì)數(shù)的。需要注意的是电媳,SYN和FIN的TCP報(bào)文傳輸雖然沒(méi)有數(shù)據(jù)踏揣,但是數(shù)據(jù)長(zhǎng)度算1,ACK的傳輸匆背,數(shù)據(jù)長(zhǎng)度算0呼伸。

數(shù)據(jù)接收端收到TCP報(bào)文后,將這次報(bào)文中的seq取出來(lái)钝尸,和自己最后一次發(fā)送的ack對(duì)比括享,如果一致,則代表數(shù)據(jù)沒(méi)有丟失珍促,理解起來(lái)就是這次的順序號(hào)和上次自己期望的順序號(hào)一致嘛铃辖。如果不一致就說(shuō)明有丟包發(fā)生。其實(shí)就是TCP用0~對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)猪叙,用下圖舉個(gè)例子解釋一下:

示例圖

三個(gè)過(guò)程:

1.A在發(fā)送某個(gè)TCP報(bào)文前娇斩,發(fā)現(xiàn)此時(shí)自己這邊的seq計(jì)數(shù)已經(jīng)到了x,那這次的報(bào)文中seq=x穴翩,也就是在一次seq計(jì)數(shù)內(nèi)犬第,該端之前所有發(fā)送的報(bào)文中數(shù)據(jù)長(zhǎng)度之和為x。然后這次又在這個(gè)報(bào)文中攜帶了長(zhǎng)度為100bit的數(shù)據(jù)芒帕。

2.B在收到這個(gè)報(bào)文后歉嗓,拿到報(bào)文中的seq=x,又拿到了長(zhǎng)度為100bit的數(shù)據(jù)背蟆,然后回包的時(shí)候ack=x+100鉴分。意思是告訴B你已經(jīng)發(fā)了x+100位的數(shù)據(jù)了哮幢,下次發(fā)包的時(shí)候別忘了把seq改成x+100。

3.A收到B回的數(shù)據(jù)包后志珍,拿到報(bào)文中的ack=x+100橙垢,然后和自己這邊的計(jì)數(shù)著的seq一比對(duì),如果一樣伦糯,說(shuō)明A發(fā)的B都收到了沒(méi)問(wèn)題柜某,如果不一樣,假如A一看自己這邊的seq已經(jīng)等于y了舔株,也就是自己計(jì)數(shù)著的已經(jīng)發(fā)送y位的數(shù)據(jù)了莺琳,可是聽(tīng)B的意思它才收到x+100位數(shù)據(jù),丟包了唄载慈。然后就是重發(fā)什么的是TCP的另外一些機(jī)制惭等。

TCP就是通過(guò)seq和ack機(jī)制去確認(rèn)傳輸過(guò)程中有沒(méi)有丟包現(xiàn)象,前面說(shuō)在一次計(jì)數(shù)范圍內(nèi)办铡,seq并不一定是從0開(kāi)始的辞做,可以當(dāng)我們用Wireshark抓包時(shí),上面顯示的seq確實(shí)從0開(kāi)始的寡具,這是因?yàn)閃ireshark等抓包軟件為了讓seq和ack展示更直觀秤茅,自動(dòng)幫我們減去了初始順序號(hào) ISN,當(dāng)然也可以設(shè)置為直接展示真正的seq和ack童叠,那就看著比較亂了框喳,貼一張Wireshark處理后的seq和ack變化過(guò)程圖:

seq和ack變化過(guò)程圖

圖中前三步即TCP的三次握手,之后是數(shù)據(jù)傳輸厦坛∥蹇澹可以結(jié)合該圖去更好的理解本文。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杜秸,一起剝皮案震驚了整個(gè)濱河市放仗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撬碟,老刑警劉巖诞挨,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呢蛤,居然都是意外死亡惶傻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)其障,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)达罗,“玉大人,你說(shuō)我怎么就攤上這事×溉啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵抚笔,是天一觀的道長(zhǎng)扶认。 經(jīng)常有香客問(wèn)我,道長(zhǎng)殊橙,這世上最難降的妖魔是什么辐宾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮膨蛮,結(jié)果婚禮上叠纹,老公的妹妹穿的比我還像新娘。我一直安慰自己敞葛,他們只是感情好誉察,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著惹谐,像睡著了一般持偏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氨肌,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天鸿秆,我揣著相機(jī)與錄音,去河邊找鬼怎囚。 笑死卿叽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恳守。 我是一名探鬼主播考婴,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼井誉!你這毒婦竟也來(lái)了蕉扮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颗圣,失蹤者是張志新(化名)和其女友劉穎喳钟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體在岂,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奔则,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔽午。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片易茬。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抽莱,到底是詐尸還是另有隱情范抓,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布食铐,位于F島的核電站匕垫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虐呻。R本人自食惡果不足惜象泵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斟叼。 院中可真熱鬧偶惠,春花似錦、人聲如沸朗涩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馋缅。三九已至扒腕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萤悴,已是汗流浹背瘾腰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留覆履,地道東北人蹋盆。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像硝全,于是被迫代替她去往敵國(guó)和親栖雾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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

  • seq和ack號(hào)存在于TCP報(bào)文段的首部中伟众,seq是序號(hào)析藕,ack是確認(rèn)號(hào),大小均為4字節(jié)(注意與大寫(xiě)的ACK不同凳厢,...
    JL_chen閱讀 4,292評(píng)論 1 1
  • 讀懂了TCP/IP協(xié)議账胧,也就基本了解的網(wǎng)絡(luò)通信原理。本文是參照研究生教材《網(wǎng)絡(luò)安全原理與應(yīng)用》里面的內(nèi)容加上自己實(shí)...
    Super超人閱讀 22,033評(píng)論 1 19
  • TCP數(shù)據(jù)報(bào)首部格式 建立連接——三次握手 TCP/IP協(xié)議中先紫,TCP協(xié)議提供可靠的連接服務(wù)治泥,采用三次握手建立一個(gè)...
    妖云小離閱讀 237評(píng)論 0 1
  • TCP協(xié)議精講 轉(zhuǎn)發(fā)自 https://mp.weixin.qq.com/s/5-Mt-IScPJ6KXTwIX_...
    o0O0o_b39d閱讀 850評(píng)論 0 0
  • 上篇分析了LengthFieldBasedFrameDecoder,只需要簡(jiǎn)單靈活的指定幾個(gè)參數(shù)就能滿足多種情況下...
    李亞林1990閱讀 780評(píng)論 0 3