tcp 兩個重要窗口:滑動窗口 和 擁塞窗口


一:滑動窗口是接受數據端使用的窗口大小,用來告知發送端接收端的緩存大小,以此可以控制發送端發送數據的大小,從而達到流量控制的目的,對應==>rwnd:接收端窗口(receiver window)

對於流量控制,是一個端對端的概念。由接收端返回的rwnd控制。

二:那么對於數據的發送端就是擁塞窗口了,擁塞窗口不代表緩存,擁塞窗口指某一源端數據流在一個RTT內可以最多發送的數據包數,cwnd:發送端窗口( congestion window )。

擁塞控制: 發送端主動控制控制cwnd,有慢啟動(從cwnd初始為1開始啟動,指數啟動),擁塞避免(到達ssthresh

后,為了避免擁塞開始嘗試線性增長),快重傳(接收方每收到一個報文段都要回復一個當前最大連續位置的確認,

發送方只要一連收到三個重復確認就知道接收方丟包了,快速重傳丟包的報文,並TCP馬上把擁塞窗口 cwnd 減小到

1),快恢復(直接從ssthresh線性增長)。

 

快重傳的機制是:
-1. 接收方建立這樣的機制,如果一個包丟失,則對后續的包繼續發送針對該包的重傳請求;
-2. 一旦發送方接收到三個一樣的確認,就知道該包之后出現了錯誤,立刻重傳該包;
-3. 此時發送方開始執行“快恢復”算法:
*1. 慢開始門限減半;
*2. cwnd設為慢開始門限減半后的數值;
*3. 執行擁塞避免算法(高起點,線性增長);

 

三:發送方窗口是相互影響的,具體如下:

發送方窗口的上限值 = Min [ rwnd, cwnd ]

當rwnd < cwnd 時,是接收方的接收能力限制發送方窗口的最大值。

當cwnd < rwnd 時,則是網絡的擁塞限制發送方窗口的最大值。

 

四、TCP的滑動窗口大小實際上就是socket的接收緩沖區大小的字節數,可以用上層setopt來設置。

 

五、對於server端的socket一定要在listen之間設置緩沖區大小,因為,accept時新產生的socket會繼承監聽socket

的緩沖區大小。對於client端的socket一定要在connet之前設置緩沖區大小,因為connet時需要進行三次握手過程,

會通知對方自己的窗口大小。在connet之后再設置緩沖區,已經沒有什么意義。

 

六:對ACK的再認識,ack通常被理解為收到數據后給出的一個確認ACK,ACK包含兩個非常重要的信息:


一是期望接收到的下一字節的序號n,該n代表接收方已經接收到了前n-1字節數據,此時如果接收方收到第n+1字節數據而不是第n字節數據,接收方是不會發送序號為n+2的ACK的。舉個例子,假如接收端收到1-1024字節,它會發送一個確認號為1025的ACK,但是接下來收到的是2049-3072,它是不會發送確認號為3072的ACK,而依舊發送1025的ACK。

二是當前的窗口大小m,如此發送方在接收到ACK包含的這兩個數據后就可以計算出還可以發送多少字節的數據給對方,假定當前發送方已發送到第x字節,則可以發送的字節數就是y=m-(x-n).這就是滑動窗口控制流量的基本原理

重點:發送方根據收到ACK當中的期望收到的下一個字節的序號n以及窗口m,還有當前已經發送的字節序號x,算出還可以發送的字節數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM