我們在數據傳輸的時候都希望能夠大量準確的傳輸數據,但是當流量過大時,接收方就可能來不及接受,造成數據的丟失。
流量控制: 就是讓發送方的發送頻率不要太快,要讓接收方來得及接收
使用滑動窗口可以很方便的實現對發送方的流量控制。
直接看上面的圖:
首先在建立連接的時候,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,說明不再接收數據了。
我們再來看另一個問題
上面說了發送方向接收方發送數據如果丟失的處理方法,如果接收方向發送方回發數據丟失了呢?
這裏就要用到了一個新的的東西:持續計時器。
用法:
- 只要TCP連接一方收到了對方的零窗口通知,就會啓動持續計時器。
- 如果時間到了,就會發送一個零窗口探測報文段(僅攜帶1字節的數據)
- 而對方就在確認這個探測報文段時給出了現在的窗口值。如果是零,則重新設置持續計時器。如果不是零,這個僵局就打破了。
我在其中的兩個問題:
問題一,看上面這個圖,接收方什麼回發消息,或者跟什麼有關
解釋:TCP通信是全雙工的,所以可以接收一個消息發送一次,也可以一接收多個再回發。
eg:
- 一次發送0-500的字節,每次發送100,然後201-300的丟失了
- 那麼接收方回覆201的消息
- 發送方重傳201-300的消息
- 接收方接收到之後,回覆301-500已經接收到了,下一個從501開始發
問題二:如果發送方會發消息丟失怎麼半?
- 有時鐘過時,超時重傳計時器等做保障。