rdt3.0 開始考慮到packet loss的情形,它怎麼解決呢?
喔喔~原來是採用"倒數計時"的方式,sender每送一個封包就會設定一個timer,如果超過時間還沒收到receiver的回饋,sender就會重傳該封包。如果receiver有回饋,但可能因為網路太慢使得ACK遲到sender會如何?sender還是重傳啊!於是receiver就會收到重複的封包,不過沒關係,有sequence number就可以辨認哪個是重複的封包。
注意這裡,rdt3.0的重傳機制只綁定在timer身上,可以看紅色圈起來的地方(圖中描述ACK壞掉或是ACK編號錯誤)
這裡也是rdt2.2與rdt3.0另外一個差別,這個意思是回饋如果是錯的sender也不重傳、不停止倒數,直等到timerout才重傳(rdt2.2收到錯誤的回饋就會重傳)。
下圖分別為正常情況與sender packet loss
sender 等到timerout 重傳
而這是ACK中途loss
sender 等到timerout 重傳,receiver收到重複的封包,於是再傳一次ACK。
這是回饋晚到的情形,比較複雜一點,這會導致雙方的時間不一致,所以會多送幾次封包與ACK
它也是採用 stop and wait 的方式,中間在等回饋的時候sender除了倒數計時之外都沒做事。
注:1RTT 大約等於 兩個propagation delay(sender發出封包的最後一個bit到sender收到ACK的時間);L/R 是 transmition delay
注意receiver要等到收到最後一個packet的bit才會發出ACK。
假設RTT是30,sender完整發出一個封包是0.008所以一個回合sender使用效率只有0.008/30.008,使用率很差。
怎麼改良呢?請繼續看~
所以我們又想到一個方法,如果一次可以送很多封包就不用花時間等那麼多次了!
使用"in flight"(在途,就是還未被確認的packet)的概念。
有兩個特色:
下圖的框框是一個WindowSize
每一根長長的代表一個segment(請容我叫它封包QUQ)
名詞解釋:
sender方
注:
receiver方
看下圖,2號封包loss,receiver一直痴痴地等著二號封包,非二號封包就丟掉,然後等到timeout,整個window的封包都重傳了!
你會不會覺得 go-back-N 有一種「一顆老鼠屎,壞了一鍋粥」的感覺?
不同於 go-back-N,Selective repeat 每一個送出的封包都有綁定timer,為甚麼它要這麼做?
是的,當其中一個封包有缺失就只要送該封包就好。
這裡要注意,Selective repeat 的receiver有window buffer,而 go-back-N 只有sender 有 window buffer
雖然Selective repeat可以少重送封包,但要多設timer,資源消耗也不少。
所以兩種方法各有利弊。
這裡就簡單介紹完 reliable data transfer ,考試加油!!
思考: