原文鏈接:
TCP的流量控制
1.TCP的滑動(dòng)窗口
為了提高信道的利用率TCP協(xié)議不使用停止等待協(xié)議,而是使用連續(xù)ARQ協(xié)議卓起,意思就是可以連續(xù)發(fā)出若干個(gè)分組然后等待確認(rèn),而不是發(fā)送一個(gè)分組就停止并等待該分組的確認(rèn)。
TCP的兩端都有發(fā)送/接收緩存和發(fā)送/接收窗口爪飘。TCP的緩存是一個(gè)循環(huán)隊(duì)列梧喷,其中發(fā)送窗口可以用3個(gè)指針表示砌左。而發(fā)送窗口的大小受TCP數(shù)據(jù)報(bào)中窗口大小的影響,TCP數(shù)據(jù)報(bào)中的窗口大小是接收端通知發(fā)送端其還可以接收多少數(shù)據(jù)铺敌,所以發(fā)送窗口根據(jù)接收的的窗口大小的值動(dòng)態(tài)變化汇歹。
以下的幾張圖片就幫助理解一下滑動(dòng)窗口的機(jī)制:
注意上圖中的3個(gè)指針P1、P2偿凭、P3产弹!此時(shí)接收窗口中接收的數(shù)據(jù)可能是失序的,但是也先存儲(chǔ)在接收緩存之中弯囊。發(fā)送確認(rèn)號(hào)的時(shí)候依然發(fā)送31痰哨,表示B期望接收的下一個(gè)數(shù)據(jù)報(bào)的標(biāo)示符是31。
當(dāng)B收到31后連同之前接收到的數(shù)據(jù)報(bào)匾嘱,發(fā)送確認(rèn)號(hào)34斤斧,此時(shí)A的滑動(dòng)窗口可以向前移動(dòng)了。
如果發(fā)送窗口中的數(shù)據(jù)報(bào)都屬于已發(fā)送但未被確認(rèn)的話霎烙,那么A就不能再繼續(xù)發(fā)送數(shù)據(jù)撬讽,而需要進(jìn)行等待。
2.TCP流量控制
所謂流量控制就是讓發(fā)送發(fā)送速率不要過快悬垃,讓接收方來得及接收游昼。利用滑動(dòng)窗口機(jī)制就可以實(shí)施流量控制。
原理這就是運(yùn)用TCP報(bào)文段中的窗口大小字段來控制尝蠕,發(fā)送方的發(fā)送窗口不可以大于接收方發(fā)回的窗口大小烘豌。
考慮一種特殊的情況,就是接收方若沒有緩存足夠使用看彼,就會(huì)發(fā)送零窗口大小的報(bào)文扇谣,此時(shí)發(fā)送方將發(fā)送窗口設(shè)置為0,停止發(fā)送數(shù)據(jù)闲昭。之后接收方有足夠的緩存罐寨,發(fā)送了非零窗口大小的報(bào)文,但是這個(gè)報(bào)文在中途丟失的序矩,那么發(fā)送方的發(fā)送窗口就一直為零導(dǎo)致死鎖鸯绿。
解決這個(gè)問題,TCP為每一個(gè)連接設(shè)置一個(gè)持續(xù)計(jì)時(shí)器(persistence timer)。只要TCP的一方收到對(duì)方的零窗口通知瓶蝴,就啟動(dòng)該計(jì)時(shí)器毒返,周期性的發(fā)送一個(gè)零窗口探測(cè)報(bào)文段。對(duì)方就在確認(rèn)這個(gè)報(bào)文的時(shí)候給出現(xiàn)在的窗口大邢鲜帧(注意:TCP規(guī)定拧簸,即使設(shè)置為零窗口,也必須接收以下幾種報(bào)文段:零窗口探測(cè)報(bào)文段男窟、確認(rèn)報(bào)文段和攜帶緊急數(shù)據(jù)的報(bào)文段)盆赤。
3.傳輸效率及Nagle算法
TCP的數(shù)據(jù)傳輸分為交互數(shù)據(jù)流和成塊數(shù)據(jù)流,交互數(shù)據(jù)流一般是一些交互式應(yīng)用程序的命令歉眷,所以這些數(shù)據(jù)很小牺六,而考慮到TCP報(bào)頭和IP報(bào)頭的總和就有40字節(jié),如果數(shù)據(jù)量很小的話汗捡,那么網(wǎng)絡(luò)的利用效率就較低淑际。
數(shù)據(jù)傳輸使用Nagle算法,Nagle算法很簡(jiǎn)單扇住,就是規(guī)定一個(gè)TCP連接最多只能有一個(gè)未被確認(rèn)的未完成的小分組春缕。在該分組的確認(rèn)到達(dá)之前不能發(fā)送其他的小分組。
但是也要考慮另一個(gè)問題艘蹋,叫做糊涂窗口綜合癥锄贼。當(dāng)接收方的緩存已滿的時(shí)候,交互應(yīng)用程序一次只從緩存中讀取一個(gè)字節(jié)(這時(shí)候緩存中騰出一個(gè)字節(jié))簿训,然后向發(fā)送方發(fā)送確認(rèn)信息咱娶,此時(shí)發(fā)送方再發(fā)送一個(gè)字節(jié)(收到的窗口大小為1)米间,這樣網(wǎng)絡(luò)的效率很低强品。
素以要解決這個(gè)問題,可以讓接收方等待一段時(shí)間屈糊,使得接收緩存已有最夠的空間容納一個(gè)最長(zhǎng)報(bào)文段的榛,或者等到接收緩存已有一半的空間。只要這兩種情況出現(xiàn)一種逻锐,就發(fā)送確認(rèn)報(bào)文夫晌,同時(shí)發(fā)送方可以把數(shù)據(jù)積累成大的報(bào)文段發(fā)送。