TCP之滑動窗口


1、滑動窗口
  TCP的滑動窗口是以字節為單位的。為了便於說明,字節編號取的很小。先假定A收到B發來的確認報文字段,其中窗口是20字節,而確認號是31字節。(表明B期望接收到的下一個序號是31,序號30之前的數據已經收到了)。如圖下圖所示:
 
 
  A收到B的確認號是31,這表示B已經成功接受前面30個字節的數據,即發送窗口后沿部分。並告訴A發送窗口大小為20個字節。
  發送窗口的含義是:A接下來可以把窗口內的數據都發送出去,而且在A未收到B的確認前,A將根據超時重傳機制,重發窗口內的數據(暫存未收到確認的數據,並設置計時器)。
   注意:A的發送窗口大小不能超過B的接受窗口的大小。
 
2、窗口后沿、前沿
  發送窗口的位置,右前沿和后沿共同確定。
  例子中:窗口大小為:31 - 50 ,供20個字節。
 
2.1、后沿位置有兩種情況:
  • 后沿不動:
    表示一直沒收到確認信息。
  • 后沿向前移動
    表示收到了發送窗口內的連續確認信息。
     注意:后沿窗口不可能向后移動,這是因為不可能撤銷已經確認的信息
 
2.2、前沿位置有可能也有兩種情況:
  • 向前移動
    正常收到確認信息,通知的窗口大小不變,或者變大。
    比如:收到2個字節的確認,即使通知的窗口大小不變,前沿也會向前移動2個字節。
  • 不動 
    沒有收到確認消息,對方通知的窗口大小也不變; 
    收到確認消息,但是對方通知的窗口變小
    例如: 收到2個字節的確認,通知窗口大小減少2個字節。這種情況下窗口大小剛好不變。
  • 向后收縮
    例如:收到2個字節的確認,但是對方的通知窗口大小減少3個字節,導致前沿位置向后收縮。
    注意:TCP標准強烈不贊成這樣做
 
3、滑動窗口原理
 
 
3.1、發送方
  現在假定A發送了序號為31-41的數據,如上圖所示,一個發送窗口的狀態需要三個指針:P1,P2,P3;指針都指向字節的序號。
  小於P1的是已發送並收到確認的部分,大於P3的是不允許發送部分。
  P3 - P1 = A發送窗口的大小(又稱為通知窗口);
  P3 - P2 = 允許發送但尚未收到的字節數(又稱為可用窗口或有效窗口),表示A的可用窗口;
  P2 - P1 = 已發送,未收到確認的字節數;
 
3.2、接收方
  如果B收到了序號為32,33的兩個數據,所以,A的數據沒有有順到達,序號為31的數據沒有收到。B發送的確認報文段中,確認號仍然是31。
  假如B收到了31序號的數據,那么B將31,32,33三個字節的數據交付上層應用程序。並從接收緩存中刪除這些數據,並在返回報文中將確認號修改為34(下次想收到的第一個字節的序號)。
  當A收到確認報文后,將發送窗口向前移動3個字節,但指針P2不動。A的可用窗口變大了。
  如下圖所示,B的接收窗口前沿和A的發送窗口前沿都向前滑動了3個字節,並且B還收到了序號為37,38,40的字節。但因為不是連續的字節,並且起始序號不是34,所以B在接收緩存中緩存這部分數據。
 
 
  A繼續發送完序號42-53的數據后,P2移動到和P3重合。這是A的可用窗口變為0,停止發送數據。
  異常情況:A成功發送42-53的數據,B也收到了這些數據,並且B也給出了確認號為53的數據。但是因為B的確認信息,一直滯留在網絡中。當A等待的時間,超過超時重傳機制設置的定時器時間時,A將重傳42-53的數據。直到收到B的確認號為止。
 
3.3、注意
  B可以返回連續接收到的最大序號+1,作為確認號回復給A。
  例如:B成功接收到34-40序號的數據(上次B緩存了37,38,40,然后B又收到了34,35,36序號的字節的報文),B會給出去確認號為41的確認報文。A收到B確認號為41的報文后,A的發送窗口前沿將向前移動7個字節,即P2不動,待在54的地方,P3移動到61的地方。同理,P1移動到41的位置(即B發送的確認號)。
  從上面看得出來,A的可用窗口的大小表示A可以發送的字節數。B的P1指針是B返回的最新的確認號。
 
4、TCP緩存
  發送緩存和接收緩存的大小都有限制,並可以重復使用。
 
 
4.1、發送緩存
  從上圖可以看出,發送緩存和發送窗口的后沿重合,並且被確認的數據應該從發送緩存中移除。
  一般的關系是:
    已發送 < 發送窗口 < 發送緩存
  發送緩存用來存放:
    • 發送應用程序傳遞給發送方TCP准備發送的數據;
    • TCP已發送,但是沒有收到的確認的數據。
4.2、接收緩存
  接收緩存用來存放:
    • 按序到達,還未被接收應用程序讀取的數據;
    • 未按序到達的數據。
  接收窗口的大小收到接收應用程序讀取數據的速度影響。如果接收應用程序來不得讀取收到的數據,則接收緩存最終會被填滿,而使接收窗口變為0;反之,接收應用程序能夠及時從接收緩存中讀取收到數據,接收窗口就會變大,但最大也不能超過接收緩存的大小。所以,接收應用程序讀取數據的速度越快,接收窗口會越大。但是最大不能超過接收緩存的大小。
 


免責聲明!

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



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