計(jì)算機(jī)網(wǎng)絡(luò)中的TCP/UDP協(xié)議到底是怎么回事(二)

文章來(lái)源簡(jiǎn)書(shū):http://www.reibang.com/p/eab86c0d1612

上一篇博客闡述了TCP/IP五層網(wǎng)絡(luò)結(jié)構(gòu)模型以及一些關(guān)于TCP、UDP的基礎(chǔ)知識(shí),這篇博客會(huì)接著寫(xiě)一些關(guān)于TCP擁塞控制的算法以及對(duì)TCP中常有的疑問(wèn)進(jìn)行解答。

TCP擁塞控制

首先了解幾個(gè)概念封拧,為下面的敘述做鋪墊

  • 擁塞窗口(cwnd):TCP擁塞控制中的主要參數(shù)图毕,表示發(fā)送端下一次最多可以發(fā)送的數(shù)據(jù)分包的個(gè)數(shù),是來(lái)自發(fā)送端的流量控制产镐。
  • 接收端窗口(rwnd):又稱通知窗口(Advertise Window),接受端目前每次所能接收的數(shù)據(jù)分組的最大個(gè)數(shù)踢步,是來(lái)自接收端的流量控制癣亚。
  • 慢開(kāi)始門(mén)限(ssthresh):當(dāng)擁塞窗口增長(zhǎng)到慢開(kāi)始門(mén)限時(shí),啟動(dòng)擁塞避免算法(后面會(huì)具體闡述)获印。
  • 擁塞控制常用算法:慢開(kāi)始述雾、擁塞避免、快重傳兼丰、快恢復(fù)玻孟。

最初,發(fā)送方不知道接收方的容納能力鳍征,如果初次就發(fā)送較大量的數(shù)據(jù)黍翎,極有可能造成整個(gè)網(wǎng)絡(luò)的癱瘓,TCP為了防止此類問(wèn)題的出現(xiàn)艳丛,在通信一開(kāi)始就會(huì)通過(guò)一個(gè)叫慢開(kāi)始的算法得到的數(shù)值匣掸,對(duì)發(fā)送數(shù)據(jù)量進(jìn)行控制。

慢開(kāi)始:

由于需要考慮擁塞控制和流量控制兩個(gè)方面的內(nèi)容氮双,發(fā)送端的發(fā)送窗口為min(cwnd旺聚,rwnd),但是rwnd是由對(duì)端確定的眶蕉,網(wǎng)絡(luò)環(huán)境對(duì)其沒(méi)有影響砰粹,所以在考慮擁塞的時(shí)候我們一般不考慮rwnd的值,我們暫時(shí)只討論如何確定cwnd值的大小。

在執(zhí)行慢開(kāi)始算法時(shí)碱璃,擁塞窗口 cwnd的初始值為 1弄痹,發(fā)送第一個(gè)報(bào)文段。當(dāng)發(fā)送端收到來(lái)自接收端的ACK之后嵌器,擁塞窗口開(kāi)始以1肛真、2、4這樣的指數(shù)形式增長(zhǎng)爽航。當(dāng)擁塞窗口cwnd 增長(zhǎng)到慢開(kāi)始門(mén)限值 ssthresh 時(shí)蚓让,就改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長(zhǎng)讥珍。

擁塞避免:

最初历极,擁塞窗口指數(shù)增長(zhǎng),可以很快進(jìn)行大數(shù)據(jù)的發(fā)送衷佃,最大限度的利用網(wǎng)絡(luò)寬帶資源趟卸。當(dāng)達(dá)到慢開(kāi)始門(mén)限值,開(kāi)始進(jìn)入擁塞避免階段氏义,擁塞窗口開(kāi)始加法增加锄列。這樣就可以避免增長(zhǎng)過(guò)快導(dǎo)致網(wǎng)絡(luò)擁塞,慢慢的增加調(diào)整到網(wǎng)絡(luò)的最佳值惯悠。

快重傳與快速恢復(fù)

上面都沒(méi)有遇到網(wǎng)絡(luò)擁塞邻邮,當(dāng)真正遇到網(wǎng)絡(luò)擁塞時(shí),如何處理呢克婶?當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)的ACK之后筒严,TCP會(huì)進(jìn)入快速重傳、快速恢復(fù)的階段鸠补。

為什么叫快速重傳呢萝风?如果當(dāng)發(fā)送端接收到三個(gè)重復(fù)的確認(rèn)ACK時(shí)嘀掸,則斷定分組丟失紫岩,立即重傳丟失的報(bào)文段,而不必等待重傳計(jì)時(shí)器超時(shí)睬塌,相比之下泉蝌,前者速度更快。

