Appearance
海明码校验与纠错
2026 大纲 三(三)2 纠错编码(海明码)。码距
与检错/纠错能力的关系集中在本篇;模 2 除法与生成多项式属于 CRC 的机制,在《差错检测》。
一、检出来了只能丢弃,能不能直接改
上一节的 CRC 只回答"是/否有错"——余数非 0 就整帧丢弃,连错在哪一位都不知道。丢弃意味着要等对方重传,而有些场景根本没有"对方"可等:光盘和闪存读出来一位错了,找谁重传?深空探测器的信号跑了几个小时才到,重传一次要再等几个小时。
所以要问:能不能让接收端自己把错位找出来、就地改回去? 能,代价是多带冗余。这一节讲的海明码就是最基本的一种纠错码。
要理解它为什么行、能行到哪一步,得先建立一个几何直觉。
二、码距:一切能力的来源
码距是两个等长码字对应位不同的比特数;
把每个合法码字想象成空间中的一个点,出错就是从这个点往外走若干步(走一步 = 翻一位)。三条能力于是全部变成距离条件:
- 检测
位错误 = 从任何合法码字走 步以内绝不踩到另一个合法码字(踩到就会被误判成"没错"),故 ; - 纠正
位错误还要能唯一判断出发点:以合法码字为心、半径 的球必须互不相交,否则落在交叠区的码字无从归属,故 ; - 两者兼得(
)则 。
| 能力 | |
|---|---|
| 2 | 检 1 位(奇偶校验) |
| 3 | 检 2 位 或 纠 1 位(二选一) |
| 4 | 检 2 位 且 纠 1 位 |
检 2 与纠 1 为什么不能兼得,值得说透,因为这是最容易被当成记忆项的一条。设
三、校验位要几个
式子里两个加项各有来历,漏掉任一项都会把
取满足不等式的最小
| 数据位 | 校验位 | 总位数 | 验算 |
|---|---|---|---|
| 1 | 2 | 3 | |
| 2 – 4 | 3 | 5 – 7 | |
| 5 – 11 | 4 | 9 – 15 | |
| 12 – 26 | 5 | 17 – 31 | |
| 27 – 57 | 6 | 33 – 63 |
边界自己会算,不要背表:
编码效率随
四、位置与分组
校验位放在第
分组规则:位置号写成二进制,第
以
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 二进制 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
| 内容 | |||||||
| 被谁覆盖 |
于是
校验位为什么非放
的二进制里只有 1 个 1,所以第 位只被 一个校验位覆盖。这样每个校验位的值可由"自己那一组里的数据位"直接算出,不依赖别的校验位——编码时不会出现循环依赖。若把校验位放末尾连成一片,比如 7 位码字里 占第 1,2,3 位,那么第 3 位(二进制 011)会同时被 和 覆盖,算 要先知道 、算 又要先知道 ,解不开。 - 每个位置的"被覆盖集合"互不相同,且恰好等于该位置号的二进制展开。这是下一节"校正因子拼起来就是错位编号"的前提。
- 覆盖集合的并集是全部位置(1 到
中没有任何一个位置的二进制是全 0),所以每一位都在保护之下,包括校验位自己。
⚠️ 有两种书写顺序。 本篇把位 1 写在最右端;另一种按
从左往右排。位号与分组规则完全相同,只是落笔顺序互为逆序。找 在哪一端即可判断——它永远在位号 1 那一侧。
五、纠错:校正因子拼起来为什么就是错位编号
发送时每一组的异或都被配成 0。设第
把所有
全 0 能表示"无错",是因为位置编号从 1 开始,编号 0 被空了出来——这正是
编码与纠错各走一遍
编码:数据
第 1 步定
第 2 步把数据位填进非
第 3 步算校验位(每组异或为 0):
第 4 步拼出码字:
| 位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 内容 |
海明码
纠错:接收到
为什么可以直接翻转:在"至多 1 位错"的前提下,校正因子给出的编号是唯一的候选。若实际错了 2 位,这个前提不成立,得到的编号会指向一个无辜的位置——这就是误纠。
交互可视化
六、加全局校验位:把"二选一"变成"兼得"
在码字最前(或最后)加一个全局校验位
| 判定 | 动作 | ||
|---|---|---|---|
| 无错 | 接受 | ||
| 1 位错 | 按 | ||
| 2 位错 | 只能检出,不可纠(纠了必错) | ||
| 全局校验位自己错了 | 数据无损,接受 |
第三行要特别记住:
七、边界:海明码不擅长什么
只能纠 1 位。 实际链路上的差错以突发错误为主,一次影响连续多位;对突发错误
冗余开销大于检错码。 海明码
两者不是替代关系,选谁取决于一句话:重传一次贵,还是每帧多带冗余贵。
本节小结
- 能力全来自码距:检
位要 ,纠 位要 ,兼得要 。海明码 ,故检 2 与纠 1 只能二选一;加全局校验位提到 4,多出"错误位数奇偶性"信号 才兼得,且 且 时只报不纠。 中 是校验位自己也在保护范围内、 是给"无错"留的编号。校验位放第 位最要紧的理由是该位只被一个校验位覆盖,编码时不会循环依赖。 - 分组规则与纠错读法是同一条规则正反用两遍:按位置号二进制分组,所以校正因子拼起来读出的就是出错位的位置编号。边界上海明码只纠 1 位,对突发错误要靠交织摊开,效率也不及检错码。
考点速记
本节在真题里被考过的形式,考的不是海明码的编码流程,而是它背后那三条不等式——给一个编码集,问它的检错与纠错能力(cn-2025-34,编码集 {1001 1010, 0101 1100, 1111 0000, 0000 1111})。三步:
- 两两算码距(对应位不同的比特数)。4 个码字有 6 对,逐对异或数 1 的个数即可。本题除了后两个码字相距 8,其余各对都是 4。
- 取最小值得
——本题 。 - 代两条不等式:检
位需 ;纠 位需 。答"不超过 3 位错的 100% 检错、不超过 1 位错的纠错"。
第 3 步是四个选项唯一的分岔口:选项通常在检 2/检 3、纠 1/纠 2 之间排列组合,算错
海明码本身的编码与纠错流程(定
易错:纠
位要向下取整。 时 给出 ,只能纠 1 位。 是偶数时,多出来的那一格用在检错上而不是纠错上。
易错:"检
位"与"纠 位"是两套独立的不等式,不能相加使用。 同时要求检 纠 ( )时用第三条 ,比单看两条都严。
易错:
是所有码字对里的最小值,不是随便挑一对算出来的值。漏算某一对就可能把 取大。
易错:
里的 和 都不能漏——校验位自己也要被保护,还要留一个编号表示无错。写成 会把 算小。
易错:校验位在第
位(1、2、4、8),不是第 1、2、3、4 位。 在第 4 位,第 3 位是数据位。
易错:加了全局校验位之后,
且 判为 2 位错,此时只能报错不能纠。按 去纠会把 2 位错变成 3 位错。
教材出处
谢希仁《计算机网络》(第 8 版)全书未涉及海明码,因此本篇的编码原理部分无该书可引;此处只引与"链路层要不要纠错"这一判断直接相关的段落,其余结论未在正文中标注页码出处。
- 谢希仁《计算机网络》(第 8 版)p79(3.2.1 PPP 协议应满足的需求,第 1 条"简单"):说明为什么 TCP/IP 体系的链路层不采用纠错编码——"IETF 在设计互联网体系结构时把其中最复杂的部分放在 TCP 协议中……在这种情况下,数据链路层没有必要提供比 IP 协议更多的功能。因此,对数据链路层的帧,不需要纠错,不需要序号,也不需要流量控制";同页给出链路层的实际动作:"接收方每收到一个帧,就进行 CRC 检验。如 CRC 检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做。"
- 同书 p80:再次确认这一分工——"在 TCP/IP 协议族中,可靠传输由运输层的 TCP 协议负责,因此数据链路层的 PPP 协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。"
- 同书 p78:链路层用 CRC 只能实现"无比特差错"而非可靠传输,是理解"检错 + 重传"路线与"纠错编码"路线分野的前提。
相关知识
差错检测(CRC 校验)|封装成帧与透明传输|三种 ARQ 协议对比