天天看點

TCP的流量控制與擁塞控制小結概述

 為了提高信道的使用率tcp協定不使用停止等待協定,而是使用連續arq協定,意思就是可以連續發出若幹個分組然後等待确認,而不是發送一個分組就停止并等待該分組的确認。其中tcp的流量控制與擁塞控制是tcp在資料傳輸過程倆個重點機制,為tcp有效資料傳輸立下汗馬功勞,這部分也是面試網絡協定重點所在,下面從以下倆大方面總結一下

【1】流量控制

【2】擁塞控制

流量控制:指點對點通信量的控制,是端到端正的問題。流量控制所要做的就是抑制發送端發送資料的速率,以便使接收端來得及接收。

在tcp中的資料流主要分為倆大類:成塊資料流和互動資料流,(其中互動資料流主要是資料位元組長度比ip首部/tcp首部都短,屬于小分組),主要針對這倆種資料流類型做了不同的處理

主要針對成塊資料流,

 利用滑動視窗機制可以很友善地在tcp連接配接上實作對發送方的流量控制。

 設a向b發送資料。在連接配接建立時,b告訴了a:“我的接收視窗是 rwnd = 400 ”(這裡的 rwnd 表示 receiver window) 。是以,發送方的發送視窗不能超過接收方給出的接收視窗的數值。請注意,tcp的視窗機關是位元組,不是封包段。tcp連接配接建立時的視窗協商過程在圖中沒有 顯示出來。再設每一個封包段為100位元組長,而資料封包段序号的初始值設為1。大寫ack表示首部中的确認位ack,小寫ack表示确認字段的值ack。

TCP的流量控制與擁塞控制小結概述

從圖中可以看出,b進行了三次流量控制。第一次把視窗減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不允許發送方再發送資料了。這種使發送方暫停發送的狀态将持續到主機b重新發出一個新的視窗值為止。b向a發送的三個封包段都設定了 ack = 1 ,隻有在ack=1時确認号字段才有意義。

注意: tcp為每一個連接配接設有一個持續計時器(persistence timer)。隻要tcp連接配接的一方收到對方的零視窗通知,就啟動持續計時器。若持續計時器設定的時間到期,就發送一個零視窗控測封包段(攜1位元組的數 據),那麼收到這個封包段的一方就重新設定持續計時器

其實nagle更多的應該是提高傳輸效率,

由于tcp的資料傳輸分為互動資料流和成塊資料流,互動資料流一般是一些互動式應用程式的指令,是以這些資料很小,而考慮到tcp報頭和ip報頭的總和就有40位元組,在區域網路通常不會引起麻煩啊,但是在廣域網上這些小分組往往會增加擁塞的可能性。

該算法的優越之處在于他的自适應性:确認到達越快,資料也發送的越快。

 擁塞控制就是防止過多的資料注入網絡中,這樣可以使網絡中的路由器或鍊路不緻過載。擁塞控制是一個全局性的過程,和流量控制不同,流量控制指點對點通信量的控制。

通常有以下方式來避免擁塞

TCP的流量控制與擁塞控制小結概述

  發送方維持一個叫做擁塞視窗cwnd(congestion window)的狀态變量。擁塞視窗的大小取決于網絡的擁塞程度,并且動态地在變化。發送方讓自己的發送視窗等于擁塞視窗,另外考慮到接受方的接收能力,發送視窗可能小于擁塞視窗。慢開始算法的思路就是,不要一開始就發送大量的資料,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞視窗的大小。 這裡用封包段的個數的擁塞視窗大小舉例說明慢開始算法,實時擁塞視窗大小是以位元組為機關的。如下圖:

TCP的流量控制與擁塞控制小結概述

        當然收到單個确認但此确認多個資料報的時候就加相應的數值。是以一次傳輸輪次之後擁塞視窗就加倍。這就是乘法增長,和後面的擁塞避免算法的加法增長比較。

 為了防止cwnd增長過大引起網絡擁塞,還需設定一個慢開始門限ssthresh狀态變量。ssthresh的用法如下:

(1)當cwnd<ssthresh時,使用慢開始算法。

(2)當cwnd>ssthresh時,改用擁塞避免算法。

(3)當cwnd=ssthresh時,慢開始與擁塞避免算法任意。

       擁塞避免算法讓擁塞視窗緩慢增長,即每經過一個往返時間rtt就把發送方的擁塞視窗cwnd加1,而不是加倍。這樣擁塞視窗按線性規律緩慢增長。

       無論是在慢開始階段還是在擁塞避免階段,隻要發送方判斷網絡出現擁塞(其根據就是沒有收到确認,雖然沒有收到确認可能是其他原因的分組丢失,但是因為無法判定,是以都當做擁塞來處理),就把慢開始門限設定為出現擁塞時的發送視窗大小的一半。然後把擁塞視窗設定為1,執行慢開始算法。如下圖:

TCP的流量控制與擁塞控制小結概述

對上圖的解釋如下:

 (1)當tcp連接配接進行初始化時,把擁塞視窗cwnd置為1。前面已說過,為了便于了解,圖中的視窗機關不使用位元組而使用封包段的個數。慢開始門限的初始值設定為16個封包段,即 cwnd = 16 。

(2). 在執行慢開始算法時,擁塞視窗 cwnd 的初始值為1。以後發送方每收到一個對新封包段的确認ack,就把擁塞視窗值另1,然後開始下一輪的傳輸(圖中橫坐标為傳輸輪次)。是以擁塞視窗cwnd 随着傳輸輪次按指數規律增長。當擁塞視窗cwnd增長到慢開始門限值ssthresh時(即當cwnd=16時),就改為執行擁塞控制算法,擁塞視窗按線 性規律增長。

(3). 假定擁塞視窗的數值增長到24時,網絡出現逾時(這很可能就是網絡發生擁塞了)。更新後的ssthresh值變為12(即變為出現逾時時的擁塞視窗數值 24的一半),擁塞視窗再重新設定為1,并執行慢開始算法。當cwnd=ssthresh=12時改為執行擁塞避免算法,擁塞視窗按線性規律增長,每經過 一個往返時間增加一個mss的大小。

快重傳要求接收方收到一個失序的封包段之後就立即發出重複确認,而不要等到自己發送的資料時捎帶确認。快重傳 算法規定,發送方隻要一連收到三個重複确認就應當立即重傳對方尚未收到的封包段,而不必繼續等待設定的重傳計時器時間到期(快展現在這裡)。如下圖:

TCP的流量控制與擁塞控制小結概述

而快速重傳以後,因為走的不是慢啟動而是擁塞避免算法,是以這又叫做快速恢複算法。

主要有有以下兩個要點:

①當發送方連續收到三個重複确認時,就執行“乘法減小”算法,把ssthresh門限減半。但是接下去并不執行慢開始算法。

②考慮到如果網絡出現擁塞的話就不會收到好幾個重複的确認,是以發送方現在認為網絡可能沒有出現擁塞。是以此時不執行慢開始算法,而是将cwnd設定為ssthresh的大小,然後執行擁塞避免算法。如下圖:

TCP的流量控制與擁塞控制小結概述

轉載:http://blog.csdn.net/xsf50717/article/details/47298127

繼續閱讀