快速恢復(fù)的主要步驟:

  • 當(dāng)收到3個(gè)重復(fù)ACK時(shí)揩晴,把ssthresh設(shè)置為cwnd的一半勋陪,把cwnd設(shè)置為ssthresh的值加3,然后重傳丟失的報(bào)文段硫兰。
  • 再收到重復(fù)的ACK時(shí)诅愚,擁塞窗口增加1。
  • 當(dāng)收到新的數(shù)據(jù)包的ACK時(shí)劫映,把cwnd設(shè)置為第一步中的ssthresh的值违孝。原因是因?yàn)樵揂CK確認(rèn)了新的數(shù)據(jù)刹前,說(shuō)明從重復(fù)ACK時(shí)的數(shù)據(jù)都已收到,該恢復(fù)過(guò)程已經(jīng)結(jié)束雌桑,可以回到恢復(fù)之前的狀態(tài)了喇喉,也即再次進(jìn)入擁塞避免狀態(tài)。
TCP窗口變化

當(dāng)TCP通信開(kāi)始之后校坑,網(wǎng)絡(luò)吞吐量會(huì)逐漸上升拣技,但是隨著網(wǎng)絡(luò)擁堵的發(fā)生,吞吐量也會(huì)急速下降耍目。于是會(huì)再次進(jìn)入吞吐量慢慢上升的過(guò)程膏斤。但是所謂TCP的吞吐量的特點(diǎn)就好像是在逐漸占領(lǐng)網(wǎng)絡(luò)寬帶的感覺(jué)。

TCP疑問(wèn)解答

為什么采用三次握手而不是二次握手制妄?

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)有要求建立連接〈雍常”

TCP三次握手時(shí)州弟,第三次握手失敗怎么辦?

如果三次都成功的話:

  • 客戶端發(fā)出了SYN包給服務(wù)器,客戶端進(jìn)入SYN_SEND狀態(tài)婆翔。
  • 服務(wù)器收到SYN包后發(fā)出SYN+ACK數(shù)據(jù)包,服務(wù)器進(jìn)入SYN_RECV狀態(tài)桐经。
  • 客戶端收到SYN+ACK后發(fā)出ACK給服務(wù)器,客戶端進(jìn)入ESTABLISH狀態(tài)
  • 服務(wù)器收到最后的ACK,服務(wù)器進(jìn)入ESTABLISH狀態(tài)浙滤。

我們了解一下TCP狀態(tài)轉(zhuǎn)換圖和狀態(tài)偽碼可以發(fā)現(xiàn):

case:SYN_RECV狀態(tài)
    if(收到ACK報(bào)文)
        進(jìn)入ESTABLISH狀態(tài)
    if(超時(shí))
        發(fā)送RTS報(bào)文阴挣,進(jìn)入CLOSED狀態(tài)
    if(收到“關(guān)閉報(bào)文”)
        發(fā)送FIN報(bào)文,進(jìn)入FIN_WAIT_1狀態(tài)
    if(收到RTS報(bào)文)
        進(jìn)入LISTEN狀態(tài)
    if(收到其他報(bào)文段或報(bào)文)
        發(fā)出差錯(cuò)報(bào)文
    break

當(dāng)?shù)谌挝帐质r(shí)的處理操作纺腊,可以看出當(dāng)失敗時(shí)服務(wù)器并不會(huì)重傳ACK報(bào)文畔咧,而是直接發(fā)送RTS報(bào)文段,進(jìn)入CLOSED狀態(tài)揖膜。這樣做的目的是為了防止SYN洪泛攻擊誓沸。

何為SYN洪泛攻擊呢?在TCP連接建立過(guò)程中很容易碰到嚴(yán)重的的安全問(wèn)題壹粟,稱為SYN洪泛攻擊拜隧。當(dāng)一個(gè)或多個(gè)惡意攻擊者向服務(wù)器發(fā)送大量的SYN報(bào)文時(shí),服務(wù)器認(rèn)為不同客戶發(fā)來(lái)了打開(kāi)請(qǐng)求趁仙,于是就回分配資源洪添。然后,服務(wù)器向假冒的客戶發(fā)送SYN+ACK報(bào)文雀费,而這些報(bào)文都丟失了干奢。如果在第三次握手這段很短的時(shí)間內(nèi),服務(wù)器大量資源被占用而沒(méi)有被利用盏袄,服務(wù)器會(huì)因?yàn)橘Y源耗盡而無(wú)法接受合法客戶的連接請(qǐng)求忿峻。這種SYN洪泛攻擊稱為拒絕服務(wù)攻擊的安全攻擊,即攻擊者用大量的請(qǐng)求壟斷一個(gè)系統(tǒng)辕羽,使這個(gè)系統(tǒng)因超載而拒絕為合法的請(qǐng)求提供服務(wù)逛尚。(更多內(nèi)容請(qǐng)參考TCP/IP協(xié)議簇一書(shū))

關(guān)閉連接時(shí)半關(guān)閉選項(xiàng)的四向握手

TCP連接是全雙工的,所以它允許兩個(gè)方向的數(shù)據(jù)傳輸被獨(dú)立關(guān)閉刁愿。換言之绰寞,通信的一端可以發(fā)送結(jié)束報(bào)文段給對(duì)方,告訴它本端已經(jīng)完成了數(shù)據(jù)的發(fā)送酌毡,但允許繼續(xù)接收來(lái)自對(duì)方的數(shù)據(jù)克握,直到對(duì)方也發(fā)送結(jié)束報(bào)文段以關(guān)閉連接蕾管。TCP連接的這種狀態(tài)稱為半關(guān)閉(half close)狀態(tài)枷踏。

