数据链路层的具体任务:
- 成帧:将网路层接收到bit流划分为帧 packet,以便于处理
- 寻址:增加头部 规定发送方 和接受方的地址
- 流量控制: 如果数据接收方 接收速率 < 数据发送方的 发送速率,数据链路层就会实行流量控制机制,防止数据大量涌入接受方
- 差错控制:检测和重传被损坏帧,防止重复和丢失帧
- 介质访问控制:多个设备链接到一条线路上时,数据链路层就会根据数据链路层协议来决定任一给定时刻具体哪个设备控制线路
第十章 检错 与纠错
0x01 差错的类型:
单比特差错:给定数据单元中只有一个bit出现差错
突发性差错:给定数据单元中有2位或者多位出现错误
检错:只需要知道有错误
纠错:改成错误
两种纠错方法:
1.向前纠错:需要知道错误的bit个数,以及错误的bit 的位置,然后 还有能
更正
2.重传纠错:只要查出来有错误,就要求重传,直到没有错误位置
如何实现?
通过各种编码方案 来 设置 冗余位。
发送方:将报文 经过生成器 生成 报文+冗余 然后传输给 接受方
接受方 通过效验器 效验 数据 ,纠正 或者 丢弃。
0x02编码方案:
1.块编码:
将报文分成块,每块 k位(一般8位),称为 数据字,并增加r个冗余位 使其 长度变为 n=8+r。即形成 n位
块 称为 码字
数据字一共 有 2的k次方种
码字 一共有 2的n次方种
因为 n > k ,所以 码字的种类 >> 数据字的种类
又因为 码字 和数据字 是一一对应的,所以由 2^n - 2^k 的码字 是无用的,这些称为 无效码
2.汉明距离:(差错控制编码的核心)
两个码字的汉明距离 是 两个码字 不同的对应位的数量
例如:011 和 000 的汉明距离就是2
最小汉明距离:一组码字中所有可能的对的汉明距离的最小值
数据传输中,接收到的码字 和 发送的码字 的汉明距离 就是 发生差错的位数
#一种块编码的最小汉明距离 为 s 的话,那么他的检错能力只有 s-1 位
因为 如果发生 s位,甚至大于s位的差错,一种有效码 就 可以能变成另一种有效码
#一种块编码的最小汉明距离为 2t+1 的话,那么他的纠错能力 只有 t位
可以这样理解:
下图 中 x,y是两个 有效码,如果 差错 和x之间距离 小于t 那么我们就可以将差错
纠正为x,如果差错和y之间的距离小于t 那么我们就可以将差错纠正为y,
如果x 和y之间的汉明距离小于2t,那么就会出现 一个错误码 既可以纠正为x,也可以纠正
为y的情况
2.线性块编码
线性块编码:任何两个有效码异或的结果还是一个有效码
线性快编码的最小汉明距离的简便求法:
大小 最小的 非零 有效码字中 1 的个数 就是最小汉明距离
一些线性块编码:
#简单的奇偶校验码:
n = k+1 dmin = 2 的单bit检错码,没有纠错能力
理论上 只能检测单比特错误,但是奇偶校验码实际上能够检测奇数位的错误。
#两维奇偶校验码:
分别按行和按列生成校验位 ,检错能力为3
#汉明编码:
本书讨论的汉明编码 的 dmin =3 检错能力为2 ,纠错能力为1
具体如何编码如何解码 不深究
#循环编码
一个码字 循环位移 后仍然 是一个码字
例如 1011000 循环左移一位 是 0110001
如何生成循环冗余校验码(CRC)呢? 如何效验?
效验码的产生:
数据字之后补 除数位数-1个 0 然后
去除一个双方约定好的除数(模2除法),最后得到的余数 就是 校验码
注意:模2除法 没有进位 也没有借位。按照除法的套路 ,对应位直接模2减法即可。
0-1 = 1 1-1=0 1-0=1 0-0=0
当余数/被除数 最左边的位非0时,就上1,否则就上0.
并且最后的余数要求 取 除数位数-1 位,不够补零即可。
如何效验?
用码字直接除双方约定好的除数,如果除尽了,就说明没有出错
否则,就出错了。(有些情况下虽然出错了,但是仍然可以除尽,发生概率极小)
那么如何知道双方约定的除数呢?
一般用多项式来表示:(称为 "效验生成多项式"(生成子/生成器/生成多项式))
例如x3+1 就表示 1001
循环码的码字也可以用多项式表示,
这样以上二进制除法就可以变成多项式除法:
其余选讲
0x03 校验和(checksum) 与 反码
校验和 是一种检错方法:发送数据的同时,还发送他们的和 (这个和奇偶编码的思想一样,只不过后者发送的 模2加法的 和)
例如:我们在 发送 7,12,8 这些信息时,还发送了他们的和28 接收方收到三个数后,相加和
他们的和 比对,如果不同,则说明传输出了问题
我们还可以发送-28,这样接收方只需要将四个数加起来,如果不为0,则说明传输出了错。