1 控制數據包大小,需要在三次握手時確定。控制該值可以精確流量控制,好比答應每次發送的數據包最大是3000Bytes,這個值取決於接收方和發送方的網路MTU,理論值是65536bytes = 64k, 這個值設置在流量控制值的1.5倍左右有利於精確地流量控制。
2 控制發送方的 梗阻窗口,梗阻窗口表示答應發送方一次連續發送多大的數據,假如這個值是 30k, 且答應每次發送的數據包的最大長度是1K,那表示發送方可以連續發送30個數據包再等接收方的ACK應答。梗阻窗口是動態變化的,當知足一定前提時發送方就會自動調整該窗口的大小,好比在建立三次握手的時候,會通過“慢啟動算法”來確定該值,在傳輸數據時,當發現收到很多相同的應答包時,或者確認接收方應答包超時的時候,發送方就會調整該窗口了,這個窗口在流量控制上的意義:好比我們流量控制時5K/S,但發送方一次是發送30K的數據,表示當我們收到5K的數據時,進入流量控制,那接下來網絡中可能還有一些數據包在傳輸,假如這些數據包丟掉的話會占用少些帶寬,假如繼承被我們接收的話可能影響流量控制的精確性。接收方可以通過延遲ACK包的發送,或者直接丟包來使發送方動態修改梗阻窗口。
3 要流量控制時,
1)發送一個WIN = 0的ACK包,丟掉最後收到的包,接下來每收到的包都丟掉並發一個ACK應答包
2)發送一個WIN = 0的ACK包,接收最後收到的包,接下來每收到的包都接收並發一個ACK應答包,WIN = 0
丟包會鋪張帶寬,這樣的流量控制顯然意義不大,所以采用方案2),這樣可能會降低流量控制的精確性,但也避免帶寬的鋪張。
4 進入流量控制的時候,還答應系統發送ACK應答包嗎?
系統在倆種情況下會發送ACK應答包
1) 當接收緩存為0時,這時候應該通知發送方,讓發送方休止發送數據包以免梗阻網絡,由於接收窗口為0時表示主機暫時沒有更多的緩沖區來處理來自網絡的數據包
2)從收到第一個數據包開始,每隔200毫秒都會發送一個ACK應答包,當然通過系統設置來改變發送ACK應答包的頻率。200毫秒這個值可以通過注冊表值TcpDelAckTicks 來修改,但一般建議不要大於500毫秒。(適合2000 SP3 系統)。2000以上系統:TcpAckFrequency,n表示200毫秒內每收到n個包都發送一個ACK應答包。好比n = 4 表示在200毫秒內,每收到4個數據包都應該發一個ACK應答包。路徑是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<Interface GUID>
當進入流量控制的時候,後續收到的包都會讓系統處理,系統也會發送ACK應答包,所以我們必需進行攔截,保證在流量控制模式下,ACK的發送只由我們來處理。得保證發送的每個ACK包的WIN值都是0。