【漫话】三分钟基础:什么是确认重传机制?

苦逼的码农

共 3075字,需浏览 7分钟

 ·

2019-12-21 23:24

来源公众号:苦逼的码农
作者:帅地
625fdba4c83608b9cd358b9ac8b76f47.webp
b7c58d4b8e3bc6e96edbe1bfd586406e.webp
8eacb9b576e553d9bc9bcbf38aff874a.webp
小白:你知道吗?数据在传输的时候是分割成一小块一小块传输的,我们把这一小块的数据称之为一个分组。我们在传输这块分组的时候,主要面临两个问题。


1、这个分组在传输的过程中,由于在信道传输过程中,收到干扰,导致这个分组到达目的地之后出现了差错,例如分组里面的二进制位1变成了0,0变成了1。

2、分组还没传输到目的地,就丢失了,我们也把这种情况称之为丢包。

接下来我们先来谈谈第一种情况吧,即分组传到目的地之后出现了差错。

这里我们先假设计算机A给计算机B发送分组数据

71b18cdf59ff1285f2cc2e3c759d6999.webp
24562f23798b31c9bcd19e9a1a3ff39d.webp
5374cfb4edbd35ead16fca3b850fc017.webp
c1865806b2d95035feea0b7f8e3f7a16.webp
5ed06591bcffa635ba791980216f9c58.webp在这里插入图片描述
一禅:如果没有差错的话,计算机B就给计算机A发送一个ACK分组,告诉对方,数据正确无误。如果出现差错的话,就给对方发送一个NAK分组,告诉对方,分组数据出现了差错。


当计算机A收到接受方的反馈之后,如果收到的是ACK分组,那么就继续发送下一个分组数据。如果收到的是NAK分组,那么就重新传输这个分组。

6fbdadf50071ec0189845e4e2530e80d.webp
5c604bca926b2115321c6f1f36613ed6.webp
2d2c6bc0f60cfae345b8544bcc703b12.webp
669d62232c0c26b24ad0976d0d66cf1d.webp在这里插入图片描述
d2701712206fcc6400b35703b0e9bf53.webp在这里插入图片描述
小白:这时就会出现了混乱,就相当于两个人A,B在对话。


A : 传输给你一个分组

B :你发的是啥,可以重发一次吗?

A :你发的又是啥?可以重发一次吗?

B :你发的又是啥?可以重发一次吗

……

进去无限混乱之中

8a403216c1dda710840898b9d7e89798.webp在这里插入图片描述
ed14ca81472bf2f415f1528555d8df8f.webp在这里插入图片描述
b010289deda826817bd9670c95d162df.webp
小白:法子倒是不错,不过如果分组出现大量差错,会让校验码变的很难设计的,而且校验码属于与正文内容无关的数据,占了太多比特位的话,会降低传输效率。还有其他法子吗?
decd5fb327bfbeebfa5a01fce8643d82.webp
ca68d4d509a4781dfbe9063b781204c7.webp
46c6b4ae46138917b95606f90a7b27f5.webp
3da004d54d106b27e1dfe32c3df03167.webp
小白:我们可以给每个分组添加一个序号啊,这样就可以知道是重传的分组还是新的分组了。


如果B收到的分组没出差错,这时又收到一个序号相同的分组,这时B就知道这个分组是属于重传的分组了,这时B就把这个重传的分组丢弃。

6467b8f05b823156527b427c329cddc2.webp在这里插入图片描述

情况二:分组丢失时的问题处理

4794f277cffa947f092a627711e7ad87.webp在这里插入图片描述
一禅:哈哈,我知道怎么解决,可以采取和分组差错类似的方法,如果A迟迟没有收到B的反馈,A就可以认为这个分组丢失了,重新发送。


所以我们每次发送分组的时候,需要给该分组设置一个定时器

166bb1b219135d50bc52c5ca1e0222d1.webp在这里插入图片描述
小白:脑子转的挺快啊。不过你知道吗?我们上面谈的那些,都是A发送一个分组,收到B的反馈之后,再发送下一个分组。你不觉得这种方法很浪费信道的资源吗?
606d6ae268105e45611670425c8bd703.webp
698265c17c824defe09610c697fb4ed8.webp
cec7388127c17217ba33455d272f9ddd.webp
3f9d57ce50abe8611fe54a8bf79f3acb.webp
7072f7ec106fd532ab9ca9259ef895ab.webp

这里先说明一下,如果同时发送多个分组时,最需要处理的问题就是接受方收到分组时,并非按照顺序收到分组的,有可能序号小的分组先达到,这时就会出现了乱序。

回退N步协议(GBN)

