TCP滑動(dòng)窗口和流控

TCP的滑動(dòng)窗口是一個(gè)很重要的概念代虾,也是很晦澀的一個(gè)知識(shí)點(diǎn)谋减。下面就大概介紹下TCP滑動(dòng)窗口為什么出現(xiàn)灿意?它是怎么工作的的估灿?

什么是TCP窗口

首先,要理解缤剧,client和server各自協(xié)議棧都有自己的buffer馅袁,應(yīng)用層讀寫數(shù)據(jù)的源都是協(xié)議棧buffer里。以接收端為例鞭执,應(yīng)用程序調(diào)用read()時(shí),會(huì)從buffer里移走數(shù)據(jù)到用戶空間芒粹,應(yīng)用程序讀的速度越快(read(1024)必然比read(1)要快)兄纺,那么buffer里的內(nèi)容消費(fèi)的越快,buffer也會(huì)越空化漆。那么TCP就可以告訴client估脆,我現(xiàn)在很閑,你可以發(fā)送更多的數(shù)據(jù)來座云。"更多"是多少疙赠?這就說窗口,窗口就是量化接收端和服務(wù)端當(dāng)前能處理數(shù)據(jù)的能力朦拖。

TCP窗口是如何工作的

client和server端建立連接后圃阳,client會(huì)告訴server,自己的"接收窗口"大小(自己能接收多少的數(shù)據(jù)璧帝,受上面所說的buffer影響)捍岳,server端接收到client的"接收窗口"大小,就會(huì)變成server端自己的"發(fā)送窗口"大小。同樣的锣夹,server端告訴client自己的"接收窗口"大小页徐,就會(huì)變成客戶端的"發(fā)送窗口"大小。

為了理解TCP的窗口大小是怎么樣變化的银萍,我們先需要理解它的含義变勇。最簡(jiǎn)單的方式就是認(rèn)為窗口大小"意味著接收方能接收數(shù)據(jù)的大小",這也是說接收端設(shè)備再應(yīng)用程序讀取buffer中數(shù)據(jù)之前贴唇,能從對(duì)端連接處理多少數(shù)據(jù)搀绣。比如說server端窗口大小是360,那么就意味著server端一次只能從客戶端接收不超過360bytes的數(shù)據(jù)滤蝠。當(dāng)server端收到數(shù)據(jù)豌熄,它會(huì)將數(shù)據(jù)放到buffer里,然后server端必須對(duì)這份數(shù)據(jù)做兩件事

1. server端必須發(fā)送一個(gè) ACK 到client端來確認(rèn)數(shù)據(jù)已經(jīng)收到

2. server端必須處理這份數(shù)據(jù)物咳,把它交給對(duì)應(yīng)的應(yīng)用程序

要區(qū)分上面兩件事對(duì)理解窗口很重要锣险,接收方收到數(shù)據(jù)后會(huì)確認(rèn),但是數(shù)據(jù)并不一定是里面就是從buffer里取出的览闰,這是受應(yīng)用層邏輯控制的芯肤。所以很有可能如果接收數(shù)據(jù)過快,而取出數(shù)據(jù)更慢压鉴,就會(huì)導(dǎo)致buffer滿崖咨。一旦這種情況發(fā)生,窗口大小就開始調(diào)整來防止接收方負(fù)載過高油吭。

正是因?yàn)榇翱诖笮〉恼{(diào)整可以用來調(diào)節(jié)數(shù)據(jù)傳輸?shù)乃俾驶鞫祝跃涂梢詫?shí)現(xiàn)TCP的流控,在傳輸層的流控就是典型的例子婉宰,流控對(duì)于TCP的通信是很重要的歌豺,通過增大或者減小窗口的大小,client和server各自確保彼此設(shè)備發(fā)數(shù)據(jù)和收數(shù)據(jù)平衡心包。

通過TCP窗口實(shí)現(xiàn)流控

下面舉一個(gè)例子类咧,來看TCP窗口大小變化怎樣實(shí)現(xiàn)流控。client端和server端已經(jīng)三次握手建立TCP連接蟹腾,總窗口大小是TCP建立連接時(shí)候確定的痕惋。黑色框代表client和server總的窗口大小,紅色框代表實(shí)際可用的窗口大小娃殖。初始化的時(shí)候默認(rèn)client和server總窗口和可用端口分別都是360值戳。另外,假設(shè)Client總共只發(fā)送360bytes數(shù)據(jù)炉爆,所以總窗口大小不會(huì)往前移動(dòng)述寡。


client 發(fā)送140bytes到server端柿隙,Seq=1,Length=140鲫凶;可用窗口大小往前移動(dòng)禀崖,變成260bytes,總窗口大小不變螟炫,依然是360波附。這中間的120是已發(fā)送,等待確認(rèn);

server端收到140bytes昼钻,放入buffer中掸屡,但是應(yīng)用程序很繁忙,只取出100個(gè)字節(jié)然评。這時(shí)候可用窗口大小: 260(360-100)仅财。接著server端要給client發(fā)確認(rèn),Ack=141碗淌,Window=260盏求。黑框左邊緣向前移動(dòng),表示140字節(jié)已經(jīng)確認(rèn)收到亿眠,但是應(yīng)用程序太慢碎罚,處理很忙導(dǎo)致我現(xiàn)在只能處理260bytes(回顧下上面server端收到數(shù)據(jù)要做的兩件事);

client收到來自server端的ack回應(yīng),首先總窗口左邊緣向前移動(dòng)纳像,表示第一步的140bytes server已經(jīng)收到荆烈,剩下260數(shù)據(jù)。接著被告知server的可接收窗口是260竟趾,client就調(diào)整自己的發(fā)送窗口是260憔购,表示一次發(fā)數(shù)據(jù)不能超過260;

