利用滑動窗口實現(xiàn)流量控制
發(fā)布時間:2014/9/6 21:28:40 訪問次數(shù):2643
一般說來,我們總是希望數(shù)據(jù)傳輸?shù)酶煲恍。但如果發(fā)送方把數(shù)據(jù)發(fā)送得過快,接收MSS5131-393MLC方就可能來不及接收,這就會造成數(shù)據(jù)的丟失。所謂流量控制(flow control)就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。
利用滑動窗口機制可以很方便地在TCP連接上實現(xiàn)對發(fā)送方的流量控制。
下面通過圖5-22的例子說明如何利用滑動窗口機制進行流量控制。
設A向B發(fā)送數(shù)據(jù)。在連接建立時,B告訴了A:“我的接收窗口rwnd=400”(這里nⅣnd表示receiver window)。因此,發(fā)送方的發(fā)送窗口不能超過接收方給出的接收窗口的數(shù)值。請注意,TCP的窗口單位是字節(jié),不是報文段。TCP連接建立時的窗口協(xié)商過程在圖中沒有顯示出來。再設每一個報文段為100字節(jié)長,而數(shù)據(jù)報文段序號的初始值設為1(見圖中第一個箭頭上面的序號seq:1。圖中右邊的注釋可幫助理解整個的過程)。請注意,圖中箭頭上面大寫ACK表示首部中的確認位ACK,小寫ack衷示確認字段的值。
A發(fā)送了序號301至400,還能再發(fā)送100字市新數(shù)據(jù)
A發(fā)送了序號401至500,不能冉發(fā)送新數(shù)據(jù)了
A超時重傳舊的數(shù)據(jù),但不能發(fā)送新的數(shù)據(jù)
允許A發(fā)送序號501至600共100字符
A發(fā)送了序號501至600,不能再發(fā)送
圖5-22利用可變窗口進行流量控制舉例
我們應注意,接收方的主機B進行了三次流量控制。第一次把窗口減小到rwnd=300,第二次又減到rwnd:100,最后減到rwnd=0,即不允許發(fā)送方再發(fā)送數(shù)據(jù)了a這種使發(fā)送方暫停發(fā)送的狀態(tài)將持續(xù)到主機B重新發(fā)出一個新的窗口值為止。我們還應注意到,B向A發(fā)送的三個報文段都設置了ACK =1,只有在ACK=1時確認號字段才有意義。
現(xiàn)在我們考慮一種情況。在圖5-22中,B向A發(fā)送了零窗口的報文段后不久,B的接收緩存又有了一些存儲空間。于是B向A發(fā)送了rwnd=400的報文段。然而這個報文段在傳送過程中丟失了。A一直等待收到B發(fā)送的非零窗口的通知,而B也一直等待A發(fā)送的
數(shù)據(jù)。如果沒有其他措施,這種互相等待的死鎖局面將一直延續(xù)下去。
為了解決這個問題,TCP為每一個連接設有一個持續(xù)計時器(persistence timer)。只要TCP連接的一方收到對方的零窗口通知,就啟動持續(xù)計時器。若持續(xù)計時器設置的時間到期,就發(fā)送一個零窗口探測報文段(僅攜帶1字節(jié)的數(shù)據(jù)),而對方就在確認這個探測報文段時給出了現(xiàn)在的窗口值“。。如果窗口仍然是零,那么收到這個報文段的一方就重新設置持續(xù)計時器。如果窗口不是零,那么死鎖的僵局就可以打破了。
一般說來,我們總是希望數(shù)據(jù)傳輸?shù)酶煲恍。但如果發(fā)送方把數(shù)據(jù)發(fā)送得過快,接收MSS5131-393MLC方就可能來不及接收,這就會造成數(shù)據(jù)的丟失。所謂流量控制(flow control)就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。
利用滑動窗口機制可以很方便地在TCP連接上實現(xiàn)對發(fā)送方的流量控制。
下面通過圖5-22的例子說明如何利用滑動窗口機制進行流量控制。
設A向B發(fā)送數(shù)據(jù)。在連接建立時,B告訴了A:“我的接收窗口rwnd=400”(這里nⅣnd表示receiver window)。因此,發(fā)送方的發(fā)送窗口不能超過接收方給出的接收窗口的數(shù)值。請注意,TCP的窗口單位是字節(jié),不是報文段。TCP連接建立時的窗口協(xié)商過程在圖中沒有顯示出來。再設每一個報文段為100字節(jié)長,而數(shù)據(jù)報文段序號的初始值設為1(見圖中第一個箭頭上面的序號seq:1。圖中右邊的注釋可幫助理解整個的過程)。請注意,圖中箭頭上面大寫ACK表示首部中的確認位ACK,小寫ack衷示確認字段的值。
A發(fā)送了序號301至400,還能再發(fā)送100字市新數(shù)據(jù)
A發(fā)送了序號401至500,不能冉發(fā)送新數(shù)據(jù)了
A超時重傳舊的數(shù)據(jù),但不能發(fā)送新的數(shù)據(jù)
允許A發(fā)送序號501至600共100字符
A發(fā)送了序號501至600,不能再發(fā)送
圖5-22利用可變窗口進行流量控制舉例
我們應注意,接收方的主機B進行了三次流量控制。第一次把窗口減小到rwnd=300,第二次又減到rwnd:100,最后減到rwnd=0,即不允許發(fā)送方再發(fā)送數(shù)據(jù)了a這種使發(fā)送方暫停發(fā)送的狀態(tài)將持續(xù)到主機B重新發(fā)出一個新的窗口值為止。我們還應注意到,B向A發(fā)送的三個報文段都設置了ACK =1,只有在ACK=1時確認號字段才有意義。
現(xiàn)在我們考慮一種情況。在圖5-22中,B向A發(fā)送了零窗口的報文段后不久,B的接收緩存又有了一些存儲空間。于是B向A發(fā)送了rwnd=400的報文段。然而這個報文段在傳送過程中丟失了。A一直等待收到B發(fā)送的非零窗口的通知,而B也一直等待A發(fā)送的
數(shù)據(jù)。如果沒有其他措施,這種互相等待的死鎖局面將一直延續(xù)下去。
為了解決這個問題,TCP為每一個連接設有一個持續(xù)計時器(persistence timer)。只要TCP連接的一方收到對方的零窗口通知,就啟動持續(xù)計時器。若持續(xù)計時器設置的時間到期,就發(fā)送一個零窗口探測報文段(僅攜帶1字節(jié)的數(shù)據(jù)),而對方就在確認這個探測報文段時給出了現(xiàn)在的窗口值“。。如果窗口仍然是零,那么收到這個報文段的一方就重新設置持續(xù)計時器。如果窗口不是零,那么死鎖的僵局就可以打破了。
上一篇:使用選擇確認SACK
上一篇:必須考慮傳輸效率