一張圖瞭解TCP利用滑動窗口實現流量控制

我們在數據傳輸的時候都希望能夠大量準確的傳輸數據,但是當流量過大時,接收方就可能來不及接受,造成數據的丟失。

流量控制: 就是讓發送方的發送頻率不要太快,要讓接收方來得及接收

使用滑動窗口可以很方便的實現對發送方的流量控制。

直接看上面的圖:

首先在建立連接的時候,B把自己的窗口rwnd定義爲400,這就代表一次發送的數據不能超過400。

正式發送數據:

  • 第一個,第二個每次正常發送100單位的數據
  • 第三次出現了發送數據丟失的問題。

 


  • 後就接收方向發送方回發數據,這裏面有兩個重要的數據:
    一個就是已經接收到的數據序號ack
    二是自己接下來的接收窗口rwnd
    這裏因爲201-300的數據丟失了,所以ack=201,awnd是根據自己的緩存窗口進行改變


 


  • 根據上一條接受方的回發消息,自己200-300的數據丟失了,而且接收出窗口的大小從400變爲了300
    所以發送了兩次新數301和401
    然後重新發送了丟失的201-300的數據


  • 此時接收方又回傳消息,已經接收序號是500,接收窗口是100

  • 然後發送方就發送了501-600的數據

  • 最後回發接收窗口是0,說明不再接收數據了。

我們再來看另一個問題

上面說了發送方向接收方發送數據如果丟失的處理方法,如果接收方向發送方回發數據丟失了呢?

這裏就要用到了一個新的的東西:持續計時器

用法:

  1. 只要TCP連接一方收到了對方的零窗口通知,就會啓動持續計時器。
  2. 如果時間到了,就會發送一個零窗口探測報文段(僅攜帶1字節的數據)
  3. 而對方就在確認這個探測報文段時給出了現在的窗口值。如果是零,則重新設置持續計時器。如果不是零,這個僵局就打破了。

我在其中的兩個問題:

問題一,看上面這個圖,接收方什麼回發消息,或者跟什麼有關

解釋:TCP通信是全雙工的,所以可以接收一個消息發送一次,也可以一接收多個再回發。

eg:

  1. 一次發送0-500的字節,每次發送100,然後201-300的丟失了
  2. 那麼接收方回覆201的消息
  3. 發送方重傳201-300的消息
  4. 接收方接收到之後,回覆301-500已經接收到了,下一個從501開始發

問題二:如果發送方會發消息丟失怎麼半?

  • 有時鐘過時,超時重傳計時器等做保障。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章