client發(fā)送180bytes,可用窗口變成80(260-180)岔帽,等待確認(rèn)發(fā)送的180bytes;

server收到180bytes玫鸟,放入buffer中,應(yīng)用程序依然很繁忙山卦,這次一個(gè)字節(jié)都不處理鞋邑。此時(shí)可用窗口大小:80(260-180)诵次,然后發(fā)180 ack給client账蓉,并告知窗口大小80;

client收到ack,確認(rèn)之前發(fā)送的180已經(jīng)到達(dá)逾一,剩余數(shù)據(jù)還有80字節(jié)铸本。被告知server端接收窗口大小是80,調(diào)整自己的發(fā)送窗口大小為80

client發(fā)送80bytes遵堵,可用窗口變成0(80-80)箱玷,等待確認(rèn)發(fā)送的80bytes;

server收到180bytes怨规,放入buffer中,應(yīng)用程序依然很繁忙锡足,一個(gè)字節(jié)都不處理波丰。此時(shí)可用窗口大小:80(80-80),然后發(fā)80 ack給client舶得,并告知窗口大小0;

client收到ack掰烟,確認(rèn)之前發(fā)送的80已經(jīng)到達(dá)。被告知server端接收窗口大小是0沐批,調(diào)整自己的發(fā)送窗口大小為0纫骑,此時(shí)無論client是否還有數(shù)據(jù)要發(fā)送,都不能再發(fā)了九孩。

總結(jié)

窗口就是量化接收端和服務(wù)端當(dāng)前能處理數(shù)據(jù)的能力先馆。個(gè)人理解,如發(fā)現(xiàn)接收端的窗口越來越小躺彬,或者越來越大煤墙,都可能會(huì)有問題。

1. 接收端的窗口越來越小,那么就是接收端處理不過來(1.發(fā)的程序太快癣疟,太多;2.收的程序太慢深寥,太少;3.發(fā)端帶寬比收端帶寬更大),會(huì)導(dǎo)致接收端發(fā)送給發(fā)送端的窗口變小设预,從而發(fā)送端調(diào)整發(fā)送窗口大小,降低發(fā)送速度犁河,網(wǎng)絡(luò)流量就會(huì)下降鳖枕。

2. 接收端的窗口越來越大,那么就是發(fā)送端處理不過來(1.收的程序太快桨螺,太多;2.發(fā)的程序太慢宾符,太少;3.發(fā)端帶寬比收端帶寬更小),會(huì)導(dǎo)致接收端發(fā)送給發(fā)送端的窗口變大灭翔,從而發(fā)送端調(diào)整發(fā)送窗口大小魏烫,增加發(fā)送速度,網(wǎng)絡(luò)流量就會(huì)升高肝箱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哄褒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煌张,更是在濱河造成了極大的恐慌呐赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骏融,死亡現(xiàn)場(chǎng)離奇詭異链嘀,居然都是意外死亡萌狂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門怀泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茫藏,“玉大人,你說我怎么就攤上這事霹琼∷⒃剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵碧囊,是天一觀的道長(zhǎng)树灶。 經(jīng)常有香客問我,道長(zhǎng)糯而,這世上最難降的妖魔是什么天通? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮熄驼,結(jié)果婚禮上像寒,老公的妹妹穿的比我還像新娘。我一直安慰自己瓜贾,他們只是感情好诺祸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祭芦,像睡著了一般筷笨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上龟劲,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天胃夏,我揣著相機(jī)與錄音,去河邊找鬼昌跌。 笑死仰禀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚕愤。 我是一名探鬼主播答恶,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼萍诱!你這毒婦竟也來了悬嗓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤砂沛,失蹤者是張志新(化名)和其女友劉穎烫扼,沒想到半個(gè)月后曙求,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍庵,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡映企,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了静浴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堰氓。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苹享,靈堂內(nèi)的尸體忽然破棺而出双絮,到底是詐尸還是另有隱情,我是刑警寧澤得问,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布囤攀,位于F島的核電站,受9級(jí)特大地震影響宫纬,放射性物質(zhì)發(fā)生泄漏焚挠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一漓骚、第九天 我趴在偏房一處隱蔽的房頂上張望蝌衔。 院中可真熱鬧,春花似錦蝌蹂、人聲如沸噩斟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剃允。三九已至,卻和暖如春齐鲤,著一層夾襖步出監(jiān)牢的瞬間硅急,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工佳遂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留营袜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓丑罪,卻偏偏與公主長(zhǎng)得像荚板,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吩屹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 傳輸層-TCP跪另, TCP頭部結(jié)構(gòu) ,TCP序列號(hào)和確認(rèn)號(hào)詳解 TCP主要解決下面的三個(gè)問題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,522評(píng)論 1 46
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理煤搜,服務(wù)發(fā)現(xiàn)免绿,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 第一層:物理層第二層:數(shù)據(jù)鏈路層 802.2擦盾、802.3ATM嘲驾、HDLC淌哟、FRAME RELAY第三層:網(wǎng)絡(luò)層 I...
    Joe_HUST閱讀 19,243評(píng)論 2 3
  • 最近在惡補(bǔ)計(jì)算機(jī)網(wǎng)絡(luò)方面的知識(shí),之前對(duì)于TCP的三次握手和四次分手也是模模糊糊辽故,對(duì)于其中的細(xì)節(jié)更是渾然不知徒仓,最近看...
    微醺歲月閱讀 9,531評(píng)論 4 128
  • 計(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