因?yàn)閠cp傳輸接收方和發(fā)送方的發(fā)送和接收處理的能力不會對等革屠,所以會利用滑動窗口讓發(fā)送方根據(jù)接收方的實(shí)際情況發(fā)送適當(dāng)流量的數(shù)據(jù)稳诚,這就是流量控制斩跌。
舉個例子當(dāng)服務(wù)器作為接收方處理數(shù)據(jù)不及時的時候宠进,如何借助滑動窗口去進(jìn)行流量限制屏箍。發(fā)送的客戶端和服務(wù)器初始窗口大小是360称勋。
image.png
最后窗口收縮到了0胸哥,發(fā)送了窗口關(guān)閉,當(dāng)發(fā)生窗口關(guān)閉的時候铣缠,發(fā)送方也會發(fā)探測報(bào)文定期探測接收方的接收窗口有沒有變動烘嘱,或者當(dāng)接收方處理好數(shù)據(jù)的時候也會通知發(fā)送方。這樣也保證了不會因?yàn)閳?bào)文丟失導(dǎo)致了死鎖的現(xiàn)象蝗蛙。
image.png
但是窗口探測一般也有次數(shù)--3 次蝇庭,每次大約 30-60s。如果 3 次過后接收窗口還是 0 的話捡硅,有的 TCP 實(shí)現(xiàn)就會發(fā) RST 報(bào)文來中斷連接哮内。
再假設(shè)一個場景,如果接收窗口突然有幾個字節(jié)的空間,這個場景也去通知發(fā)送方北发,或者發(fā)送方檢測到接收方窗口有幾個字節(jié)就立馬發(fā)送纹因。tcp頭部啥的都幾十字節(jié),這樣傳輸過去肯定是沒意義的琳拨,所以這個也叫糊涂窗口綜合征瞭恰。
image.png
要避免這個問題,一般采取兩個方法狱庇。
- 讓接收方不通告小窗口給發(fā)送方
當(dāng)「窗口大小」小于 min( MSS惊畏,緩存空間/2 ) ,也就是小于 MSS 與 1/2 緩存大小中的最小值時密任,就會
向發(fā)送方通告窗口為 0 颜启,也就阻止了發(fā)送方再發(fā)數(shù)據(jù)過來。
等到接收方處理了一些數(shù)據(jù)后浪讳,窗口大小 >= MSS缰盏,或者接收方緩存空間有?一半可以使用,就可以把窗
口打開讓發(fā)送方發(fā)送數(shù)據(jù)過來淹遵。 - 讓發(fā)送方避免發(fā)小數(shù)據(jù)
這就要使用nagel算法了- 等到窗口大小大于或者等于 MSS, 或者數(shù)據(jù)大小 >= mss
- 收到之前發(fā)送數(shù)據(jù)的ack包
只有上面兩種情況會繼續(xù)發(fā)口猜,否則就囤積數(shù)據(jù)。