當(dāng)客戶端向服務(wù)器發(fā)送一個(gè)FIN報(bào)文段后,此連接被半關(guān)閉了掰曾。服務(wù)器發(fā)送ACK報(bào)文段來(lái)接受這個(gè)半關(guān)閉旭蠕。但是服務(wù)器仍然可以發(fā)送數(shù)據(jù),當(dāng)服務(wù)器把處理完的數(shù)據(jù)都發(fā)送完畢之后,發(fā)送FIN報(bào)文段(半關(guān)閉)掏熬,并且被客戶發(fā)來(lái)的ACK予以確認(rèn)(關(guān)閉)佑稠。

當(dāng)關(guān)閉連接時(shí)最后一個(gè)ACK丟失怎么辦?

如果最后一個(gè)ACK丟失的話旗芬,TCP就會(huì)認(rèn)為它的FIN丟失舌胶,進(jìn)行重發(fā)FIN。在客戶端收到FIN后疮丛,就會(huì)設(shè)置一個(gè)2MSL計(jì)時(shí)器幔嫂,2MSL計(jì)時(shí)器可以使客戶等待足夠長(zhǎng)的時(shí)間,使得在ACK丟失的情況下誊薄,可以等到下一個(gè)FIN的到來(lái)履恩。如果在TIME-WAIT狀態(tài)匯總有一個(gè)新的FIN到達(dá)了,客戶就會(huì)發(fā)送一個(gè)新的ACK呢蔫,并重新設(shè)置2MSL計(jì)時(shí)器切心。

示例圖解如下:

半關(guān)閉終止時(shí)間圖

如果重傳FIN到達(dá)客戶端時(shí),客戶端已經(jīng)進(jìn)入CLOSED狀態(tài)時(shí)片吊,那么客戶就永遠(yuǎn)收不到這個(gè)重傳的FIN報(bào)文段绽昏,服務(wù)器收不到ACK,服務(wù)器無(wú)法關(guān)閉連接俏脊。

但是服務(wù)器并不會(huì)一直無(wú)法關(guān)閉而涉,服務(wù)器會(huì)進(jìn)行不斷的探查,會(huì)發(fā)送十個(gè)間隔為75秒的探查联予,如果探查都沒(méi)有收到回應(yīng)啼县,則認(rèn)為客戶端已經(jīng)關(guān)閉,服務(wù)器也將關(guān)閉沸久,終止鏈接季眷。

PS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卷胯,隨后出現(xiàn)的幾起案子子刮,更是在濱河造成了極大的恐慌,老刑警劉巖窑睁,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挺峡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡担钮,警方通過(guò)查閱死者的電腦和手機(jī)橱赠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箫津,“玉大人狭姨,你說(shuō)我怎么就攤上這事宰啦。” “怎么了饼拍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵赡模,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我师抄,道長(zhǎng)漓柑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任叨吮,我火速辦了婚禮欺缘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挤安。我一直安慰自己谚殊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蛤铜。 她就那樣靜靜地躺著嫩絮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪围肥。 梳的紋絲不亂的頭發(fā)上剿干,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音穆刻,去河邊找鬼置尔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氢伟,可吹牛的內(nèi)容都是我干的榜轿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朵锣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谬盐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诚些,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤飞傀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后诬烹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體砸烦,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年绞吁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幢痘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掀泳,死狀恐怖雪隧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情员舵,我是刑警寧澤脑沿,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站马僻,受9級(jí)特大地震影響庄拇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韭邓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一措近、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧女淑,春花似錦瞭郑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至袱巨,卻和暖如春阁谆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愉老。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工场绿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫉入。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓焰盗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親咒林。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姨谷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 計(jì)算機(jī)網(wǎng)絡(luò)七層模型中,傳輸層有兩個(gè)重要的協(xié)議:(1)用戶數(shù)據(jù)報(bào)協(xié)議UDP (User Datagram Proto...
    Q南南南Q閱讀 1,714評(píng)論 0 3
  • 本書(shū)結(jié)構(gòu)是自頂向下的映九,所以請(qǐng)按下列順序閱讀: 1.計(jì)算機(jī)網(wǎng)絡(luò)自頂向下--應(yīng)用層2.計(jì)算機(jī)網(wǎng)絡(luò)自頂向下--運(yùn)輸層3....
    牛富貴兒閱讀 2,758評(píng)論 0 3
  • 1.這篇文章不是本人原創(chuàng)的梦湘,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,063評(píng)論 6 174
  • 個(gè)人認(rèn)為件甥,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記捌议,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評(píng)論 0 8
  • 傳輸層-TCP, TCP頭部結(jié)構(gòu) 引有,TCP序列號(hào)和確認(rèn)號(hào)詳解 TCP主要解決下面的三個(gè)問(wèn)題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,516評(píng)論 1 46