TCP流量控制原理

TCP採用個各類辦法來減小流量的傳輸量以及信道的利用率。html

延時確認-減小傳輸數量

TCP容許延遲一會再發送ACK,這樣能夠將ACK和相同方向的數據結合起來進行發送,從而下降ACK的數量,在必定程度上減輕網絡負載。算法

圖中經過延遲ACK減小了一個ACK的傳輸數量緩存

滑動窗口

滑動窗口的工做原理在以前已經作了詳細的介紹,在滑動窗口中有一個很重要的概念:窗口大小。問題來了,TCP是如何設置窗口大小的呢?在介紹以前先看一下TCP的緩存結構。網絡

 

對於TCP來講接收和發送方都維護着一個緩存。看上圖會發現個問題:若是寫進程寫的速度大於讀進程的讀取速度,這樣會致使接收緩存溢出,最終致使發送失敗。因此引入了窗口大小的概念,接收方經過ACK來實時告知發送方本身剩餘緩存的大小(即本身還能接收多少數據),這個大小就是滑動窗口的大小,在傳輸的過程當中,每一次ack接收方會根據本身的緩存大小動態的調整窗口的大小,下圖詳細展現了這一過程。性能

0窗口(Zero Window)

上面滑動窗口的展現中最終發送窗口變成了0.spa

當發送方收到窗口爲0的參數後,便再也不發送數據給接收方,這個時候接收方進程一直在讀取數據,最終接收方的TCP緩存會清空,有空間接收數據,這個時候接收方會經過一個ack通知發送方窗口的大小,可是這個ack有可能會丟失(ack沒有重傳功能),發送方由於窗口時0,一直沒有發送數據,因此沒法得知最新的窗口大小,通訊雙方都進入了一直等待狀態。設計

爲了解決這個問題,TCP爲每個連接設計了一個持續計數器(persistence timer),當窗口大小爲0時,就會啓動這個計數器,當計數器到期後會發送一個零窗口(zero window)探測報文段(一個字節),接收方經過確認這個探測報文時能夠告知發送方最新的窗口大小。(TCP規定,就算窗口爲0,也要接收零窗口探測報文)。下圖展現了這種case。htm

糊塗窗口綜合徵(Silly Window Syndrome-SWS)

通俗來解釋這個場景就是一架能夠坐500人的飛機只拉1個乘客和5個機組人員,資源極大的浪費。blog

以太網最大傳輸單元(MTU:max transmission unit)爲1500字節,TCP+IP的頭部字段爲40字節,因此TCP的最大報文(MSS:Max segment size)長度爲1460字節。當傳遞的報文的大小遠遠小於1460。尤爲小於頭部40的時候,就出現了上面說的一個大飛機拉一我的的狀況,其中MTU爲飛機的容量(500),機組乘員爲TCP/IP頭部(5),傳輸報文爲乘客(1)。隊列

發送端引發的SWS

發送窗口的size大於MSS,可是須要發送的數據遠遠小於MSS,這種狀況的解決採用nagle算法:

  if there is new data to send #有數據要發送
        # 發送窗口緩衝區和隊列數據 >=mss,隊列數據(available data)爲原有的隊列數據加上新到來的數據
        # 也就是說緩衝區數據超過mss大小,nagle算法儘量發送足夠大的數據包
        if the window size >= MSS and available data is >= MSS 
            send complete MSS segment now # 當即發送
        else
            if there is unconfirmed data still in the pipe # 前一次發送的包沒有收到ack
                # 將該包數據放入隊列中,直到收到一個ack再發送緩衝區數據
                enqueue data in the buffer until an acknowledge is received 
            else
                send data immediately # 當即發送
            end if
        end if
    end if 

else裏面有小塊數據(小於MSS)時候,解釋下:這個時候須要看是否還有已經發送待確認的數據,若是有則等着先不發,等於先在發送端攢數據。某種程度上又變成了停等協議,若是ACK返回的比較慢,小數據等待的時間就會比較長,最終會影響性能。有些狀況並不適用nagle算法,好比人機交互的遊戲等,能夠禁用nagle算法。

接收端引發的SWS

對於接收端來講,若是接收緩存的窗口大小小於MSS或者某個給定的值後,直接ack 接收窗口的size爲0。這樣當發送方收到接收窗口爲0時,則中止發送數據進行等待,在此期間,接收端的應用一直在讀取數據,這樣接收窗口會慢慢變大,最終經過發送方的0窗口探測請求告知發送方最新的窗口大小,從而再次開始數據傳輸。

以上介紹了TCP流量控制的一個總體過程,全文完。

相關文章
相關標籤/搜索