1. 程式人生 > >TCP協議的流量控制

TCP協議的流量控制

        我們知道TCP有流量控制和擁塞控制的功能。首先兩者是有區別的:流量控制只與傳送者和接收者之間的端-端通訊有關,也就是它是一個區域性的控制;但是擁塞控制是一個全域性的問題,涉及所有主機、路由器及路由器的儲存-轉發能力。通俗來說,一個城市,為了緩解擁堵,那麼對應應該採取的辦法是擁塞控制;但是如果僅僅對於市中心的某一條路避免堵車,那麼就是流量控制。

        這篇文章先介紹TCP的流量控制,擁塞控制在下一篇文章中詳細介紹。

        TCP採用大小可變的滑動視窗協議,由接收端通過window size欄位反饋當前可接收的位元組數。


        win反映的是視窗的剩餘大小,ACK表示目前接收端接收到的資料的序號。發端根據這個序號和收端剩餘的大小就可以調整自己下一步傳送多少,這就是流量控制的基本思想。

        對於傳送端的資料緩衝區有這些量:LastByteSent是目前傳送的最後1位元的資料編號;LastByteAckd是目前接收到確認的最後1位元的資料編號;Revwin是視窗大小。鑑於每次傳送方都是收到ACK之後滑動視窗繼續傳送,傳送到LastByteSent這個位置,LastByteSent-LastByteAckd也就是這次傳送資料的多少,那麼只要滿足:LastByteSent–LastByteAckd<=RcvWin(接收端空閒視窗大小) 就會保證不會溢位了。

        那麼接收端RcvWin怎麼算呢?假設接收端緩衝區大小為RcvBuffer。LastByteRead:上層應用程式接收的最後一個位元組序號,LastByteRcvd:接收端從網路接收的最後一個位元組序號,那麼LastByteRcvd–LastByteRead就是已經接受但是還沒有傳遞給上層的資料。所以空閒區域RcvWin= RcvBuffer-(LastByteRcvd–LastByteRead).

        接收端通過計算出空閒區域Recwin,在把這個訊息反饋給傳送方,傳送方藉此調整發送速率,進而實現TCP的端端流量控制。

        拓展閱讀