計算機網絡:運輸層(3)

一、TCP流量控制

如果發送方發送速率過快,接收方可能來不及接收,會造成數據的丟失,降低吞吐率。
流量控制就是控制發送方的發送速率,使接收方來得及接收。

1. 滑動窗口實現流量控制

滑動窗口機制可以方便地實現TCP連接上的流量控制。接收方回送確認時,將給出自己的接收窗口,發送方根據對方的接收窗口確定自己的發送窗口,就可以實現流量控制。
滑動窗口實現流量控制
在這個過程中,試想一種情況:B向A發送零窗口報文後,A等待B發送非零窗口通知;但B發送非零窗口通知時,該報文偶發丟失了。此時,A一直等待B發送非零窗口通知,而B等待A發送新的報文段;A與B循環等待,形成了死鎖

爲避免死鎖的出現,TCP連接設有一個持續計時器。當TCP的一方收到對方的零窗口通知,就啓動持續計時器。若持續計時器到達設置的時間,就給接收方發送一個零窗口探測報文段(僅1字節)。接收方收到該報文段後,回送當前的接收窗口值。若rwnd仍爲0,則持續計時器重新計時;否則,發送方就可以開始發送數據。

2. 傳輸效率問題

對於TCP,有三種不同的機制來控制TCP報文段的發送時機:

  1. TCP維持一個等於最大報文段長度MSS的變量,當緩存中存放數據到達MSS字節時,組裝成一個TCP報文段發送;
  2. 由發送方進程指明要求發送報文段,即PUSH操作
  3. 發送方的一個計時器期限到了,就把當前緩存數據裝入報文段發送。

儘管有這三種機制,但報文段的發送時機控制仍然是一個複雜的問題。主要遇到的問題是:

發送方糊塗窗口綜合症

在某些進程(如Telnet服務)中,發送方可能每接收一個字節,就會開始發送報文段。這樣,一個字節的數據加上TCP報文段和IP數據報的首部,就需要發送41字節的IP數據報。在這個數據報中,有效數據僅有一個字節,傳輸效率極低。

爲解決此問題,TCP實現廣泛採用了Nagle算法,其內容爲:

  1. 當進程需要逐字節發送數據時,首先將第一個數據字節發送出去,後續的字節都緩存起來;
  2. 每當收到前一個報文段的確認時,把緩存中的數據組裝成一個報文段發送;
  3. 若緩存中數據達到發送窗口大小的一半或者報文段最大長度時,立即發送一個報文段。

Negla算法可以在數據到達較快而網速較慢時,明顯減少使用的網絡帶寬,並有效提高吞吐量。

接收方糊塗窗口綜合症

TCP接收方的緩存已滿,而應用進程每次只從緩存中讀取一個字節,然後向發送方發送確認,且窗口值爲1;接着發送方再發送41字節長的數據報(有效數據1字節)。這樣進行下去,網絡傳輸的效率極低,並且會導致網絡性能惡化。

爲解決此問題,可以讓接收方等待一段時間,使其在已有足夠空間容納一個MSS報文段已有一半的空閒緩存時,再發送確認報文,通知接收窗口的大小。

Negla算法和接收等待配合使用,可以有效提高TCP的傳輸效率。

二、TCP擁塞控制

1. 擁塞的產生

計算機網路中,鏈路的帶寬、結點的緩存和處理機等,都是網絡資源
在某個時間段,若對網絡中某一資源的需求超過了該資源所能提高的可用部分,網絡性能就會惡化。這種現象就是擁塞
擁塞出現的條件: 對資源的需求 > 可用資源
若網絡中多個資源同時供應不足,網絡性能將明顯惡化,網絡的吞吐量將隨着負荷的增大而迅速下降。
然而,簡單地增加網絡資源是不可行的。增加緩存將使得分組排隊等待時間顯著變長,造成大量重傳;而提高處理速率,又會導致網絡瓶頸轉移到其它資源上。問題的實質往往是整個系統各部分不匹配。
擁塞常常趨於惡化。擁塞引起的分組重傳,並不會緩解擁塞情況,反而會加劇擁塞。

2. 擁塞控制與流量管理

