数据链路层差错控制这一块,最适合这样串起来
本文最后更新于4 天前,其中的信息可能已经过时,如有错误请发送邮件到184874483@qq.com

这一部分在 408 风格里,最好不要把“奇偶校验、CRC、海明码”看成三块互不相干的零散知识,而是要抓住一条主线:码距决定检错/纠错能力,检错码负责发现错误,纠错码负责定位并纠正错误。从考研做题角度看,通常是按“码距 → 奇偶校验 → CRC → 海明码”这一条线来复习最顺。最核心的三个关系式是:若要检测 e 位错,则最小码距 d >= e + 1;若要纠正 t 位错,则最小码距 d >= 2t + 1;若既要纠错又要检错,则常用关系是 d >= e + t + 1(这里的 e 指额外还能检测出的错位数)。这些关系本质上都是围绕“合法码字之间必须拉开足够距离”展开的。(course.buct.edu.cn)

从这一点出发,三类编码的区别就很清楚了。奇偶校验码、CRC 属于检错码,重点是“发现错了没有”;海明码属于纠错码,重点是“发现后还能不能定位并改正”。因此,“数据链路层只能差错检测,不能差错纠正”这种说法如果按绝对化表述来判断,是的。更准确的说法是:数据链路层的差错控制既包括检错也包括纠错;只是计算机网络教材和实际协议里,更常见的是 CRC 检错 + 重传,而不是把海明码作为主流链路层协议的核心机制。(CSDN博客)

奇偶校验码为什么总爱考“1 位错”和“奇数位错”

奇偶校验码最简单,只加 1 位校验位。若采用偶校验,就让“数据位 + 校验位”中 1 的总个数为偶数;若采用奇校验,就让总个数为奇数。它的本质不是“看哪一位错了”,而只是“看整体奇偶性有没有变化”。(华为云社区)

也正因为如此,奇偶校验码有两个非常高频的结论。

第一,一定能检出 1 位错误。因为只要有 1 位翻转,1 的总个数奇偶性一定改变,所以立刻能发现。

第二,凡是奇数位错误都能检出。原因和上面完全一样:每翻转 1 位,奇偶性就变一次;翻转奇数次,最终奇偶性一定改变,所以能发现。反过来,偶数位错误不一定能检出,因为翻转偶数次以后,整体奇偶性可能又回到了原来的状态。(华为云社区)

这一块最容易错的地方就在于,很多题目把“能检 1 位错”故意说成“只能检 1 位错”。这是错的。奇偶校验并不是只能发现 1 位错,而是能发现所有奇数位错,不能保证发现偶数位错。所以考试里看到“奇偶校验可检奇数位错”要立刻反应过来:这句话是对的;看到“奇偶校验可检任意 2 位错”就要立刻判错。

CRC 为什么是检错题的重头戏

CRC 是 408 里最重要的检错编码。它不是靠“数 1 的个数”,而是把二进制序列当作多项式,用生成多项式去做 模 2 除法。题目通常考四件事:

第一,已知数据和生成多项式,求 CRC 校验码。
第二,已知发送码字和生成多项式,判断有没有出错。
第三,已知接收序列,反推原数据和 CRC 位。
第四,辨析“余数为 0”到底表示什么。

CRC 的标准做法固定不变:

设原始数据为 M,生成多项式为 G(x),其最高次幂为 r
先在 M 后补 r 个 0,得到 M·2^r
再用它去除以对应的生成多项式二进制串,得到余数 R
最后发送码字就是 T = M || R
接收端拿收到的序列再去除以生成多项式,如果余数为 0,就说明未检测到差错。注意,这里只能说“未检测到差错”,不能绝对说“传输一定完全正确”。(博客园)

这里最容易错的点有两个。一个是把普通减法当成 CRC 除法,实际上 CRC 用的是模 2 除法,也就是“同 0 异 1”,本质是异或。另一个是把“余数为 0”理解成“绝对没错”,这也不严谨。CRC 只是检错能力很强,不是数学上绝对不会漏检。

海明码为什么属于纠错编码

海明码和前面的检错码不一样,它的重点已经不是“有没有错”,而是“错在哪一位”。它通过在若干特殊位置插入校验位,让每一个数据位都落在一组独特的校验关系中。接收端重新计算这些校验关系后,会得到一个“综合校验结果”,也就是常说的校验子综合症,这个结果可以直接指出哪一位出错。(西安交通大学)

考研里最常用的海明码结论有两个。

一个是校验位个数公式。若信息位有 m 位,校验位有 r 位,则应满足:

2^r >= m + r + 1

这条式子一定要会用,因为“给定数据位数,求至少加多少位校验位”是海明码最常见的计算题。(西安交通大学)

