rdt3.0
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
rdt3.0性能
它也是採用 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,使用率很差。
怎么改良呢?请继续看~
Pipelined protocols
所以我们又想到一个方法,如果一次可以送很多封包就不用花时间等那么多次了!
使用"in flight"(在途,就是还未被确认的packet)的概念。
有两个特色:
Pipelined protocols 主要分两类:(1)go-back-N (2)selective repeat
如果在理想的状态下,它的使用效率可达100%,因为可以一边传一边收。
1.go-back-N (GBN)
下图的框框是一个WindowSize
每一根长长的代表一个segment(请容我叫它封包QUQ)
名词解释:
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方
注:

receiver方
看下图,2号封包loss,receiver一直痴痴地等着二号封包,非二号封包就丢掉,然后等到timeout,整个window的封包都重传了!
你会不会觉得 go-back-N 有一种「一颗老鼠屎,坏了一锅粥」的感觉?
2.Selective repeat
不同于 go-back-N,Selective repeat 每一个送出的封包都有绑定timer,为甚么它要这么做?
是的,当其中一个封包有缺失就只要送该封包就好。
这里要注意,Selective repeat 的receiver有window buffer,而 go-back-N 只有sender 有 window buffer
虽然Selective repeat可以少重送封包,但要多设timer,资源消耗也不少。
所以两种方法各有利弊。
这里就简单介绍完 reliable data transfer ,考试加油!!
思考:
为甚么需要可靠传书协定(rdt)?Selective repeat 与 go-back-N 的差别?rdt2.0 与 rdt2.1 差别?拿几张A4纸,学到多少还记得?一边讲一边写出来吧!