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 ,考试加油!!
思考:
<<: 移动设备安全政策是防止影子 IT 使用的最佳安全控制
>>: Day 37 - 在 AWS Lambda 建立 OpenCV Layer
使用自定义的listview 第一步:制作自己想要的listview格式 <?xml vers...
我们在使用props时有时会需要特别对传进来的资料做检查所以通常我们就会用以下几个资料类型来做验证:...
@csrf_exempt def callback(request): if request.met...
上一篇分享过「何谓团队文化」後,在讨论如何建立与经营团队文化前,我们先从了解目前的状况与定义你希望有...
在写程序时,我们经常会想要拓展一些东西。 例如我们有一个user object,他有自己的属性跟函数...