趣解"可靠数据传输原理"
前言
- 可靠数据传输协议(Reliable Data Transfer protocal)在应用层、传输层、数据链路层都很重要,是网络 TOP10 问题之一
- 信道的不可靠特点决定了 rdt 的复杂性
- 下面将带领各位学习如何构造一个可靠的数据传输协议
Rdt1.0:在可靠信道上的可靠数据传输
纯粹的发送,机制的接收。错误?不存在的!
Rdt2.0:具有比特差错的信道
阿发:阿接,我给你送礼物啦!
阿接:阿发,你送的奥特曼真好玩,下次送我假面骑士吧。
阿发:阿接,我又给你送礼物啦!
阿接:不对啊,我要的是假面骑士,不是超级战队。
...
Rdt2.0:具有比特差错的信道
- 发送方发送一段信息,接收方接收到信息后,发出确认指令
- 当接收到正确的信息时,接收端发送ACK给发送端
- 当接收到错误的信息时,接收端发送NAK给发送端
Rdt2.1:解决ACK、NAK出错的情况
有一天,阿发鼓起勇气向阿接发出了世纪难题:你喜欢奥特曼多一点还是超级战队多一点?阿接发出回复:我喜欢假面骑士多一点。但是信件在回复的过程中,被粗心的邮递员弄混成了一份名为“我喜欢高达”的信件,于是阿接下一次收到的礼物变成了高达模型...
此后,为了防止这个现象再次发生,一个大帅*研究出了Rdt2.1,成功解决了信件错误的情况。
阿发:今天中午吃什么-0
阿接:歪比歪比*&……%¥#@
阿发:今天中午吃什么-0
阿接:吃饭
阿发:今天晚上吃什么-1
阿接:吃饭
...
Rdt2.1:解决ACK、NAK出错的情况
- 发送方不会发送确认的确认
- 发送方接收到的Ack若有误,则发送老分组
- 发送方接收到的Ack正确,则发送下一个分组
Rdt2.2:无NAK的协议
此外,由于某些原因,阿接的回信变得委婉了些...
阿发:你觉得我怎么样?
阿接:你是个好人
阿发:你做我的女朋友吧
阿接:你是个好人
...
Rdt2.2:无NAK的协议
- 功能与Rdt2.1相同,但只使用带有编号的ack
- 接收方对最后正确的分组发ack,以代替nak
- 发送方收到重复的ack,则重传当前分组
- 为后面一次发送多个数据单位做准备
Rdt3.0:具有比特差错和分组丢失的信道
阿发与阿接你一段我一段的对话往来,日子过的很安详。可是有一天,阿接的回复信件被寄件员弄丢了,阿接却不知道,结果阿发在家依旧苦苦等待阿接的回复信件,而阿接也继续等待着阿发的快递,世界顿时静止了下来~
就在这时,一个大帅*发现了问题:下层通信可能会丢失分组,导致发生死锁。于是想出了一个方法:发送方等待Ack一段合理的时间,得出了Rdt3.0,成功解决了信件丢失的问题。
Rdt3.0:具有比特差错和分组丢失的信道
- 过早的超时也能正常操作,但是效率较低,一半的分组和确认是重复的
- 设置一个合理的超时时间也是比较重要的
流水线协议
因为阿发每次发送东西给阿接时,都需要等待阿接的回应或超时后才会继续发送,这就造成了邮递员失业的情况(邮递员很多),要是能够在阿接还未回复的时候继续发送信件就好了。
这时又出现了一个大帅*研究出了流水线协议。
流水线协议:允许发送方在未得到对方确认的情况下一次发送多个分组
- 必须增加编号的范围:用多个bit表示分组的序号
- 在发送方/接收方要有缓冲区
- 两种通用的流水线协议:回退N步(GBN)、选择重传(SR)
此外,在了解流水线协议时,还需要了解滑动窗口协议(slide window) 。
滑动窗口协议——发送窗口(sending window)
发送缓冲区:
- 内存中的一个区域,落入缓冲区的分组可以发送;
- 用于存放已发送但未确认的分组;
- 需要重发时可用。
发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
发送缓冲区中的分组:
- 未发送的落入缓冲区的分组可以连续发送出去
- 已发送且等待确认的分组,发送缓冲区的分组只有得到确认才能删除
滑动窗口协议——接收窗口(receiving window)
- 接收窗口 = 接收缓冲区
- 只有收到的分组、序号落入接收窗口内才允许接收;若序号在接收窗口外,则丢弃
- 当接收窗口 w=1,则只能顺序接收;w>1,则可以乱序接收,但提交给上层要按序
两个典型的流水线协议
GBN
回退N步(Go Back N)协议其实也就是滑动窗口协议
发送端最多在流水线中有N个未确认的分组
接收端只是发送累计型确认,接收端如果发现错误,则不确认新到来的分组
发送端拥有对最老的未确认分组的定时器
- 只需设置一个定时器
- 当定时器到时时,重传所有未确认分组
SR
选择重传(Selective Repeat)协议
- 接收方对每个到来的分组单独确认,非累计确认
- 发送方为每个未确认的分组保持一个定时器,当超市定时器到时,只重发到时的未确认分组
比较 GBN 与 SR
- 相同之处
- 发送窗口都大于1
- 一次能够发送多个未经确认的分组
- 不同之处
GBN:
- 接收窗口尺寸为1
- 接收端只能顺序接收
- 发送端从表现来看,一旦一个分组没有发送成功,如:发送0、1、2、3、4,假设1未发送成功,2、3、4都发送出去了,要返回1重新发送,GB1
SR:
- 接收窗口尺寸大于1
- 发送端发送0、1、2、3、4,假设1未发送成功,2、3、4都发送出去了,无需重发,选择性发送1即可,SR1
- 优劣分析
GBN SR 优 简单,所需资源少 出错时,重传一个代价小 劣 一旦出错,回退N步代价大 复杂,需要资源多