在回退N步法中允许发送多个分组而不需要等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数N。如下图,我们将基序号定义为最早的未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用序号(即下一个待发送分组)。

4db406f76511b8a5615f958c0f30a840.webp在这里插入图片描述
此时我们可以将序号分成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小的所有分组也被正确交付了。

109b4db17308414ddd27c81df38e6dd0.webp在这里插入图片描述
f5fa58b5a6b50fb5b3c3882b8e7c06f4.webp在这里插入图片描述
116344c0a0a60afad9f0d1ee331d2e9d.webp在这里插入图片描述
438e7497be989dd180a0f00c5899b17d.webp
2b962c6fc7cadf1d4fce4c29c2552024.webp在这里插入图片描述
c7ed05579d17468c22f9a6dea901d573.webp
小白:你这个想法其实也是挺不错的,不过如果分组n-1丢失了,那么按照GBN的重传规则,这时n-1和n都会被重传,这时之前缓存的n就没啥用了。而且,我们如果把n丢弃了,那么我们就不需要缓存任何失序的分组了,这样可以让我们的设计更加简单哦。


选择重传(SR)

回退N步协议的缺点也是很明显的,单个分组的差错能够引起GBN重传大量的分组,而且许多分组根本就没有必要重传。例如我们发送的序号为0-100,万一序号为1的分组出现了某些差错,这会导致1-100的分组会被重传,想想这是多么恐怖的事情啊。

因此,出现了选择重传这种协议。所谓“选择”,也就是有选择着去重传。

不过选择重传和回退N步是很相似的,只是在选择重传中,接收方收到失序的分组时,会把它缓存起来,直到拼凑到分组按序,才把分组传输给上一层。而发送方会为每个分组设置一个定时器,这样,只需要重传那些没有被接收方正确接收的分组就可以了。

我来个例子吧。

假设窗口长度N=6,这时A向B发送分组1-5。

c8088bad8ba0127c7f0d0ac79a9019e5.webp在这里插入图片描述
当A收到序号为3的ACK,则状态如下:
65d1fa562e4016b1abea281fe8be7289.webp在这里插入图片描述
注意,这个时候虽然序号3被确认接收了,但窗口并不能向右移动一格。


接下来受到序号为1的ACK,则:

8cb124d8fae42225323db8a1e036261d.webp在这里插入图片描述
这个时候窗口才可以向右移动一格。注意,黄色的那些序号是可以继续发送分组的,只是我没有继续填充发送而已。


接着收到序号为2的分组。

71b20dea62a5ad5b162741fd0063e6c1.webp在这里插入图片描述
这个时候窗口向右移动了两个格。


接着继续这样接收下去,如果还有分组没发送的,就从nextseqnum开始填充发送…

如果某个分组超时了,就重新传输这个分组。

对于接收方B的窗口来说也差不多也一样,在此不展开。接收方对于失序的分组缓存起来,直到所有丢失的分组全部被收到为止,再把这批分组按序交付给上一层。

我在书上截了张完整的例子图:

fe0e4e9b9ee0fb765cdf781abcd61edd.webp
de72e0b8058be25bc77f6db8e58de9f6.webp在这里插入图片描述
7fc4d62a433978e31e55a626ff42baa5.webp在这里插入图片描述
3436bb529fba1b02baf0a3496983e9dd.webp在这里插入图片描述
230c9ce52503ed0316f1626767c49b60.webp在这里插入图片描述

这样,两个完全陌生的计算机就可以就行可靠数据传输了。这也是可靠数据传输的原理。

3c305bebdf66648ae3f2ea60c7b4f035.webp在这里插入图片描述

最后一点感想

总感觉这篇文章讲的好一般,感觉有点小啰嗦或者…..也不知道怎么说,本来我是想写成那种一点一点引导出知识点的,不过在回退N步和选择重传中,有点不知道怎么引导。不过我会争取在后面的文章讲的更加通俗易懂。

说实话,这篇文章其实算是比较简单的几个知识点,不过我还是写了好久,加上自己画图之列的就更加了,哈哈。主要是一直不知道怎么下手。不过就算花时间,我也会尽最大努力去写。再次感谢读者们的支持,在之后的文章里,应该会数据结构与算法和计算机网络穿插讲。

拥塞控制以及流量控制其实也写过的了,两篇看这里:
三分钟基础:什么是流量控制?

三分钟基础:什么是拥塞控制?

推荐阅读

全部文章详细分类与整理(算法+数据结构+计算机基础)

玩公众号写文章一年多以来,我经历了被喷被拉黑被赞美,我酸了

有必要说一说即将到来的春招(经历+重要性+如何准备)

普普通通,我的三年大学

历经两个月,我的秋招之路结束了!


浏览 112
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报