TCP/IP / 如何进行流量控制( flow control )?
目錄
零、答案
一、滑窗結(jié)構(gòu)
二、流量控制
三、零窗口
零、答案
接收端告訴發(fā)送端,自己現(xiàn)在能夠接收的包的數(shù)量,發(fā)送端根據(jù)該數(shù)據(jù)來調(diào)整自己頻率,從而完成了 TCP 的流量控制。
一、滑窗結(jié)構(gòu)
發(fā)送方滑窗可以分為下面兩個部分。offered window 為整個滑窗的大小。
?
接收方滑窗可分為三個部分:
?
可以看到,接收方的滑窗相對于發(fā)送方的滑窗多了一個 "?Received ACKed Not Sent to Proc?" 的部分。接收方接收到的文本流必須等待進程來讀取。如果進程正忙于做別的事情,那么這些文本流即使已經(jīng)正確接收,還是需要暫時占用接收緩存。
當出現(xiàn)上述占用時,滑窗的可用部分(也就是圖中 advertised window )就會縮水。這意味著接收方的處理能力下降。如果這個時候發(fā)送方依然按照之前的速率發(fā)送數(shù)據(jù)給接收方,接收方將無力接收這些數(shù)據(jù)。
二、流量控制
如果發(fā)送端發(fā)送太快,導致接收端來不及接收,就容易造成丟失數(shù)據(jù)。流量控制是指接收方將 advertised window 的大小通知給發(fā)送方,從而指導發(fā)送方修改 offered window 的大小。接收方將該信息放在TCP頭部的 window size 區(qū)域:
發(fā)送方在收到window size的通知時,會調(diào)整自己滑窗的大小,讓 offered window 和 advertised window 相符。這樣,發(fā)送窗口變小,文本流發(fā)送速率降低,從而減少了接收方的負擔。
三、零窗口
? ? ? ? advertised window 大小有可能變?yōu)?,這意味著接收方的接收能力降為 0 。發(fā)送方收到大小為 0 的 advertised window 通知時,停止發(fā)送。
當接收方經(jīng)過處理,再次產(chǎn)生可用的 advertised window 時,接收方會通過純粹的 ACK 回復來通知發(fā)送方,讓發(fā)送方恢復發(fā)送。然而,ACK回復的傳送并不是可靠的。如果該ACK回復丟失,那么TCP傳輸將陷入死鎖(deadlock)狀態(tài)。
為此,發(fā)送方會在零窗口后,不斷探測接收方的窗口。窗口探測( window probe )時,發(fā)送方會向接收方發(fā)送包含1 byte文本流的 TCP 片段,并等待 ACK 回復( 該ACK回復包含有 window size )。由于有1 byte的數(shù)據(jù)存在,所以該傳輸是可靠的,而不用擔心 ACK 回復丟失的問題。如果探測結(jié)果顯示窗口依然為 0,發(fā)送方會等待更長的時間,然后再次進行窗口探測,直到TCP傳輸恢復。
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的TCP/IP / 如何进行流量控制( flow control )?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP/IP / 如何保证数据包传输的有
- 下一篇: TCP/IP / 如何进行堵塞控制?