企业资料通讯Week7 (2) | rdt(reliable data transfer)[下]

rdt3.0

rdt3.0 开始考虑到packet loss的情形,它怎麽解决呢?
https://ithelp.ithome.com.tw/upload/images/20211109/20135414VMc7T2V3Y3.png
喔喔~原来是采用"倒数计时"的方式,sender每送一个封包就会设定一个timer,如果超过时间还没收到receiver的回馈,sender就会重传该封包。如果receiver有回馈,但可能因为网路太慢使得ACK迟到sender会如何?sender还是重传啊!於是receiver就会收到重复的封包,不过没关系,有sequence number就可以辨认哪个是重复的封包。

注意这里,rdt3.0的重传机制只绑定在timer身上,可以看红色圈起来的地方(图中描述ACK坏掉或是ACK编号错误)
https://ithelp.ithome.com.tw/upload/images/20211109/20135414VnnpNQdanj.png
这里也是rdt2.2与rdt3.0另外一个差别,这个意思是回馈如果是错的sender也不重传、不停止倒数,直等到timerout才重传(rdt2.2收到错误的回馈就会重传)。

几种状况

下图分别为正常情况与sender packet loss
https://ithelp.ithome.com.tw/upload/images/20211109/20135414eJKFQcJVtF.png
sender 等到timerout 重传

而这是ACK中途loss
https://ithelp.ithome.com.tw/upload/images/20211109/20135414axZRB91iAL.png
sender 等到timerout 重传,receiver收到重复的封包,於是再传一次ACK。

这是回馈晚到的情形,比较复杂一点,这会导致双方的时间不一致,所以会多送几次封包与ACK
https://ithelp.ithome.com.tw/upload/images/20211109/20135414IleeQN5a46.png

rdt3.0性能

它也是采用 stop and wait 的方式,中间在等回馈的时候sender除了倒数计时之外都没做事。
https://ithelp.ithome.com.tw/upload/images/20211109/20135414MljiDk0Oqn.png
注: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,使用率很差。
怎麽改良呢?请继续看~

Pipelined protocols

所以我们又想到一个方法,如果一次可以送很多封包就不用花时间等那麽多次了!
使用"in flight"(在途,就是还未被确认的packet)的概念。
有两个特色:

  • 它有一个未被确认封包的上限 N (WindowSize)
  • 有buffering(缓冲)机制
    Pipelined protocols 主要分两类:(1)go-back-N (2)selective repeat
    如果在理想的状态下,它的使用效率可达100%,因为可以一边传一边收。

https://ithelp.ithome.com.tw/upload/images/20211109/20135414fPJVMqG0pK.png

1.go-back-N (GBN)

下图的框框是一个WindowSize
https://ithelp.ithome.com.tw/upload/images/20211109/20135414bm2OS9oorF.png
每一根长长的代表一个segment(请容我叫它封包QUQ)

  • 绿色的是送出且被checked部分
  • 黄色的是已经送出但还没被checked部分
  • 框框内蓝色的是还没被送出,但还可以再送的空间
  • 白色的是还不能送的,因为go-back-N对於未确认的封包有WindowSize的上限

名词解释:

  • send_base:最老的未被确认封包
  • nextseqnum:下一个准备要传的封包

go-back-N 特色

  • timer: 这go-back-N的 timer 会设定在send_base上面,并等待receiver 送 ACK(n)。
  • cumulative ACK: 甚麽是ACK(n)?
    举个例子,如果ACK(7)就代表第七个封包以下(包含)都没问题,所以这也称**“cumulative
    ACK”**!
  • timeout的处理:sender会从send_base直到最後的未确认封包都重送,如果Window是满的就会重送N个封包(最糟的状况),这也是为甚麽它叫go-back-N。
  • 如果中间有缺失:举例,8号封包不见了,但是sender送的9、10、11都是正常的,receiver还是只会一直送ACK(7)。
    之後window满的就不能送、卡在那里等timeout,从8号封包到 8+N-1号封包都会重送。

流程

sender方
https://ithelp.ithome.com.tw/upload/images/20211109/20135414mIJICvxbHh.png
注:

  • 收到ACK(N),window就会往右移,直到base=N+1
  • nexthttps://ithelp.ithome.com.tw/upload/images/20211109/20135414mzfD1QiJiG.pngseqnum>=base+N 代表window已经满了,sender就不会再接收上层传下来的封包

receiver方
https://ithelp.ithome.com.tw/upload/images/20211109/2013541483gJ4yUQeP.png

看下图,2号封包loss,receiver一直痴痴地等着二号封包,非二号封包就丢掉,然後等到timeout,整个window的封包都重传了!
https://ithelp.ithome.com.tw/upload/images/20211109/20135414vOXso7xY8z.png

你会不会觉得 go-back-N 有一种「一颗老鼠屎,坏了一锅粥」的感觉?

2.Selective repeat

不同於 go-back-N,Selective repeat 每一个送出的封包都有绑定timer,为甚麽它要这麽做?
是的,当其中一个封包有缺失就只要送该封包就好。
https://ithelp.ithome.com.tw/upload/images/20211109/20135414wQBBz9BfeX.png

这里要注意,Selective repeat 的receiver有window buffer,而 go-back-N 只有sender 有 window buffer
https://ithelp.ithome.com.tw/upload/images/20211109/20135414BzPFfePDsP.png

https://ithelp.ithome.com.tw/upload/images/20211109/20135414qnnAwel55z.png
虽然Selective repeat可以少重送封包,但要多设timer,资源消耗也不少。
所以两种方法各有利弊。

这里就简单介绍完 reliable data transfer ,考试加油!!

思考:

  • 为甚麽需要可靠传书协定(rdt)?
  • Selective repeat 与 go-back-N 的差别?
  • rdt2.0 与 rdt2.1 差别?
  • 拿几张A4纸,学到多少还记得?一边讲一边写出来吧!

<<:  移动设备安全政策是防止影子 IT 使用的最佳安全控制

>>:  Day 37 - 在 AWS Lambda 建立 OpenCV Layer

企划实现(28)

使用自定义的listview 第一步:制作自己想要的listview格式 <?xml vers...

Day23 Vue 认识Porps(2)

我们在使用props时有时会需要特别对传进来的资料做检查所以通常我们就会用以下几个资料类型来做验证:...

DAY14 呼叫功能列表样板

@csrf_exempt def callback(request): if request.met...

在经营文化前,先了解现况

上一篇分享过「何谓团队文化」後,在讨论如何建立与经营团队文化前,我们先从了解目前的状况与定义你希望有...

JavaScript学习日记 : Day14 - 原型与继承(一)

在写程序时,我们经常会想要拓展一些东西。 例如我们有一个user object,他有自己的属性跟函数...