1. 程式人生 > >TCP擁塞控制及連接管理

TCP擁塞控制及連接管理

第一個 窗口大小 路由 計時器 出現 重復 通信 .com bubuko

在閱讀此篇之前,博主強烈建議先看看TCP可靠傳輸及流量控制。

一、TCP擁塞控制

  在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞——產生擁塞(congestion)。出現資源擁塞的條件:對資源需求的總和 > 可用資源;擁塞帶來的問題:若網絡中有許多資源同時產生擁塞,網絡的性能就要明顯變壞,整個網絡的吞吐量將隨輸入負荷的增大而下降。

技術分享圖片

1. 擁塞的控制方法一(慢開始和擁塞避免

  發送方維持一個叫做擁塞窗口 cwnd (congestion window)的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。發送方讓自己的發送窗口等於擁塞窗口。如再考慮到接收方的接收能力,則發送窗口還可能小於擁塞窗口。發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網絡出現擁塞,擁塞窗口就減小一些,以減少註入到網絡中的分組數。

  慢開始算法原理:在主機剛剛開始發送報文段時可先設置擁塞窗口 cwnd = 1,即設置為一個最大報文段 MSS 的數值。在每收到一個對新的報文段的確認後,將擁塞窗口加 1,即增加一個 MSS 的數值。用這樣的方法逐步增大發送端的擁塞窗口 cwnd,可以使分組註入到網絡的速率更加合理。

技術分享圖片

  傳輸輪次:使用慢開始算法後,每經過一個傳輸輪次,擁塞窗口 cwnd 就加倍。一個傳輸輪次所經歷的時間其實就是往返時間 RTT。“傳輸輪次”更加強調:把擁塞窗口 cwnd 所允許發送的報文段都連續發送出去,並收到了對已發送的最後一個字節的確認。例如,擁塞窗口 cwnd = 4,這時的往返時間 RTT 就是發送方連續發送 4 個報文段,並收到這 4 個報文段的確認,總共經歷的時間。

慢開始門限 ssthresh 的用法如下:

當 cwnd < ssthresh 時,使用慢開始算法。
當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法。
當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞避免算法。

  擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢地增大,即每經過一個往返時間 RTT 就把發送方的擁塞窗口 cwnd 加 1,而不是加倍,使擁塞窗口 cwnd 按線性規律緩慢增長。

技術分享圖片

  依據:超時,即沒有按時收到確認。無論在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞,就要把慢開始門限 ssthresh 設置為出現擁塞時的發送方窗口值的一半(但不能小於2)。然後把擁塞窗口 cwnd 重新設置為 1,執行慢開始算法。這樣做的目的就是要迅速減少主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。

  “乘法減小“是指不論在慢開始階段還是擁塞避免階段,只要出現一次超時(即出現一次網絡擁塞),就把慢開始門限值 ssthresh 設置為當前的擁塞窗口值乘以 0.5。當網絡頻繁出現擁塞時,ssthresh 值就下降得很快,大大減少註入到網絡中的分組數。

  “加法增大”是指執行擁塞避免算法後,在收到對所有報文段的確認後(即經過一個往返時間),就把擁塞窗口 cwnd增加一個 MSS 大小,使擁塞窗口緩慢增大,以防止網絡過早出現擁塞。

2. 擁塞的控制方法二(快重傳與快恢復)

  快重傳算法首先要求接收方每收到一個失序的報文段後就立即發出重復確認。這樣做可以讓發送方及早知道有報文段沒有到達接收方。發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段。不難看出,快重傳並非取消重傳計時器,而是在某些情況下可更早地重傳丟失的報文段。

技術分享圖片

  與快重傳配合使用的還有快恢復算法

技術分享圖片

3. 擁塞控制與流量控制的關系

  擁塞控制所要做的都有一個前提,就是網絡能夠承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到所有的主機、所有的路由器,以及與降低網絡傳輸性能有關的所有因素。流量控制往往指在給定的發送端和接收端之間的點對點通信量的控制。 流量控制所要做的就是抑制發送端發送數據的速率,以便使接收端來得及接收。如果把擁塞控制和接收方對發送方的流量控制一起考慮,那麽很顯然,發送方的窗口的上限值應當取為接收方窗口rwnd和擁塞窗口cwnd這兩個變量中較小的一個,即:

技術分享圖片

  當rwnd<cwnd時,是接收方的接收能力限制發送方窗口的最大值;反之,當cwnd<rwnd時,則是網絡的擁塞限制發送方窗口的最大值。也就是說,rwnd和cwnd中較小的一個控制發送方發送數據的速率。

二、TCP連接管理

  運輸連接有三個階段,即:連接建立、數據傳送和連接釋放。運輸連接的管理就是使運輸連接的建立和釋放都能正常地進行。TCP 連接的建立都是采用Client/Server方式。主動發起連接建立的應用進程叫做客戶(client)。被動等待連接建立的應用進程叫做服務器(server)。 連接建立過程中要解決以下三個問題:1.要使每一方能夠確知對方的存在。2.要允許雙方協商一些參數(如最大報文段長度,最大窗口大小,服務質量等)。3.能夠對運輸實體資源(如緩存大小,連接表中的項目等)進行分配。

1. 三次握手建立TCP連接

  1)A 的 TCP 向 B 發出連接請求報文段,其首部中的同步位 SYN = 1,並選擇序號 seq = x,表明傳送數據時的第一個數據字節的序號是 x。

技術分享圖片

技術分享圖片

  2) B 的 TCP 收到連接請求報文段後,如同意,則發回確認。 B 在確認報文段中應使 SYN = 1,使 ACK = 1,其確認號ack = x ? 1,自己選擇的序號 seq = y。

技術分享圖片

技術分享圖片

  3) A 收到此報文段後向 B 給出確認,其 ACK = 1,確認號 ack = y ? 1。A 的 TCP 通知上層應用進程,連接已經建立。

技術分享圖片

技術分享圖片

  整個連接過程如下圖:

技術分享圖片

2. 四次揮手釋放TCP連接

  1)數據傳輸結束後,通信的雙方都可釋放連接。現在 A 的應用進程先向其 TCP 發出連接釋放報文段,並停止再發送數據,主動關閉 TCP 連接。A 把連接釋放報文段首部的 FIN = 1,其序號seq = u,等待 B 的確認。

技術分享圖片

  2)B 發出確認,確認號 ack = u + 1,而這個報文段自己的序號 seq = v。TCP 服務器進程通知高層應用進程。從 A 到 B 這個方向的連接就釋放了,TCP 連接處於半關閉狀態。B 若發送數據,A 仍要接收。

技術分享圖片

  3) 若 B 已經沒有要向 A 發送的數據,其應用進程就通知 TCP 釋放連接。

技術分享圖片

  4) A 收到連接釋放報文段後,必須發出確認。 在確認報文段中 ACK = 1,確認號 ack =w + 1,自己的序號 seq = u + 1。

技術分享圖片

至此,三次握手,四次揮手完畢。

TCP擁塞控制及連接管理