擁塞控制防止過多的數據注入到網路中,使鏈路和路由器不至於過載。擁塞控制所做的前提是網絡能夠承受現有的網絡負荷。擁塞控制是一個全局性的過程
流量控制則是點對點的通信量控制,是端到端的問題。所要做的是抑制發送端的發送速率,使接收端來得及接收。
擁塞控制和流量控制的直接結果都是放慢發送方的發送速率。

3. 一般原理

由於擁塞是一個全局的動態問題,因此擁塞控制很難設計。
網絡的高速化,使得路由器容易出現緩存不夠大而造成的分組丟失。但分組丟失是擁塞的結果而非原因
擁塞控制需要代價。有時,擁塞控制本身會成爲網絡性能惡化甚至死鎖發生的原因。必須全面衡量得失。
擁塞控制
擁塞控制從控制理論的角度可以分爲開環控制閉環控制
開環控制:設計網絡時考慮擁塞有關的因素,力求網絡工作時不產生擁塞。但系統一旦投入運行,就不能改動。
閉環控制:基於反饋環路的概念,主要有以下幾種措施:

  1. 監測網絡系統,檢測擁塞在何時、何處發生;主要的指標有:丟棄分組百分數、平均隊列長度、重傳分組數、平均分組時延
  2. 把擁塞的信息傳送到可採取行動的地方;
  3. 調整網絡運行,解決擁塞。

4. 控制方法

TCP採用基於窗口的方法進行擁塞控制。它屬於閉環控制方法。
發送方維護一個擁塞窗口cwnd真正的發送窗口 = min{接收方接收窗口, 擁塞窗口}
控制擁塞窗口的原則:

  1. 只要網絡沒有發生擁塞,擁塞窗口就可以增大,提高利用率;
  2. 如果發生擁塞,就必須將擁塞窗口減小,減少網絡中的分組數。

發生擁塞的判斷:

  1. 重傳計時器超時:意味着報文段丟失,在如今通信質量良好的鏈路中,分組丟失往往是出現了擁塞;
  2. 收到三個重複ACK:個別報文段出現丟失,可能意味着擁塞,也可能是偶發丟失,但也需要立即採取措施。
● 慢開始

當主機開始發送數據時,由於不知道網絡的負荷情況,應當先探測,由小到大地增大擁塞窗口

  1. 擁塞窗口cwnd控制方法
    初始擁塞窗口cwnd:舊規定將初始cwnd設置爲1-2個最大報文段SMSS;新RFC-5681將初始cwnd設置爲不超過2-4個SMSS。
    每收到一個新的報文段確認時,擁塞窗口最多可以增加一個SMSS。
    每次cwnd的增加量:Δcwnd = min{N, SMSS};其中N是剛收到確認報文段所確認的字節數。
    在慢開始階段,每經過一個傳輸輪次,擁塞窗口將值數增長。慢指的是開始時cwnd = 1,而不是增長的慢。
    傳輸輪次強調將cwnd中所有的數據都發送,並收到最後一個字節的確認。一次傳輸輪次的時間就是RTT。
    慢開始
  2. 慢開始門限ssthresh的使用
    慢開始門限ssthresh用於防止擁塞窗口增長過大引起網絡擁塞。
    當cwnd < ssthresh時,使用慢開始算法;
    當cwnd > ssthresh時,停止使用慢開始算法,改用擁塞避免算法;
    當cwnd = ssthresh時,即可以使用慢開始,也可使用擁塞避免。
● 擁塞避免

擁塞避免是讓cwnd緩慢增大,儘可能晚到達擁塞。擁塞避免不是沒有擁塞,只是不容易出現擁塞。

  1. 擁塞出現前
    每經過一個RTT,使發送方的cwnd加1,而不是加倍,使得cwnd按線性規律緩慢增長
    擁塞避免具有加法增大的特點,其cwnd增長速度比慢開始階段慢得多
  2. 擁塞出現時
    當出現重傳定時器超時,就判定發生了擁塞(無論慢開始還是擁塞避免階段)。此時採取以下措施:
    ● ssthresh = max{cwnd / 2, 2};(ssthresh置爲當前擁塞窗口的一半,若不足2則設置爲2)。
    ● cwnd = 1;
    ● 執行慢開始算法。
    採用這一操作,可以迅速減少主機發送的分組數,使擁塞的路由器有足夠時間處理
