滑動窗口協議
還可以看我的另一篇博客,有更詳細的介紹:http://www.cnblogs.com/xcywt/p/8401523.html
屬於TCP協議中的一種應用,用於網絡數據傳輸時的流量控制,以避免擁塞的發生。
該協議允許發送方在停止並等待確認前發送多個數據分組。由於發送方不必每發送一個分組就停下來等待確認,所以該協議可以加速數據的傳輸,提高網絡吞吐量。
TCP利用一個滑動的窗口來告訴發送端對它所發送的數據能夠提供多大的緩沖區,由16位定義,最大為65535個字節。
滑動窗口本質上是描述接收方的TCO數據報緩沖區大小的數據,發送方根據這個數據來計算自己最多能發送多長的數據。這個窗口大小為0時,發送方將停止發送數據。啟動堅持定時器,等待這個窗口變成非0.
(
持續定時器,收到對方的零窗口時,就啟動該定時器,時間到了就發送一個字節的探測報文,對方此時會回應自身的窗口大小,如果仍然為0,就重置定時器,繼續等待。
)
窗口合攏:當窗口左邊界向右靠近時,這種現象發生在數據被發送方確認時。
窗口張開:窗口的右邊界向右移動的時候。這種現象發生在接收端處理的數據的時候。
窗口收縮:窗口右邊界向左移動時,這種現象不常發生。
TCP采用可變大小的滑動窗口大小是為了取得更好的性能。
TCP規定的窗口大小是由接收方通告的,通過采取慢啟動和擁塞避免算法等機制來使帶寬和性能取得最佳
傳遞效率問題:
單個發送字節,單個確認,會使網絡中增加很多不必要的報文(比如需要20字節的IP頭,20字節的TCP頭)。所以我們的原則是一次盡可能多發幾個字節,或者窗口空余較多的時候通知發送方一次發送多個字節:
Nagle算法:
1)若發送應用程序要把發送的數據逐個字節的送到TCP的發送緩存,則發送方就把第一個字節先發送出去,其余的先緩存起來
2)當第一個字節得到確認時(也得到了網絡情況和對方窗口大小),再把緩沖區的剩余字節組成合適大小的報文發送出去。
3)當到達的數據已達到發送窗口大小的一半或達到報文段的最大長度時就立即發送一個報文段(對於達到最大長度的情況:做法是讓接受方等待一段時間,或者接收方獲得足夠的空間容納一個報文段或接收方緩存有一半緩存時再通知發送方發送數據)
關於擁塞控制可以看這個:http://www.cnblogs.com/xcywt/p/8414189.html
擁塞控制
就是防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或鏈路不致過載。
常用的方法就是:
1)慢啟動、擁塞控制
2)快重傳、快恢復
發送方維護一個擁塞窗口(cwd)和慢啟動門限(ssthresh)。
cwd開始為1,確認一次之后變成2,成指數增加。直到到達ssthresh,改為擁塞避免算法。
之后若發生擁堵,cwd變為1,ssthresh減半,又進入慢啟動。
若連續收到3次某個包的ack,則進入快啟動,快重傳。
ssthresh減半,cwd減為ssthresh減半后是數值,執行擁塞避免算法(高起點,線性增長)
擁塞避免算法(讓窗口緩慢增長,每經過一個往返時間RTT就把發送方的cwd加1,線性緩慢增長)