(運輸層)TCP的流量控制

2021-08-08 11:20:23 字數 2189 閱讀 7876

流量控制:讓傳送方的傳送速率不要太快,要讓接收方來得及接收。

注意:傳送方的傳送視窗不能超過接收方給出的接收視窗的數值。

tcp的視窗單位是位元組,不是報文段。

如圖所示,說明了利用可變視窗大小進行流量控制。設主機a向主機b傳送資料。雙方確定的視窗值是400.再設每乙個報文段為100位元組長,序號的初始值為seq=1。  

接收方的主機b進行了三次流量控制。第一次把視窗設定為rwind=300,第二次減小到rwind=100最後減到rwind=0,即不允許傳送方再傳送過資料了。這種使傳送方暫停傳送的狀態將持續到主機b重新發出乙個新的視窗值為止。

假如,b向a傳送了零視窗的報文段後不久,b的接收快取又有了一些儲存空間。於是b向a傳送了rwind=400的報文段,然而這個報文段在傳送中丟失了。a一直等待收到b傳送的非零視窗的通知,而b也一直等待a傳送的資料。這樣就死鎖了。為了解決這種死鎖狀態,tcp為每個連線設有乙個持續計時器。只要tcp連線的一方收到對方的零視窗通知,就啟動持續計時器,若持續計時器設定的時間到期,就傳送乙個零視窗探測報文段(僅攜帶1位元組的資料),而對方就在確認這個探測報文段時給出了現在的視窗值。

必須考慮傳輸效率:

如何控制tcp傳送報文段的時機?

nagle演算法的基本定義是任意時刻,最多只能有乙個未被確認的小段。 所謂「小段」,指的是小於mss尺寸的資料塊,所謂「未被確認」,是指乙個資料塊傳送出去後,沒有收到對方傳送的ack確認該資料已收到。

nagle演算法的規則:

(1)如果包長度達到mss,則允許傳送;

(2)如果該包含有fin,則允許傳送;

(3)設定了tcp_nodelay選項,則允許傳送;

(4)未設定tcp_cork選項時,若所有發出去的小資料報(包長度小於mss)均被確認,則允許傳送;

(5)上述條件都未滿足,但發生了超時(一般為200ms),則立即傳送。

糊塗視窗綜合症:

糊塗視窗綜合症是指當傳送端應用程序產生資料很慢、或接收端應用程序處理接收緩衝區資料很慢,或二者兼而有之;就會使應用程序間傳送的報文段很小,特別是有效載荷很小; 極端情況下,有效載荷可能只有1個位元組;傳輸開銷有40位元組(20位元組的ip頭+20位元組的tcp頭) 這種現象。

如果傳送端為產生資料很慢的應用程式服務(典型的有telnet應用),例如,一次產生乙個位元組。這個應用程式一次將乙個位元組的資料寫入傳送端的tcp的快取。如果傳送端的tcp沒有特定的指令,它就產生只包括乙個位元組資料的報文段。結果有很多41位元組的ip資料報就在互連網中傳來傳去。

解決的方法是防止傳送端的tcp逐個位元組地傳送資料。必須強迫傳送端的tcp收集資料,然後用乙個更大的資料塊來傳送。傳送端的tcp要等待多長時間呢?如果它等待過長,它就會使整個的過程產生較長的時延。如果它的等待時間不夠長,它就可能傳送較小的報文段。nagle找到了乙個很好的解決方法,發明了nagle演算法。

接收端的tcp可能產生糊塗視窗綜合症,如果它為消耗資料很慢的應用程式服務,例如,一次消耗乙個位元組。假定傳送應用程式產生了1000位元組的資料塊,但接收應用程式每次只吸收1位元組的資料。再假定接收端的tcp的輸入快取為4000位元組。傳送端先傳送第乙個4000位元組的資料。接收端將它儲存在其快取中。現在快取滿了。它通知視窗大小為零,這表示傳送端必須停止傳送資料。接收應用程式從接收端的tcp的輸入快取中讀取第乙個位元組的資料。在入快取中現在有了1位元組的空間。接收端的tcp宣布其視窗大小為1位元組,這表示正渴望等待傳送資料的傳送端的tcp會把這個宣布當作乙個好訊息,並傳送只包括乙個位元組資料的報文段。這樣的過程一直繼續下去。乙個位元組的資料被消耗掉,然後傳送只包含乙個位元組資料的報文段。

對於這種糊塗視窗綜合症,即應用程式消耗資料比到達的慢,有兩種建議的解決方法。

1.clark解決方法

clark解決方法是只要有資料到達就傳送確認,但宣布的視窗大小為零,直到或者快取空間已能放入具有最大長度的報文段,或者快取空間的一半已經空了。

2.延遲確認

這表示當乙個報文段到達時並不立即傳送確認。接收端在確認收到的報文段之前一直等待,直到入快取有足夠的空間為止。延遲的確認防止了傳送端的tcp滑動其視窗。當傳送端的tcp傳送完其資料後,它就停下來了。這樣就防止了這種症狀。遲延的確認還有另乙個優點:它減少了通訊量。接收端不需要確認每乙個報文段。但它也有乙個缺點,就是遲延的確認有可能迫使傳送端重傳其未被確認的報文段。可以用協議來平衡這個優點和缺點,例如現在定義了確認的延遲不能超過500毫秒。

運輸層 TCP的流量控制

a向b傳送資料,在連線建立的時候,b就會首先告訴a 我的接收視窗rwnd receiver window 是400,同時我們要注意的是tcp的視窗單位是位元組,而不是報文段,預設每個報文段都是100位元組大小。我們從圖中可以分析到 a向b傳送了序號1到100的報文段,seq表示序號,接著傳送101到...

白話TCP運輸控制 二 TCP的流量控制

上篇講的是擁塞控制,這篇講流量控制。還是以運輸糧食為場景。雖然運輸的擁塞控制能夠在運輸效率和擁塞之間達到平衡,但是運輸糧食的整體效率還受乙個關鍵因數影響,那就是對岸西村糧食的卸貨能力。假設糧食運送到對岸後,要卸放在乙個倉庫裡,隨後被運往其他地方。如果運輸的太快,倉庫載貨能力有限,糧食又沒有及時被消耗...

TCP流量控制

一般來說,我們總是希望資料傳輸的更快一些,但如果傳送方把資料傳送的很快,而接收方來不及接收,這就可能造成資料的丟失。流量控制就是讓傳送方的傳送速率不要太快,讓接收方來得及接收。對於成塊資料流,tcp利用滑動視窗機制來實現流量的控制,對於互動資料流,tcp利用捎帶ack和nagle演算法來實現流量的控...