TCP協議滑動窗口(一)——控制大批量數據傳輸速率


  窗口大小:TCP頭中一個16位的域,表示當前可用接受緩沖區大小。在每個TCP對等段連接初始化時,告訴對方自己的窗口大小(不一定是滿額,假如滿額65201字節,可能暫時通告5840字節)。若客戶端接受數據速度大於客戶端程序讀取數據速度,那么會導致接收緩沖區充滿,窗口大小減少為0,當服務器得知此消息時將不會發送數據。

  TCP發送端發送數據時,並不是直接傳輸給接收端,而是先將數據復制到發送緩沖區。類似的,TCP接受端從TCP數據段得到數據后,將其放入接受緩沖區。這樣可以避免TCP連接濫用內存、CPU、網絡帶寬,從而阻止其他連接使用這些資源。也就是說,發送端發送數據有兩個要求

  1.   發送緩沖區有數據可以發送
  2.   接受緩沖區有空間可以接受

  如何知道接收端是否存在空間接受數據那?

  窗口大小作為TCP頭的一部分,每個TCP數據段無論是否為用戶數據段都會帶有該信息。接收端確認收到數據返回ack時,會更新自己的窗口大小。發送端會根據窗口大小控制發送數據了速率。

  為什么一開始窗口大小不是最大?

  一開始通知一個較小的窗口,用以強制控制發送端數據流速率。當TCP沒有感到網絡擁塞時,逐漸增大窗口大小,直到達到最大窗口大小。事實上,這就是擁塞控制機制。

  窗口大小為0后,接受緩沖區數據被接受,發送端如何知曉窗口大小不再為0?

  當窗口大小由0變為正數,接收端發送ack通告發送端一個非零窗口。但是為了防止該ack不幸丟失而導致接收端和發送端陷入死鎖(接收端通告了不為0窗口等待接受數據,發送端等待不為0窗口),TCP發送端設置了persistent定時器。

  什么是persistent定時器?

  TCP發送端每隔一端時間發送一個零窗口探測器,該探測會利用persistent定時器來發送。persistent定時器發送一個沒有數據的序列號,該序列號是小於最后傳輸數據的序列號,這時接收端會回送ack通告發送端。persistent定時器會按指數回退,也就是說往后的探測器發送頻率會越來越慢(1s,2s,4s,8s)。

 

http://www.cnblogs.com/yuhanghzsd/p/6323527.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM