检错编码

导读
大家好,很高兴又和大家见面啦!!!
在上一篇内容中我们介绍了数据链路层的第一个功能------封装成帧。
数据链路层可以通过4种方式实现组帧:
- 字符计数法
- 字节填充法
- 零比特填充法
- 违规编码法
但是因为字符计数法中的计数字段的脆弱性和字节填充法实现上的复杂性与不兼容性,所以目前较常用的 组帧 方法是 零比特填充法 和 违规编码法。
在今天的内容中,我们将会介绍数据链路层的第二个功能------差错控制。
实际通信链路都不是理想的,比特在传输过程中可能产生差错,如:
1变成00变成1
这种就是 比特差错 。比特差错 是传输差错中的一种,在本小节中我们仅讨论比特差错。
数据链路层通常利用编码技术进行 比特差错控制,主要有两类:
-
自动重传请求 (Automatic Repeat re Quest, ARQ):当接收方检测到差错时,就设法通知发送方重发,直到收到正确的数据为止
-
前向纠错 (Forward Error Correction, FEC):接收方不但能发现差错,而且能确定错误的位置并加以纠正
因此差错控制又可分为 检错编码 和 纠错编码。
从本篇内容开始,我们将会依次介绍这两种编码,下面就让我们直接进入今天的内容;
一、定义
检错编码 都采用 冗余编码技术,其核心思想是在有效数据(信息位)被发送前,按某种关系附加一定的冗余位(检验位),构成一个符合某一规则的码字后发送。
当要发送的有效数据变化时,相应的冗余位也随之变化,使得码字遵从不变的规则。接收方根据收到的码字是否符合原规则来判断是否出错。常见的检错编码有 奇偶校验码 和 循环冗余码。
下面我们就来了解一下奇偶校验码;
二、奇偶检验码
2.1 定义
奇偶校验码 是 奇校验码 与 偶校验码 的统称,是一种最基本的检错码。它由 n − 1 n - 1 n−1 位数据和 1 1 1 位检验位组成,检验位的取值(0 或 1)将使整个检验码中 1 的个数为奇数或偶数:
-
奇检验码 :附加一个检验位后, n n n 位的码字中
1的个数为奇数; -
偶检验码 :附加一个检验位后, n n n 位的码字中
1的个数位偶数;
2.2 基本原理
对于 奇偶校验码 ,在硬件层面,可以通过简单的 异或门 实现。所谓的 异或门 是指:数字逻辑电路中的一种基本逻辑门,它的独特之处在于能够检测两个输入信号是否不同。其运算规则为:相同为0,相异为1。
那么对于 奇校验码 和 偶校验码 其最终的异或值为:
- 奇校验码 :信息位 + 检验位 总共有 奇数个
1,其最终的 异或值 为 1 \bm{1} 1 - 偶校验码 :信息位 + 检验位 总共有 偶数个
1,其最终的 异或值 为 0 \bm{0} 0
这里我们以一个简单的例子进行说明;
对于一个 7 位数据 1001 101 ,通过 异或门 ,我们可以得出该数据异或值:
1 ⊕ 0 = 1 1 ⊕ 0 = 1 1 ⊕ 1 = 0 0 ⊕ 1 = 1 1 ⊕ 0 = 1 1 ⊕ 1 = 0 \begin{align*} 1 \oplus 0 &= \bm{\textcolor{red}{1}} \\ \bm{\textcolor{red}{1}} \oplus 0 &= \bm{\textcolor{red}{1}} \\ \bm{\textcolor{red}{1}} \oplus 1 &= \bm{\textcolor{red}{0}} \\ \bm{\textcolor{red}{0}} \oplus 1 &= 1 \\ \bm{\textcolor{red}{1}} \oplus 0 &= 1 \\ \bm{\textcolor{red}{1}} \oplus 1 &= \bm{\textcolor{blue}{0}} \end{align*} 1⊕01⊕01⊕10⊕11⊕01⊕1=1=1=0=1=1=0
从上面的运算过程我们可以看到 1001 101 这个数据的异或值为 0 \bm{\textcolor{blue}{0}} 0 ,这表明数据中含有 偶数 个 1 ,那么其对应的 奇偶校验码 中的 检验位 分别为:
- 奇校验码 : 1 \bm{\textcolor{blue}{1}} 1
- 偶校验码 : 0 \bm{\textcolor{blue}{0}} 0
将该检验位加入到数据中后,我们就得到了最终的 奇偶检验码:
- 奇检验码 : 1001101 1 1001 101\bm{\textcolor{blue}{1}} 10011011
- 偶检验码 : 1001101 0 1001 101\bm{\textcolor{blue}{0}} 10011010
PS: 在 奇偶校验码 中,检验位 可以放在不同的位置,构成不同的 校验码:
- 检验位 放在 信息位 的前面,那么构成的 奇偶校验码 为:检验位 + 信息位;
- 检验位 放在 信息位 的后面,那么构成的 奇偶校验码 为:信息位 + 检验位;
上面所展示的是 信息位 + 检验位
通信双方可以根据具体使用的 校验码 所得到的 异或值 来判断数据是否存在错误:
-
当通信双方规定均使用 奇校验码 时,那么通过 异或 运算获取的 信息位 + 检验位 的异或值为: 1 \bm{1} 1
-
当通信双方规定均使用 偶校验码 时,那么通过 异或 运算获取的 信息位 + 检验位 的异或值为: 0 \bm{0} 0
因此,不管是 奇校验码 还是 偶校验码 ,当接收方将接收到的 校验码 通过 异或 运算获取的 异或值 与规定的 校验码 所得到的 异或值 不相等时,则表示该数据中发生了 比特差错;
2.3 局限性
奇偶校验码 虽然能够检测比特在传输的过程中是否存在问题,但是也仅限于该功能,因此 奇偶校验码 在具体的使用过程中会存在以下问题:
- 无法确定比特在传输的过程中,具体是哪一位发生了差错
- 当有 偶数 个比特发生差错时,通过 奇偶校验码 无法检测出 比特差错
这两个问题也很好理解:
奇偶校验码 判断是否发生 比特差错 的原理是通过比较 校验码 最终的 异或值 ,而对于 校验码 中间的比特值并不关心,因此该 检错编码 无法确定具体发生差错的比特位;
对于 异或值 的获取,当发生 比特差错 的比特位为 奇数位 时,才会改变整个 校验码 最终的 异或值 ,因此该 检错编码 也无法检错出 偶数位 比特发生差错的情况;
结语
至此,我们对数据链路层差错控制中的检错编码进行了一次深入的探索。今天旅程的核心,在于掌握了其"防患于未然"的智慧:
- 通过为数据附加冗余的检验位,构建一道基础的"安检门",从而为其在不可靠信道上的传输保驾护航。
我们聚焦于奇偶校验码 ,揭示了其如何通过精巧的设计,将复杂的检错任务简化为对数据中"1"的个数的奇偶性判断 。这种利用简单硬件(如异或门)即可实现高效检错的思路,体现了工程学的优雅。
然而,任何技术都有其边界。这道"安检门"的能力是有限的:
-
无法定位错误:它只能报警"有入侵",却无法指出"入侵者"的具体位置。
-
偶发错误盲区:当遇到偶数个比特同时出错的情况时,它会不幸地失效。
因此,奇偶校验码 更像是一位忠诚但能力有限的哨兵,适合在对可靠性要求并非极致的场景下站岗。它为我们清晰地勾勒了检错编码的基本范式,同时也引出了一个更具挑战性的问题:
- 当我们不仅需要知道"有错",更想以极高的准确率发现错误时,该怎么办?
这将是我们下一篇内容要解答的谜题------功能更强大、在现实网络世界中应用极其广泛的「循环冗余码 (CRC)」。
我们将一起探索 CRC 是如何通过一种名为 生成多项式 的"精密模具"和 模2除法 的数学运算,以极小的冗余开销,实现远超奇偶校验码的、接近决定性的检错可靠性。
互动与分享
-
点赞👍 - 您的认可是我持续创作的最大动力
-
收藏⭐ - 方便随时回顾这些重要的基础概念
-
转发↗️ - 分享给更多可能需要的朋友
-
评论💬 - 欢迎留下您的宝贵意见或想讨论的话题
感谢您的耐心阅读! 关注博主,不错过更多技术干货。我们下一篇再见!