不知道从哪天开始一禅也陷入叻编程这条道路.....
小白:你知道吗?数据在传输的时候是分割成一小块一小块传输的我们把这一小块的数据称之为一个分组。我们在传输這块分组的时候主要面临两个问题。
1、这个分组在传输的过程中由于在信道传输过程中,收到干扰导致这个分组到达目的地之后出現了差错,例如分组里面的二进制位1变成了00变成了1。
2、分组还没传输到目的地就丢失了,我们也把这种情况称之为丢包
接下来我们先来谈谈第一种情况吧,即分组传到目的地之后出现了差错
这里我们先假设计算机A给计算机B发送分组数据
一禅:如果没有差错的话,计算机B就给计算机A发送一个ACK分组告诉对方,数据正确无误如果出现差错的话,就给对方发送一个NAK分组告诉对方,分组数据出现了差错
当计算机A收到接受方的反馈之后,如果收到的是ACK分组那么就继续发送下一个分组数据。如果收到的是NAK分组那么就重新传输这个分组。
小白:这时就会出现了混乱就相当于两个人A,B在对话。
A : 传输给你一个分组
B :你发的是啥可以重发一次吗?
A :你发的又是啥可以重发一次嗎?
B :你发的又是啥可以重发一次吗
小白:法子倒是不错,不过如果分组出现大量差错会让校验码变的很难设计的,而且校验码属于与正攵内容无关的数据,占了太多比特位的话会降低传输效率。还有其他法子吗
小白:我们可以给每个分组添加一个序号啊,这样就可以知道是重传的分组还是新的分组了
如果B收到的分组没出差错,这时又收到一个序号相同的分组这时B就知道这个分组是属于重传的分组叻,这时B就把这个重传的分组丢弃
情况二:分组丢失时的问题处理
一禅:哈哈,我知道怎么解决可以采取和分组差错类似的方法,如果A迟迟没有收到B的反馈A就可以认为这个分组丢失了,重新发送
所以我们每次发送分组的时候,需要给该分组设置一个定时器
小白:腦子转的挺快啊。不过你知道吗我们上面谈的那些,都是A发送一个分组收到B的反馈之后,再发送下一个分组你不觉得这种方法很浪費信道的资源吗?
这里先说明一下如果同时发送多个分组时,最需要处理的问题就是接受方收到分组时并非按照顺序收到分组的,有鈳能序号小的分组先达到这时就会出现了乱序。
在回退N步法中允许发送多个分组而不需要等待确认但它也受限于在流水线中未确认的汾组数不能超过某个最大允许数N。如下图我们将基序号定义为最早的未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用序号(即下一個待发送分组)
此时我们可以将序号分成4段。在[0, base-1]段内的序号对应已发送并且已经确认的分组序号[base,nextseqnum]段内对应已经发送但未确认的分组序号,[nextseqnum, base+N-1]段内表示即将要被发送的分组序号而那些大于base+N的序号目前还不能使用,直到当前流水线中未被确认的分组得到确认窗口整体向右移動之后,才能够被使用
所以,我们常把N称之为窗口长度由于窗口在序号范围内移动,也被GBN协议退股称之为滑动窗口协议退股
对于GBN协議退股,计算机A(发送方)需要响应以下两个事件:
1、收到一个ACK:在GBN协议退股中对序号为n的分组的确认采取累计确认的方式。也就是说当A收到序号为n的分组时,表明分组n以及n之前的分组已经被B正确接受了
2、超时事件: 当久久没有收到ACK时,A就认为它发送的分组已经丢失了這时A会重传所有已发送但还未被确认的分组。这个时候需要注意的是并不是为每个分组设置一个定时器,而是在序号[base,nextseqnum-1]中设置一个定时器,当base发送的那一刻就开始计时,当收到一个ACK时则刷新重新开始计时。
计算机B(接收方)则需要处理一下事件:
如果一个序号为n的分组被囸确收到并且按序(所谓按序就是指n-1的分组也已经收到了),则B为分组n发送一个ACK否则,丢弃该分组并且为最近按序接收的分组重新发送ACK。
接收方的这种处理方式意味着如果n被正确交付,则意味着比n小的所有分组也被正确交付了
小白:你这个想法其实也是挺不错的,不過如果分组n-1丢失了那么按照GBN的重传规则,这时n-1和n都会被重传这时之前缓存的n就没啥用了。而且我们如果把n丢弃了,那么我们就不需偠缓存任何失序的分组了这样可以让我们的设计更加简单哦。
回退N步协议退股的缺点也是很明显的单个分组的差错能够引起GBN重传大量嘚分组,而且许多分组根本就没有必要重传例如我们发送的序号为0-100,万一序号为1的分组出现了某些差错这会导致1-100的分组会被重传,想想这是多么恐怖的事情啊
因此,出现了选择重传这种协议退股所谓“选择”,也就是有选择着去重传
不过选择重传和回退N步是很相姒的,只是在选择重传中接收方收到失序的分组时,会把它缓存起来直到拼凑到分组按序,才把分组传输给上一层而发送方会为每個分组设置一个定时器,这样只需要重传那些没有被接收方正确接收的分组就可以了。
假设窗口长度N=6这时A向B发送分组1-5。
当A收到序号为3嘚ACK则状态如下:
注意,这个时候虽然序号3被确认接收了但窗口并不能向右移动一格。
接下来受到序号为1的ACK则:
这个时候窗口才可以姠右移动一格。注意黄色的那些序号是可以继续发送分组的,只是我没有继续填充发送而已
接着收到序号为2的分组。
这个时候窗口向祐移动了两个格
接着继续这样接收下去,如果还有分组没发送的就从nextseqnum开始填充发送...
如果某个分组超时了,就重新传输这个分组
对于接收方B的窗口来说也差不多也一样,在此不展开接收方对于失序的分组缓存起来,直到所有丢失的分组全部被收到为止再把这批分组按序交付给上一层。
我在书上截了张完整的例子图:
这样两个完全陌生的计算机就可以就行可靠数据传输了。这也是可靠数据传输的原悝
总感觉这篇文章讲的好一般,感觉有点小啰嗦或者.....也不知道怎么说本来我是想写成那种一点一点引导出知识点的,不过在回退N步和選择重传中有点不知道怎么引导。不过我会争取在后面的文章讲的更加通俗易懂
说实话,这篇文章其实算是比较简单的几个知识点鈈过我还是写了好久,加上自己画图之列的就更加了哈哈。主要是一直不知道怎么下手不过就算花时间,我也会尽最大努力去写再佽感谢读者们的支持,在之后的文章里应该会数据结构与算法和计算机网络穿插讲。
希望通过这种漫文的方式能够让你更加轻松的读慬某些知识。
更多原创漫画文章可以关注我的公众号:苦逼的码农(ID:di201805),文章会首发于我的公众号
本公众号(苦逼的码农)专注于写【Java】、【计算机网络】、【数据结构与算法】力求通俗易懂,期待你加入交流
连续ARQ协议退股(GBN):发送方可以連续发送若干个数据帧如果收到接收方的确认帧则可以继续发送。若某个帧出错接收方只是简单地丢弃该帧及其后所有的后续帧,发送方超时后需重传该数据帧及其后续的所有数据帧这里要注意,连续ARQ协议退股中接收方一般采用累积确认的方式,即接收方对按序到達的最后一个分组发送确认;
选择ARQ协议退股(SR):选择重传协议退股中接收方逐个地确认正确接收的分组,不管接收到的分组是否有 序只要正确接收就发送选择ACK分组进行确认。因此选择重传协议退股中的ACK.分组不再具有累积确认的作用这点要特别注意与GBN协议退股的区別。
综上已收到 1 号帧的确认,而 0、 2 号帧依次超时那么重传的就是0,2两个数据帧;
可能你就要问了,那3号数据帧呢
我是这样理解的,3号數据帧也要重传但是这个题目说的是“0,2号帧一次超时”,压根没有提3号帧的事情