在 TCP 連線中,使用了 congestion window 來控制發送端的速度。
這個值是由 sender 來保管的。那 receiver 用什麼參數?! 聽說是叫 Advertise window
Initially:
cwnd = 1;
ssthresh = infinite;
New ack received:
if (cwnd < ssthresh)
cwnd = cwnd + 1; /* 每收到 1 個 ACK , cwnd 額度加 1 */
else
cwnd = cwnd + 1/cwnd; /* 每收到 1 個 ACK ,cwnd 額度加 1/cwnd */
/* 當 cwnd=32 時,送出 32 pkts,會收到 32 acks */
/* 這意味 NewCwnd= cwnd + 32 * 1/cwnd(=32) = 33 */
Timeout:
ssthresh = cwnd/2; /* 如果之前爆掉了 就把你原本的額度砍半*/
cwnd = 1; /* 並且讓你從頭來過,進行 slow start */
TCP 使用滑動視窗(sliding window)使得資料流傳輸更有效率。在滑動視窗協定中,將之定義為 window size ≦ min (cwnd,RAwnd),其中 cwnd 為 congestion window,限制封包傳送數率;RAwnd 為 Receiver Advertisment Window,接收端建議視窗的大小。ㄧ般來說,此值會大於 cwnd,因此 window size幾乎等於 cwnd。
緩慢啟動機制(Slow-Start)
起初發送端會分配 1 個 MSS 的額度量來發送資料,當在預期時間(Timeout)
內收到全部回覆時,發送端會分配為前次 cwnd 兩倍的量,接者都以2^n 指數形態成長。
壅塞避免機制(Congestion Avoidance)
當在預期時間內收到全部回覆時,發送端會將 cwnd 的值加 1 個 MSS,以線性的方式成長。
[Timeout]
設定 threshold = 當前 cwnd / 2
然後 cwnd = 1
重新進行 slow start
**
[TCP Tahoe]
TCP 早期的版本,Tahoe具備 TCP 基本架構,包括慢啟動、壅塞避免、重傳狀態。TCP 在 Tahoe 這版本中加入了快速重傳(Fast retransmit)的方法。快速重傳機制是依據重複(Duplicate) ACKs 作為重送封包的機制,當收到 3 個重複 ACKs,傳送端會將封包視為遺失,不需 Timeout 就進入重送機制(將 ssthresh 的值設為 cwnd 的 1/2,即 cwnd 的值設為 1),表示的確有個節段遺失,而不是因為順序混亂而引發重複 ACKs。
[TCP Reno]
Reno(RFC 2581)為目前最普遍的版本,修改 Tahoe 演算法並加入快速恢復
(Fast recovery)機制。Reno 以快速恢復取代 Tahoe在重傳遺失封包後就進入慢啟動狀態。在 Reno 版本中快速重傳機制在重傳遺失封包後,將 cwnd 設為偵測到遺失時的 1/2,並當每收到一個重複 ACKs 就繼續送出新的封包來提高頻寬利用率,可以更快達到 threshold 值,已進入壅塞避免階段。快速重傳及快速恢復都是使用計算重複 ACKs 的技巧,以維持節段號碼順序。
[TCP Vegas]
Brakmo 和 Peterson 提出採用觀察 RTT的變化量來控制 cwnd 的大小,以計
算預期的效能比較實際的效能來加以決定是否增加或減少 ssthresh 直,Vegas 修改了 Reno 的技術並重新設計了以下三種方法,如下介紹:
修改 slow-start ( Modified slow-start )
希望能更有效率的利用頻寬並且避免 cwnd 值上升太快而引發封包遺失情況。cwnd 值大約經過 2 個 RTT 時間(Round-Trip Time)後才會增加一倍,而非 Reno,每次的 RTT時間就會使得 cwnd 值改變。
沒有留言:
張貼留言