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

rdt3.0

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

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

几种状况

下图分别为正常情况与sender packet loss
http://img2.58codes.com/2024/20135414eJKFQcJVtF.png
sender 等到timerout 重传

而这是ACK中途loss
http://img2.58codes.com/2024/20135414axZRB91iAL.png
sender 等到timerout 重传,receiver收到重複的封包,于是再传一次ACK。

这是回馈晚到的情形,比较複杂一点,这会导致双方的时间不一致,所以会多送几次封包与ACK
http://img2.58codes.com/2024/20135414IleeQN5a46.png

rdt3.0性能

它也是採用 stop and wait 的方式,中间在等回馈的时候sender除了倒数计时之外都没做事。
http://img2.58codes.com/2024/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%,因为可以一边传一边收。

http://img2.58codes.com/2024/20135414fPJVMqG0pK.png

1.go-back-N (GBN)

下图的框框是一个WindowSize
http://img2.58codes.com/2024/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方
http://img2.58codes.com/2024/20135414mIJICvxbHh.png
注:

收到ACK(N),window就会往右移,直到base=N+1nexthttp://img2.58codes.com/2024/20135414mzfD1QiJiG.pngseqnum>=base+N 代表window已经满了,sender就不会再接收上层传下来的封包

receiver方
http://img2.58codes.com/2024/2013541483gJ4yUQeP.png

看下图,2号封包loss,receiver一直痴痴地等着二号封包,非二号封包就丢掉,然后等到timeout,整个window的封包都重传了!
http://img2.58codes.com/2024/20135414vOXso7xY8z.png

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

2.Selective repeat

不同于 go-back-N,Selective repeat 每一个送出的封包都有绑定timer,为甚么它要这么做?
是的,当其中一个封包有缺失就只要送该封包就好。
http://img2.58codes.com/2024/20135414wQBBz9BfeX.png

这里要注意,Selective repeat 的receiver有window buffer,而 go-back-N 只有sender 有 window buffer
http://img2.58codes.com/2024/20135414BzPFfePDsP.png

http://img2.58codes.com/2024/20135414qnnAwel55z.png
虽然Selective repeat可以少重送封包,但要多设timer,资源消耗也不少。
所以两种方法各有利弊。

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

思考:

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

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章