可靠傳輸?shù)膶?shí)現(xiàn) (六)

TCP協(xié)議作為一個(gè)可靠的面向流的傳輸協(xié)議雅潭,其可靠性和流量控制由滑動(dòng)窗口協(xié)議保證鸽凶,而擁塞控制則由控制窗口結(jié)合一系列的控制算法實(shí)現(xiàn)笤休。

一奏甫、滑動(dòng)窗口協(xié)議
關(guān)于這部分自己不曉得怎么敘述才好戈轿,因?yàn)槔斫獾牟糠指啵旅婢陀米约旱睦斫鈦斫榻B下TCP的精髓:滑動(dòng)窗口協(xié)議阵子。 所謂滑動(dòng)窗口協(xié)議思杯,自己理解有兩點(diǎn):1. “窗口”對(duì)應(yīng)的是一段可以被發(fā)送者發(fā)送的字節(jié)序列,其連續(xù)的范圍稱之為“窗口”挠进;2. “滑動(dòng)”則是指這段“允許發(fā)送的范圍”是可以隨著發(fā)送的過程而變化的色乾,方式就是按順序“滑動(dòng)”。在引入一個(gè)例子來說這個(gè)協(xié)議之前领突,我覺得很有必要先了解以下前提:-1. TCP協(xié)議的兩端分別為發(fā)送者A和接收者B暖璧,由于是全雙工協(xié)議,因此A和B應(yīng)該分別維護(hù)著一個(gè)獨(dú)立的發(fā)送緩沖區(qū)和接收緩沖區(qū)君旦,由于對(duì)等性(A發(fā)B收和B發(fā)A收)澎办,我們以A發(fā)送B接收的情況作為例子;-2. 發(fā)送窗口是發(fā)送緩存中的一部分金砍,是可以被TCP協(xié)議發(fā)送的那部分局蚀,其實(shí)應(yīng)用層需要發(fā)送的所有數(shù)據(jù)都被放進(jìn)了發(fā)送者的發(fā)送緩沖區(qū);-3. 發(fā)送窗口中相關(guān)的有四個(gè)概念:已發(fā)送并收到確認(rèn)的數(shù)據(jù)(不再發(fā)送窗口和發(fā)送緩沖區(qū)之內(nèi))捞魁、已發(fā)送但未收到確認(rèn)的數(shù)據(jù)(位于發(fā)送窗口之中)至会、允許發(fā)送但尚未發(fā)送的數(shù)據(jù)以及發(fā)送窗口外發(fā)送緩沖區(qū)內(nèi)暫時(shí)不允許發(fā)送的數(shù)據(jù);-4. 每次成功發(fā)送數(shù)據(jù)之后谱俭,發(fā)送窗口就會(huì)在發(fā)送緩沖區(qū)中按順序移動(dòng),將新的數(shù)據(jù)包含到窗口中準(zhǔn)備發(fā)送宵蛀; TCP建立連接的初始昆著,B會(huì)告訴A自己的接收窗口大小,比如為‘20’: 字節(jié)31-50為發(fā)送窗口

A發(fā)送11個(gè)字節(jié)后术陶,發(fā)送窗口位置不變凑懂,B接收到了亂序的數(shù)據(jù)分組:
只有當(dāng)A成功發(fā)送了數(shù)據(jù),即發(fā)送的數(shù)據(jù)得到了B的確認(rèn)之后梧宫,才會(huì)移動(dòng)滑動(dòng)窗口離開已發(fā)送的數(shù)據(jù)接谨;同時(shí)B則確認(rèn)連續(xù)的數(shù)據(jù)分組摆碉,對(duì)于亂序的分組則先接收下來,避免網(wǎng)絡(luò)重復(fù)傳遞:

**二脓豪、流量控制 **
流量控制方面主要有兩個(gè)要點(diǎn)需要掌握巷帝。一是TCP利用滑動(dòng)窗口實(shí)現(xiàn)流量控制的機(jī)制;二是如何考慮流量控制中的傳輸效率扫夜。

  1. 流量控制
    所謂流量控制楞泼,主要是接收方傳遞信息給發(fā)送方,使其不要發(fā)送數(shù)據(jù)太快笤闯,是一種端到端的控制堕阔。主要的方式就是返回的ACK中會(huì)包含自己的接收窗口的大小,并且利用大小來控制發(fā)送方的數(shù)據(jù)發(fā)送:
    這里面涉及到一種情況颗味,如果B已經(jīng)告訴A自己的緩沖區(qū)已滿超陆,于是A停止發(fā)送數(shù)據(jù);等待一段時(shí)間后浦马,B的緩沖區(qū)出現(xiàn)了富余时呀,于是給A發(fā)送報(bào)文告訴A我的rwnd大小為400,但是這個(gè)報(bào)文不幸丟失了捐韩,于是就出現(xiàn)A等待B的通知||B等待A發(fā)送數(shù)據(jù)的死鎖狀態(tài)退唠。為了處理這種問題,TCP引入了持續(xù)計(jì)時(shí)器(Persistence timer)荤胁,當(dāng)A收到對(duì)方的零窗口通知時(shí)瞧预,就啟用該計(jì)時(shí)器,時(shí)間到則發(fā)送一個(gè)1字節(jié)的探測(cè)報(bào)文仅政,對(duì)方會(huì)在此時(shí)回應(yīng)自身的接收窗口大小垢油,如果結(jié)果仍未0,則重設(shè)持續(xù)計(jì)時(shí)器圆丹,繼續(xù)等待滩愁。
  2. 傳遞效率
    一個(gè)顯而易見的問題是:單個(gè)發(fā)送字節(jié)單個(gè)確認(rèn),和窗口有一個(gè)空余即通知發(fā)送方發(fā)送一個(gè)字節(jié)辫封,無疑增加了網(wǎng)絡(luò)中的許多不必要的報(bào)文(請(qǐng)想想為了一個(gè)字節(jié)數(shù)據(jù)而添加的40字節(jié)頭部吧O跬鳌),所以我們的原則是盡可能一次多發(fā)送幾個(gè)字節(jié)倦微,或者窗口空余較多的時(shí)候通知發(fā)送方一次發(fā)送多個(gè)字節(jié)妻味。對(duì)于前者我們廣泛使用Nagle算法,即:1. 若發(fā)送應(yīng)用進(jìn)程要把發(fā)送的數(shù)據(jù)逐個(gè)字節(jié)地送到TCP的發(fā)送緩存欣福,則發(fā)送方就把第一個(gè)數(shù)據(jù)字節(jié)先發(fā)送出去责球,把后面的字節(jié)先緩存起來;2. 當(dāng)發(fā)送方收到第一個(gè)字節(jié)的確認(rèn)后(也得到了網(wǎng)絡(luò)情況和對(duì)方的接收窗口大小)雏逾,再把緩沖區(qū)的剩余字節(jié)組成合適大小的報(bào)文發(fā)送出去嘉裤;*3. 當(dāng)?shù)竭_(dá)的數(shù)據(jù)已達(dá)到發(fā)送窗口大小的一半或以達(dá)到報(bào)文段的最大長度時(shí),就立即發(fā)送一個(gè)報(bào)文段栖博; 對(duì)于后者我們往往的做法是讓接收方等待一段時(shí)間屑宠,或者接收方獲得足夠的空間容納一個(gè)報(bào)文段或者等到接受緩存有一半空閑的時(shí)候,再通知發(fā)送方發(fā)送數(shù)據(jù)笛匙。三侨把、擁塞控制 網(wǎng)絡(luò)中的鏈路容量和交換結(jié)點(diǎn)中的緩存和處理機(jī)都有著工作的極限,當(dāng)網(wǎng)絡(luò)的需求超過它們的工作極限時(shí)妹孙,就出現(xiàn)了擁塞秋柄。擁塞控制就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載蠢正。

