Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

慢啟動 && 擁塞避免 | 快速重傳 && 快速恢複

看,未來 2021-09-27 11:18:42 阅读数:40 评论数:0 点赞数:0 收藏数:0

在這裏插入圖片描述

之前在 《再探TCP/IP》那篇裏面寫過,但是寫的我自己的都看不懂了,重新整理一下。


概念清晰

擁塞控制:為了防止過多的數據注入到網絡中。擁塞控制要做的都有一個前提:就是網絡能够承受現有的網絡負荷。對比流量控制:擁塞控制是一個全局的過程,涉及到所有的主機、路由器、以及降低網絡相關的所有因素。流量控制往往指點對點通信量的控制。是端對端的問題。

擁塞窗口:發送方為一個動態變化的窗口叫做擁塞窗口,擁塞窗口的大小取决於網絡的擁塞程度。發送方讓自己的發送窗口=擁塞窗口,但是發送窗口不是一直等於擁塞窗口的,在網絡情况好的時候,擁塞窗口不斷的增加,發送方的窗口自然也隨著增加,但是接受方的接受能力有限,在發送方的窗口達到某個大小時就不在發生變化了。

網絡擁塞:發送方發送一些報文段時,如果發送方沒有在時間間隔內收到接收方的確認報文段,則網絡擁塞。

慢啟動:主機開發發送數據報時,如果立即將大量的數據注入到網絡中,可能會出現網絡的擁塞。慢啟動算法就是在主機剛開始發送數據報的時候先探測一下網絡的狀况,如果網絡狀况良好,發送方每發送一次文段都能正確的接受確認報文段。那麼就從小到大的增加擁塞窗口的大小,即增加發送窗口的大小。

文字看的麻煩的話,直接看圖(理想狀態下的圖):
在這裏插入圖片描述

前期指數增長,到達閾值之後,就以一個一個線性的速度來增長。我們也把指數增長階段稱之為慢啟動,線性增長階段稱之為擁塞避免。


圖解

圖在上面。

如果立即將大量的數據注入到網絡可能會出現網絡的擁塞。慢啟動算法就是在剛開始發送數據報的時候先探測一下網絡的狀况,如果網絡狀况良好,發送方每發送一次報文都能正確的接受確認報文段。那麼就從小到大的增加擁塞窗口的大小,即增加發送窗口的大小。發送方先設置擁塞窗口cwnd=1, 發送第一個報文段M1,接收方接收到M1後,發送方接收到接收方的確認後,把cwnd增加到2,接著發送方發送M2、M3,發送方接收到接收方發送的確認後cwnd增加到4,慢啟動算法每經過一個傳輸輪次(認為發送方都成功接收接收方的確認),擁塞窗口cwnd就加倍。

為了防止擁塞窗口cwnd增加過快而導致網絡擁塞,所以需要設置一個慢開始門限ssthresh狀態變量:

1. 當cwnd < ssthresh,使用慢啟動算法,
2. 當cwnd > ssthresh,使用擁塞避免算法,停用慢啟動算法。
3. 當cwnd = ssthresh,這兩個算法都可以。

擁塞避免的思路:是讓cwnd緩慢的增加而不是加倍的增長,每經曆過一次往返時間就使cwnd增加1,而不是加倍,這樣使cwnd緩慢的增長,比慢啟動要慢的多。


上面這是理想狀態,出現網絡擁塞又是另一種情况了。

出現變故

無論是慢啟動算法還是擁塞避免算法,只要判斷網絡出現擁塞,就要把慢啟動開始門限ssthresh為設置為發送窗口的一半,cwnd設置為1,然後在使用慢啟動算法,這樣做的目的能迅速的减少主機向網絡中傳輸數據,使發生擁塞的路由器能够把隊列中堆積的分組處理完畢。
在這裏插入圖片描述


快速重傳

我們都知道,數據包是有序號的,如果A給B發送M1, M2, M3, M4, M5…N個數據包,如果B收到了M1, M2, M4…卻始終沒有收到M3,這個時候就會重複確認M2,意在告訴A,M3還沒收到,可能是丟失。這時候就需要立即重傳丟失的數據段,這個地方不用等待定時器溢出。

在這裏插入圖片描述


快速恢複

快速重傳和快速恢複算法一般同時使用。快速恢複算法是認為,你還有3個Duplicated Acks說明網絡也不那麼糟糕,所以沒有必要像RTO超時那麼强烈,並不需要重新回到慢啟動進行,這樣可能降低效率。所以協議棧會做如下工作

  1. cwnd = cwnd/2

  2. sshthresh = cwnd

然後啟動快速恢複算法:

  1. 設置cwnd = ssthresh+ACK個數*MSS(一般情况下會是3個dup ACK)

  2. 重傳丟失的數據包(對於重傳丟失的那個數據包,可以參考TCP-IP詳解:SACK選項)

  3. 如果只收到Dup ACK,那麼cwnd = cwnd + 1, 並且在允許的條件下發送一個報文段

  4. 如果收到新的ACK, 設置cwnd = ssthresh, 進入擁塞避免階段

對於Reno、AIMD 這些算法,我看到有一個大佬(目前CSDN總排前十的某比特很有個性的大佬)提出了自己的想法,說是這些算法只是數學層面的收斂算法,正好TCP就需要收斂罷了,根本不能對網絡擁塞做出判斷。

這個我得再去研究研究,所以這篇先到這裏。

版权声明
本文为[看,未來]所创,转载请带上原文链接,感谢

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领