另一个是海明码和码距的关系。标准海明码常按“纠正 1 位错”来理解;从最小码距角度看,它对应的是最小码距为 3 的思路,所以它与“单错纠正”紧密相关。国内考试语境里,通常直接记成“海明码能纠 1 位错”。(ci.tongji.edu.cn)

例题 1:“数据链路层只能提供差错,而不能提供差错纠正”对还是错

这句话按考研判断应为:

原因不是很复杂。数据链路层的“差错控制”本来就包括两部分:检错纠错。CRC、奇偶校验码属于检错,海明码属于纠错。只是从计算机网络协议的主流做法来看,链路层更常见的是“发现出错以后重传”,而不是像信道编码那样大量采用前向纠错。所以教材里常给人一种“链路层主要做检错”的印象,但不能直接说“链路层不能纠错”。(CSDN博客)

这类判断题的陷阱就在“只能”二字。只要题干用了绝对化表述,就要提高警惕。

例题 2:纠正 2 比特错误,码距至少是多少

设要纠正 t = 2 位错误。根据纠错能力公式:

d >= 2t + 1

所以:

d >= 2×2 + 1 = 5

因此答案是:最小码距至少为 5。(course.buct.edu.cn)

这题非常基础,但很容易和“检测 e 位错需要 d >= e + 1”混掉。看到“纠正”二字,脑子里必须立刻切到 2t + 1

例题 3:10 位数据采用海明码,需要增加多少位冗余位

设数据位 m = 10,校验位 r 满足:

2^r >= m + r + 1

代入可得:

r = 3 时,2^3 = 8 < 10 + 3 + 1 = 14,不满足。
r = 4 时,2^4 = 16 >= 10 + 4 + 1 = 15,满足。

所以至少需要增加 4 位冗余信息位。(西安交通大学)

这类题就是纯代公式,几乎没有技巧,关键是别把不等式写错。

例题 4:某差错编码的编码集为 {10011010, 01011100, 11110000, 00001111},其检测和纠错能力是多少

你这道题原文里有些分隔符明显被识别乱了,按最常见题型,应理解为这 4 个 8 位码字构成一个编码集。做法是先求最小码距

两两比较可得:

d(10011010,01011100)=4
d(10011010,11110000)=4
d(10011010,00001111)=4
d(01011100,11110000)=4
d(01011100,00001111)=4
d(11110000,00001111)=8

所以最小码距 d = 4

于是:

若只谈检错能力,则可检 d - 1 = 3 位错。
若只谈纠错能力,则可纠 floor((d - 1)/2) = 1 位错。
若题目要求“同时具有的检错和纠错能力”,则满足 d >= e + t + 1。代入 d = 4,可得一种标准表述是:纠正 1 位错,同时检测 2 位错。(course.buct.edu.cn)

这类题最容易错在最后一句。很多同学算出 d=4 后,只会答“检 3 纠 1”,其实这两个说法分别对应“只检错模式”和“只纠错模式”。若题干强调“检测和纠错能力”,最好把三种说法都交代清楚,最稳。

例题 5:收到比特序列 10110011010,生成多项式为 G(x)=x⁴+x³+1,判断是否出错;若未出错,求原数据和 CRC 码

你题目里写成了 G(x)=x+x+1,这在 CRC 题里显然不成立。结合这道题的常见原题,应当是:

G(x) = x^4 + x^3 + 1

对应二进制除数为 11001。这个题型本身在常见题库里就是这样出的。(牛客网)

先验证收到的序列 10110011010 是否出错。
做模 2 除法:

10110011010 ÷ 11001

按异或除法继续做下去,最后余数为:

0000

所以结论是:未检测到差错。(牛客网)

既然生成多项式最高次幂是 4,那么 CRC 校验位长度就是 4 位。因此收到的 11 位码字可以拆成:

原始数据:前 7 位 1011001
CRC 校验码:后 4 位 1010

还可以反向验证一次:
把原数据 1011001 后补 4 个 0,得到 10110010000
再用 11001 去除,余数恰好为 1010
因此发送码字就是:

1011001 || 1010 = 10110011010

与接收序列一致,所以答案成立。(牛客网)

最后把这一章压成一个做题模板

这一章最适合记成下面这套判断顺序。

先看题目是在问检错还是纠错
如果是奇偶校验,立刻想到:检 1 位没问题,检任意奇数位没问题,偶数位不保证。(华为云社区)
如果是 CRC,立刻想到:补零、模 2 除、取余数、拼接码字、接收端再除。(博客园)
如果是海明码,立刻想到:先算校验位个数 2^r >= m + r + 1。(西安交通大学)
如果题目给了一组码字,立刻想到:先求最小码距,再套 检错 d-1,纠错 floor((d-1)/2)。(course.buct.edu.cn)

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