常用的方法就是:1. 慢開始骇笔、擁塞控制 2. 快重傳、快恢復(fù) 一切的基礎(chǔ)還是慢開始嚣崭,這種方法的思路是這樣的:-1. 發(fā)送方維持一個(gè)叫做“擁塞窗口”的變量笨触,該變量和接收端口共同決定了發(fā)送者的發(fā)送窗口;-2. 當(dāng)主機(jī)開始發(fā)送數(shù)據(jù)時(shí)雹舀,避免一下子將大量字節(jié)注入到網(wǎng)絡(luò)芦劣,造成或者增加擁塞,選擇發(fā)送一個(gè)1字節(jié)的試探報(bào)文说榆;-3. 當(dāng)收到第一個(gè)字節(jié)的數(shù)據(jù)的確認(rèn)后虚吟,就發(fā)送2個(gè)字節(jié)的報(bào)文;-4. 若再次收到2個(gè)字節(jié)的確認(rèn)签财,則發(fā)送4個(gè)字節(jié)串慰,依次遞增2的指數(shù)級(jí);-5. 最后會(huì)達(dá)到一個(gè)提前預(yù)設(shè)的“慢開始門限”唱蒸,比如24邦鲫,即一次發(fā)送了24個(gè)分組,此時(shí)遵循下面的條件判定:1. cwnd < ssthresh神汹, 繼續(xù)使用慢開始算法庆捺;2. cwnd > ssthresh,停止使用慢開始算法屁魏,改用擁塞避免算法疼燥;3. cwnd = ssthresh,既可以使用慢開始算法蚁堤,也可以使用擁塞避免算法;-6. 所謂擁塞避免算法就是:每經(jīng)過一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口+1,即讓擁塞窗口緩慢地增大披诗,按照線性規(guī)律增長撬即;-7. 當(dāng)出現(xiàn)網(wǎng)絡(luò)擁塞,比如丟包時(shí)呈队,將慢開始門限設(shè)為原先的一半剥槐,然后將cwnd設(shè)為1,執(zhí)行慢開始算法(較低的起點(diǎn)宪摧,指數(shù)級(jí)增長)粒竖;


上述方法的目的是在擁塞發(fā)生時(shí)循序減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠的時(shí)間把隊(duì)列中積壓的分組處理完畢几于。慢開始和擁塞控制算法常常作為一個(gè)整體使用蕊苗,而快重傳和快恢復(fù)則是為了減少因?yàn)閾砣麑?dǎo)致的數(shù)據(jù)包丟失帶來的重傳時(shí)間,從而避免傳遞無用的數(shù)據(jù)到網(wǎng)絡(luò)沿彭⌒嗯椋快重傳的機(jī)制是:-1. 接收方建立這樣的機(jī)制,如果一個(gè)包丟失喉刘,則對(duì)后續(xù)的包繼續(xù)發(fā)送針對(duì)該包的重傳請(qǐng)求瞧柔;-2. 一旦發(fā)送方接收到三個(gè)一樣的確認(rèn),就知道該包之后出現(xiàn)了錯(cuò)誤睦裳,立刻重傳該包造锅;-3. 此時(shí)發(fā)送方開始執(zhí)行“快恢復(fù)”算法:
1. 慢開始門限減半;2. cwnd設(shè)為慢開始門限減半后的數(shù)值廉邑;3. 執(zhí)行擁塞避免算法(高起點(diǎn)哥蔚,線性增長);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬓催,一起剝皮案震驚了整個(gè)濱河市肺素,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宇驾,老刑警劉巖倍靡,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異课舍,居然都是意外死亡塌西,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門筝尾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捡需,“玉大人,你說我怎么就攤上這事筹淫≌净裕” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饰剥。 經(jīng)常有香客問我殊霞,道長,這世上最難降的妖魔是什么汰蓉? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任绷蹲,我火速辦了婚禮,結(jié)果婚禮上顾孽,老公的妹妹穿的比我還像新娘祝钢。我一直安慰自己,他們只是感情好若厚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布拦英。 她就那樣靜靜地躺著,像睡著了一般盹沈。 火紅的嫁衣襯著肌膚如雪龄章。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天乞封,我揣著相機(jī)與錄音做裙,去河邊找鬼。 笑死肃晚,一個(gè)胖子當(dāng)著我的面吹牛锚贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播关串,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拧廊,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了晋修?” 一聲冷哼從身側(cè)響起吧碾,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墓卦,沒想到半個(gè)月后倦春,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡落剪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年睁本,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忠怖。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呢堰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凡泣,到底是詐尸還是另有隱情枉疼,我是刑警寧澤皮假,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站往衷,受9級(jí)特大地震影響钞翔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜席舍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哮笆。 院中可真熱鬧来颤,春花似錦、人聲如沸稠肘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项阴。三九已至滑黔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間环揽,已是汗流浹背略荡。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歉胶,地道東北人汛兜。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像通今,于是被迫代替她去往敵國和親粥谬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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