TCP可靠傳輸再回顧

概述

總體來說TCP通過以下方式保證數據的可靠傳輸:

  • 確認重傳
  • 數據校驗
  • 數據分片和排序
  • 流量控制
  • 擁塞控制

數據校驗

TCP校驗和是一個端到端的校驗和,由發送端計算,然後由接收端驗證。其目的是爲了發現TCP首部和數據在發送端到接收端之間發生的任何改動。如果接收方檢測到校驗和有差錯,則TCP段會被直接丟棄。

數據分片

TCP會按MTU合理分片,接收方會緩存未按序到達的數據,重新排序後再交給應用層。

MTU(最大傳輸單元),是鏈路層中的網絡對數據幀的一個限制。

MSS(最大分段大小),MSS是TCP裏的一個概念(首部的選項字段中)。MSS是TCP數據包每次能夠傳輸的最大數據分段,TCP報文段的長度大於MSS時,要進行分段傳輸。

回顧滑動窗口

滑動窗口協議

TCP採用滑動窗口協議來實現流水線傳輸。

爲什麼要使用滑動窗口協議

因爲發送端希望在收到確認前,繼續發送其它報文段。

發送方有一個發送窗口,發送窗口範圍內的數據允許發送,隨着接收方傳來的確認信息,以及通知的接收窗口大小來動態調整發送窗口的起始位置以及大小。

在這裏插入圖片描述
發送窗口大小等於接收方提供的接收窗口的大小。

發送方會根據網絡擁塞情況來動態調整發送窗口大小,前提是發送方發送窗口大小不大於接收方接收窗口大小。

窗口滑動的三種情況

  • 前沿向右移動,這種情況發生在數據發送並被確認時。
  • 情況發生在接收窗口增大或者網絡擁塞情況緩解時。
  • 後沿向左移動,這種情況發生在接收方希望發送窗口縮小時,TCP標準強烈不建議出現這種情況。因爲發送方在收到縮小窗口的通知時,可能已經發送了一些縮小部分的數據,容易造成錯誤。

TCP接收方有累計確認功能,接收方不必立刻對收到的數據進行確認,這樣可以減少傳輸開銷。

累積確認功能使得接收方只對按序到達的最後一個分組發送確認,表示這個分組之前的分組已經全部到達。

另外接收方不能夠準確的通知發送方已經發送到接收方的數據分組。

例如:

序號5、6、7、9、10分組到達接收方,接收方發送的確認序號是8,接收方沒有收到序號8的分組,希望下次收到序號8的分組。而序號9、10分組雖然已經到達的事實,發送方並不知曉。

這會導致一個問題:一旦發生超時重傳的情況,發送方是否需要再次發送已經到達的數據呢。

這裏引入了ARQ協議:滑動窗口協議 與 自動重傳請求技術結合形成ARQ協議。

根據超時重發數據方式的不同分爲後退N幀ARQ協議選擇重發ARQ協議

後退N幀ARQ協議

在發生超時重傳時,後退N幀ARQ協議不考慮確認序號之後的分組是否已經發送到接收方,直接從確認序號開始重傳之後的數據。

在這裏插入圖片描述

選擇重傳ARQ協議

選擇重傳ARQ協議是指在接收方收到未按序排列的數據流時,通知發送方重傳缺失的數據,而不是重傳全部數據。TCP數據段首部中添加選擇確認選項SACK可以實現該目的。

超時重傳

爲了管理TCP連接,引入了以下四個定時器:

  • 重傳定時器:決定何時重傳未被確認的數據分組。
  • 持續定時器:使窗口大小信息保持不斷流動。避免死鎖。
  • 保活定時器:檢測空閒連接的另一端是否崩潰或重啓。
  • 2MSL定時器:測量一個連接處於TIME_WAIT狀態的時間。

流量控制

TCP連接建立時,接收方會在確認報文段中給出自己接收窗口的大小。在每次發送確認報文時能夠根據情況動態調整接收窗口的大小,並將告知發送方。如下圖所示:
在這裏插入圖片描述
流量控制簡單來說就是接收方處理不過來的時候,就把窗口縮小,並把窗口值告訴發送端。

擁塞控制

擁塞控制是指防止過多的數據注入網絡中,這樣可以使網絡中路由器或者鏈路不致過載。

TCP進行擁塞控制常用的算法有四種:慢啓動、擁塞避免、快重傳、快恢復

慢啓動

發送方維持一個擁塞窗口 cwnd ( congestion window )的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。

發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網絡出現擁塞,擁塞窗口就減小一些,以減少注入到網絡中的分組數。

慢啓動算法:

通常在剛剛開始發送報文段時,先把擁塞窗口 cwnd 設置爲一個最大報文段MSS的數值。

每經過一個傳輸輪次,擁塞窗口 cwnd 就加倍。

在這裏插入圖片描述

擁塞避免

爲了防止擁塞窗口cwnd增長過大引起網絡擁塞,還需要設置一個慢開始門限ssthresh狀態變量。

當 cwnd < ssthresh 時,cwnd以慢開始的方法指數增長;

當 cwnd > ssthresh 時,cwnd以擁塞避免的方法線性增長。

無論在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有收到確認),就要把慢開始門限ssthresh設置爲出現擁塞時的發送方窗口值的一半(但不能小於2)。然後把擁塞窗口cwnd重新設置爲1,執行慢開始算法。

快重傳

如果個別報文段在網絡中丟失,網絡並沒有發生擁塞,這種情況下發送方收不到確認報文,在超時之後會重傳該報文。發送方誤以爲網絡發生擁塞,錯誤的啓動慢開始算法,降低了傳輸效率。

採用快重傳算法可以讓發送方儘早知道個別報文段的丟失。快重傳算法要求接收方不要延時發送確認,即使收到失序的報文段也要立刻發送對已收到報文的重複確認。

在這裏插入圖片描述

接收方收到M1之後發送對M1的確認報文,M2報文丟失,之後接收方收到M3、M4、M5時每次都發送對M1報文的重複確認。快重傳算法規定當收到三次重複確認後,發送方就認爲M2報文段丟失,立即重傳M2報文段,而不用等待超時時再重傳,這樣可以避免發送方誤認爲網絡發生擁塞。

快恢復

在快重傳算法執行後,發送方知道只是丟失個別報文,而不是網絡發生擁塞。之後並不會執行慢啓動算法,而是執行快恢復算法:調整門限值ssthresh = cwnd/2,同時設置cwnd = ssthresh + 3 SMSS。從這裏直接線性增長,這就是快速恢復。
在這裏插入圖片描述

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