● 快重傳
  1. 對於接收方
    快重傳首先要求接收方立即發送確認,即使是失序的報文段也要發送前面報文段的重複確認。
  2. 對於發送方
    發送方只要收到連續三個重複確認,就判斷對方沒有收到某個報文段,應當立即進行重傳避免超時導致誤判斷擁塞

快重傳

● 快恢復

收到連續的三個重複確認後,發送方除了要立即重傳之外,還判斷網絡沒有發生擁塞,而是偶發丟失分組。
因此,不執行慢開始算法,而是快恢復算法

  1. ssthresh = cwnd / 2;
  2. cwnd = ssthresh;
  3. 開始執行擁塞避免算法。

慢開始門限設爲當前擁塞窗口的一半,並將擁塞窗口設爲當前的慢開始門限(即自身的一半),並執行擁塞避免算法

擁塞控制方法

● AIMD算法

擁塞避免階段,擁塞窗口線性緩慢增大,稱加法增大(AI);而出現超時或三連重複ACK,就要將慢開始門限設置爲擁塞窗口的一半,稱乘法減小(MD)。兩者合一就是AIMD算法
綜上,TCP的擁塞控制可以歸納爲下圖:
TCP擁塞控制流程圖

注意:發送方窗口不僅受擁塞窗口cwnd影響,也受接收方窗口rwnd影響。
發送方窗口上限 = min {rwnd, cwnd}。

三、TCP運輸連接管理

TCP協議是面向連接的協議。其運輸連接有三個階段:
● 連接建立
● 數據傳送
● 連接釋放

在TCP建立連接時,需要解決三個問題:
● 雙方要能夠明確知道對方的存在;
● 要允許雙方協商一些參數(窗口值、是否使用窗口擴大選項和時間戳選項);
● 能夠對運輸實體資源進行分配(緩存大小、連接表中的項目等)。

TCP連接建立採用客戶端/服務器方式(C/S方式)
● 主動發起連接建立的應用進程就是客戶端
● 被動等待連接建立的應用進程就是服務器

1. 連接建立

TCP爲建立連接而發送報文段的過程,稱爲握手
TCP的連接建立需要進行三次握手,即建立連接的整個過程需要發送三次報文段
三次握手
主機A運行的應用進程是客戶,主機B運行的應用進程是服務器。最初,雙方都處於CLOSED狀態
開始前,服務器端B已經創建傳輸控制模塊TCB,表示準備好接受連接請求,並進入LISTEN狀態,等待客戶連接請求。

  1. 第一次握手
    客戶端A也創建TCB,並在試圖建立連接,向B發出連接請求報文段。該報文段的同步位SYN = 1,並選擇一個初始序號x(TCP規定實際上報文段不攜帶數據,但要消耗一個序號)。此時,客戶端A進入SYN-SENT狀態(同步已發送)。
  2. 第二次握手
    B收到連接請求報文段後,如果同意建立連接,則向A發送確認。確認報文段中的SYN = 1,且ACK = 1;同時,確認號置爲x + 1,表示已經收到連接請求;並且也要選擇一個初始序號y。同樣,該報文段不攜帶數據但要消耗一個序號。此時,服務器端B進入SYN-RCVD狀態(同步已接收)。
  3. 第三次握手
    A收到確認後,還要再發送一次對確認的確認。該確認報文段中的ACK = 1;確認號置爲y + 1,序號置爲x + 1。不同的是,該ACK報文段可以攜帶數據。但如果選擇不攜帶數據,則不消耗序號,即下一個報文段的序號仍可以是x + 1。此時,TCP連接已經建立,A進入ESTABLISHED狀態(連接已建立)。
    最後,當B收到該ACK報文段後,也進入ESTABLISHED狀態,TCP連接建立完成。

採用三次握手主要是爲了避免建立失效的連接
例如,當A向B發送了連接請求,而第一個連接請求由於網絡原因超時;此時,由於超時,A會向B重傳一次連接請求;這樣,B就會收到兩次連接請求,其中有一個超時的是失效的。如果出現異常狀況,超時的那個連接請求在上一次連接釋放後纔到達。對於B,會誤認爲後到的那一個請求是新的連接請求,於是再次返回確認。如果不進行第三次握手,就會建立一個失效的連接。這時B會認爲連接已建立,而等待A發送數據;但A沒有發送請求,收到確認並不會作出迴應,B的資源也就浪費了。

