1. 程式人生 > >TCP擁塞控制機制

TCP擁塞控制機制

超時 丟失 速度 mil 很快 tcp 增長 spa 擁塞

我們知道TCP是擁有擁塞控制機制的,而UDP是沒有的,為什麽需要擁塞控制機制呢,就是防止丟包過多導致傳輸效率低下。網絡中傳輸的包太多,路由器的緩存又不夠,每一個發送端都以自己想要的發送速率發送包,自然會導致網絡擁塞。所以我TCP就包括了擁塞控制機制。

有幾種擁塞控制方法?

2種

1.端到端擁塞控制。網絡層沒有顯示的告知傳輸層此時網絡出現擁塞了,傳輸層通過報文段的丟失(超時或3次冗余確認得知)認為網絡出現擁塞了,TCP會縮減其擁塞窗口,減小發送速率。

2.網絡輔助的擁塞控制。網絡層顯示的告知發送端此時網絡擁塞了,少發點。

  有兩種告知方式:1.直接反饋信息可以由網絡路由器發送給發送端,采用阻塞分組的形式。

  2.路由器標記或更新從發送端向接收方的分組中的某個字段來指示擁塞產生。一旦受到一個標記的分組後,接收方就會向發送方通知該網絡阻塞指示。

TCP采用的是第一種方式,也就是端到端的擁塞控制。

端到端擁塞控制機制的實現?

首先明確下,發生端會通過設置一個擁塞窗口(congestion window cwnd),有點像可靠性傳輸中的滑動窗口,維持窗口的大小,窗口越大代表你發送的速率越快,發送的字節越多。

其中有3種擁塞控制算法:慢啟動( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快速恢復( fast recovery )。

1.慢啟動

當新建TCP連接時,cwnd初始化設為1個最大報文段(MSS)大小,發送端開始按照擁塞窗口大小發送數據,每當有一個報文段被確認,cwnd就增加1個MSS大小。這樣cwnd的值就隨著網絡往返時間(Round Trip Time,RTT)呈指數級增長,事實上,慢啟動的速度一點也不慢,只是它的起點比較低一點而已。我們可以簡單計算下:

開始 ---> cwnd = 1

經過1個RTT後 ---> cwnd = 2*1 = 2

經過2個RTT後 ---> cwnd = 2*2= 4

經過3個RTT後 ---> cwnd = 4*2 = 8



由此可見慢啟動的增長速度很快,cwnd也會指數增長,那你會不會有疑問,那這種指數增長啥時候停止呢?

有3中情況會讓慢啟動停止:

1.TCP使用了一個叫慢啟動閥門值(ssthresh)的變量,當cwnd超過該值後,慢啟動過程結束,進入擁塞避免階段。對於大多數TCP實現來說,ssthresh的值是65536(同樣以字節計算)。

2.超時丟包事件發生。TCP發送方將cwnd設置為1,慢啟動閥門值(ssthresh)設置為cwnd/2,並重新開始慢啟動過程。

3.檢測到3個冗余的ACK。這時TCP執行一種快速重傳並進入快速恢復狀態。

2.擁塞避免

一旦進入到擁塞避免,則說明cwnd目前的值裏擁塞可能並不遙遠了,你就不應該使用慢啟動那種指數增長的方式擴展cwnd,此時用的是較為保守的方式,每個RTT只是將cwnd的值增加1個MSS

那什麽時候結束擁塞避免呢?

1.出現超時丟包。cwnd值被設置為1個MSS大小,慢啟動閥門值(ssthresh)被設置為cwnd/2。

2.3個冗余的ACK。不改變發送速率。

3.快速恢復

1.當收到3個冗余的ACK時,把ssthresh設置為cwnd的一半,把cwnd設置為ssthresh的值加3,然後重傳丟失的報文段,加3的原因是因為收到3個重復的ACK,表明有3個“老”的數據包離開了網絡。
2.再收到重復的ACK時,擁塞窗口增加1。
3.當收到新的數據包的ACK時,把cwnd設置為第一步中的ssthresh的值。原因是因為該ACK確認了新的數據,說明從重復ACK時的數據都已收到,該恢復過程已經結束,可以回到恢復之前的狀態了,也即再次進入擁塞避免狀態。註意,如果在此過程出現超時,則重新進入慢啟動階段。

TCP擁塞控制機制