1. 程式人生 > >TCP/IP詳解--流量控制機制 滑動視窗 Nagle演算法 糊塗視窗綜合徵

TCP/IP詳解--流量控制機制 滑動視窗 Nagle演算法 糊塗視窗綜合徵

1. 利用滑動視窗實現流量控制

    如果傳送方把資料傳送得過快,接收方可能會來不及接收,這就會造成資料的丟失。所謂流量控制就是讓傳送方的傳送速率不要太快,要讓接收方來得及接收。

    利用滑動視窗機制可以很方便地在TCP連線上實現對傳送方的流量控制。

    設A向B傳送資料。在連線建立時,B告訴了A:“我的接收視窗是 rwnd = 400 ”(這裡的 rwnd 表示 receiver window) 。因此,傳送方的傳送視窗不能超過接收方給出的接收視窗的數值。請注意,TCP的視窗單位是位元組,不是報文段。TCP連線建立時的視窗協商過程在圖中沒有顯示出來。再設每一個報文段為100位元組長,而資料報文段序號的初始值設為1。大寫ACK表示首部中的確認位ACK,小寫ack表示確認欄位的值ack。

    從圖中可以看出,B進行了三次流量控制。第一次把視窗減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不允許傳送方再發送資料了。這種使傳送方暫停傳送的狀態將持續到主機B重新發出一個新的視窗值為止。B向A傳送的三個報文段都設定了 ACK = 1 ,只有在ACK=1時確認號欄位才有意義。

    TCP為每一個連線設有一個持續計時器(persistence timer)。只要TCP連線的一方收到對方的零視窗通知,就啟動持續計時器。若持續計時器設定的時間到期,就傳送一個零視窗控測報文段(攜1位元組的資料),那麼收到這個報文段的一方就重新設定持續計時器。

2. 必須考慮傳輸速率

    可以用不同的機制來控制TCP報文段的傳送時機。如: <1>. TCP維持一個變數,它等於最大報文段長度MSS。只要快取中存放的資料達到MSS位元組時,就組裝成一個TCP報文段傳送出去。<2>. 由傳送方的應用程序指明要求傳送報文段,即TCP支援的推送( push )操作。<3>. 傳送方的一個計時器期限到了,這時就把已有的快取資料裝入報文段(但長度不能超過MSS)傳送出去。

    Nagle演算法:若傳送應用程序把要傳送的資料逐個位元組地送到TCP的傳送快取,則傳送方就把第一個資料位元組先發送出去,把後面到達的資料位元組都快取起來。當傳送方接收對第一個資料字元的確認後,再把傳送快取中的所有資料組裝成一個報文段再發送出去,同時繼續對隨後到達的資料進行快取。只有在收到對前一個報文段的確認後才繼續傳送下一個報文段。當資料到達較快而網路速率較慢時,用這樣的方法可明顯地減少所用的網路頻寬。Nagle演算法還規定:當到達的資料已達到 傳送視窗大小的一半或已達到報文段的最大長度時,就立即傳送一個報文段。

    另,糊塗視窗綜合證: TCP接收方的快取已滿,而互動式的應用程序一次只從接收快取中讀取1位元組(這樣就使接收快取空間僅騰出1位元組),然後向傳送方傳送確認,並把視窗設定為1個位元組(但傳送的資料報為40位元組的的話)。接收,傳送方又發來1個位元組的資料(傳送方的IP資料報是41位元組)。接收方發回確認,仍然將視窗設定為1個位元組。這樣,網路的效率很低。要解決這個問題,可讓接收方等待一段時間,使得或者接收快取已有足夠空間容納一個最長的報文段,或者等到接收方快取已有一半空閒的空間。只要出現這兩種情況,接收方就發回確認報文,並向傳送方通知當前的視窗大小。此外,傳送方也不要傳送太小的報文段,而是把資料報積累成足夠大的報文段,或達到接收方快取的空間的一半大小。