而採用了三次握手後,即使發生上述情況,B無法收到A的確認,就會知道沒有建立連接,避免了資源的浪費。

2. 連接釋放

TCP爲釋放連接而發送報文段的過程,稱爲揮手
TCP的連接釋放需要進行四次揮手,即釋放連接的整個過程需要發送四次報文段
四次揮手
數據傳輸結束後,TCP連接的雙方都可以釋放連接。這裏假設A開始釋放連接。釋放前,雙方均處於ESTABLISH狀態

  1. 第一次揮手
    A停止傳輸數據,併發出連接釋放報文段,主動關閉TCP連接。報文段首部的FIN = 1;序號置爲u,是已傳輸的最後一個字節序號加1。FIN報文段即使不攜帶數據,也要消耗一個序號。此時,A進入FIN-WAIT-1狀態(終止等待1),等待B的確認。
  2. 第二次揮手
    B收到連接釋放報文段後,立即發送確認,報文段首部的ACK = 1,確認號置爲u + 1;並且置序號爲v,也是傳輸的最後一個字節加1。此時,B進入CLOSE-WAIT狀態(關閉等待)。但此時B仍能向A發送數據,即TCP連接處於半關閉狀態。A不會再向B發送數據,但B向A發送的數據仍能接收,相當於從全雙工信道退化爲B到A的單工信道
    A收到確認後,進入FIN-WAIT-2狀態(終止等待2),等待B發送釋放報文段。
    由於B可能仍有剩餘數據發送,第二次揮手後到第三次揮手前這一狀態,可能會持續一段時間。
  3. 第三次揮手
    當B發送完全部的數據,不再有數據需要發送後,就發送釋放報文段。其FIN = 1,ACK = 1;確認號仍爲u + 1,序號爲w,是剩餘傳送完的最後一個字節加1。此時,B進入LAST-ACK狀態(最後確認)。
  4. 第四次揮手
    A在接收到來自B的釋放報文段後,還需要發出確認。其ACK = 1,確認號置爲w + 1,序號置爲u + 1。
    對於B,收到確認後,就進入CLOSED狀態
    對於A,則會先進入TIME-WAIT狀態(時間等待),等待2MSL的時間後才進入CLOSED狀態

A必須等待時間等待計時器設置的2MSL(最長報文段壽命)的時間。主要是爲了:
保證A發送的最後一個ACK報文能夠到達B,如果沒有到達(丟失或超時),B會進行重傳FIN+ACK報文,而A能夠在2MSL的時間內收到重傳(在0~MSL內重傳,2MSL前到達),這樣A就能重傳一次ACK報文,並重啓
時間等待計時器
。若是沒有等待時間,A就無法收到B的重傳,也不會重傳給B,B就無法正常地釋放連接。
防止已失效的連接請求報文段出現。經過2MSL的時間後,能夠確保本連接持續時間內所有的報文段都消失(丟棄),保證下一次新的連接時,不會出現舊的報文段(都因超時丟棄)。

另外,TCP設有保活計時器。當建立連接後,一方的主機突然出現故障,另一方就不再能收到傳來的數據。爲了不讓資源白白浪費,使用保活計時器判斷連接的有效性。每當收到對方傳來的數據,就將保活計時器重置。若到達設置的時間限制(通常爲2小時),就發送一個探測報文段,之後每隔75秒發送一次。若10個探測報文後,對方仍沒有迴應,就認爲對方發生故障,關閉這個TCP連接。

3. 有限狀態機

爲了清晰地表示TCP連接地各種狀態的聯繫,下面給出TCP連接的有限狀態機
圖中每一個方框就是TCP連接的一個可能狀態。方框內的英文就是TCP標準使用的連接狀態名
狀態間的箭頭表示可能發生的狀態變遷。箭頭旁的字表示變遷發生的原因
粗實線箭頭表示客戶進程的正常變遷,粗虛線箭頭表示服務器進程的正常變遷。細線箭頭表示異常變遷
TCP有限狀態機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章