滑動(dòng)窗口的解釋:

擁塞控制窗口+慢啟動(dòng)+擁塞控制算法=擁塞控制
TCP特性使得每個(gè)TCP連接可以得到均等的帶寬。在多用戶環(huán)境下,一個(gè)用戶擁有越多TCP連接,獲得的帶寬越大。
具體來(lái)說(shuō):
這個(gè)涉及到了TCP的擁塞控制。
我們先看一下單TCP連接的擁塞控制。
這是一個(gè)TCP連接的發(fā)送窗口。

綠色部分為發(fā)送者已發(fā)送,且接收者已確認(rèn)(ACKed)。
黃色部分為發(fā)送者已發(fā)送,但接收者尚未確認(rèn)("in-flight")。
藍(lán)色部分為可用但尚未發(fā)送。
灰色部分為不可用。
所以在RTT(round-trip time,來(lái)回通訊延遲)不變的情況下,cwnd這個(gè)變量基本決定傳輸速率。

發(fā)送者總會(huì)試圖找到不丟包情況下的最大速率。按照TCP協(xié)議,在傳輸開(kāi)始之后,每接收到一個(gè)確認(rèn)(ACK)就會(huì)把cwnd這個(gè)變量增大一倍。所以TCP連接開(kāi)始之后應(yīng)該是這個(gè)樣子。

剛開(kāi)始的時(shí)候傳輸速率應(yīng)該是指數(shù)被增長(zhǎng)的,直到丟包發(fā)生。丟包會(huì)有兩種情況:
1.當(dāng)接收者發(fā)送給發(fā)送者的ACK丟失了,這時(shí)會(huì)觸發(fā)超時(shí)(timeout)。
2.當(dāng)發(fā)送者發(fā)送給接收者的數(shù)據(jù)包丟失了,發(fā)送者會(huì)收到接收者發(fā)來(lái)的重復(fù)ACK,如果發(fā)送者收到了3個(gè)重復(fù)的ACK,也會(huì)認(rèn)為發(fā)生了丟包。
具體對(duì)這兩種情況采取的措施略有不同,但粗略來(lái)說(shuō),變量cwnd會(huì)被減半,也就是說(shuō)傳輸速率減半。然后cwnd會(huì)再次增大,直到下次丟包發(fā)生。所以忽略最開(kāi)始,TCP的吞吐量應(yīng)該是這樣。

MTU,MSS,滑動(dòng)窗口,慢啟動(dòng),擁塞算法
https://www.zhihu.com/question/48454744/answer/110946313
車(chē)小胖的回答
滑動(dòng)窗口實(shí)現(xiàn)
https://www.zhihu.com/question/32255109
tcp流控和擁塞控制:
https://www.cnblogs.com/zlingh/p/6161088.html
tcp那些事
https://coolshell.cn/articles/11564.html
自我總結(jié):
擁塞控制依靠:慢啟動(dòng),擁塞控制算法,快速重傳,快速恢復(fù)
流量控制依靠:滑動(dòng)窗口
tcpnopush:一定會(huì)等到發(fā)送緩沖區(qū)>MSS才發(fā)送
tcpnodelay:delay模式是指(默認(rèn)開(kāi)啟) = 當(dāng)發(fā)送緩沖區(qū)的數(shù)據(jù)少于MSS時(shí)就等待其他包一起(>MSS)發(fā)送,除非收到了上一個(gè)包的ACK就會(huì)立即發(fā)送。當(dāng)tcpnodelay為on表示關(guān)閉這種行為