一:滑動窗口是接受數據端使用的窗口大小,用來告知發送端接收端的緩存大小,以此能夠控制發送端發送數據的大小,從而達到流量控制的目的,對應==>rwnd:接收端窗口(receiver window)算法
對於流量控制,是一個端對端的概念。由接收端返回的rwnd控制。緩存
二:那麼對於數據的發送端就是擁塞窗口了,擁塞窗口不表明緩存,擁塞窗口指某一源端數據流在一個RTT內能夠最多發送的數據包數,cwnd:發送端窗口( congestion window )。網絡
擁塞控制: 發送端主動控制控制cwnd,有慢啓動(從cwnd初始爲1開始啓動,指數啓動),擁塞避免(到達ssthreshsocket
後,爲了不擁塞開始嘗試線性增加),快重傳(接收方每收到一個報文段都要回復一個當前最大連續位置的確認,server
發送方只要一連收到三個重複確認就知道接收方丟包了,快速重傳丟包的報文,並TCP立刻把擁塞窗口 cwnd 減少到htm
1),快恢復(直接從ssthresh線性增加)。繼承
快重傳的機制是:
-1. 接收方創建這樣的機制,若是一個包丟失,則對後續的包繼續發送針對該包的重傳請求;
-2. 一旦發送方接收到三個同樣的確認,就知道該包以後出現了錯誤,馬上重傳該包;
-3. 此時發送方開始執行「快恢復」算法:
*1. 慢開始門限減半;
*2. cwnd設爲慢開始門限減半後的數值;
*3. 執行擁塞避免算法(高起點,線性增加);get
三:發送方窗口是相互影響的,具體以下:io
發送方窗口的上限值 = Min [ rwnd, cwnd ]原理
當rwnd < cwnd 時,是接收方的接收能力限制發送方窗口的最大值。
當cwnd < rwnd 時,則是網絡的擁塞限制發送方窗口的最大值。
4、TCP的滑動窗口大小實際上就是socket的接收緩衝區大小的字節數,能夠用上層setopt來設置。
5、對於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,算出還能夠發送的字節數。