差错控制¶
数据链路层在传输过程中可能因噪声导致位错(帧内某些比特翻转)。差错控制的任务是发现这些错误,必要时纠正或触发重传。
按处理方式,差错控制分为两类:
| 类型 | 编码方式 | 发现错误后 | 典型方法 |
|---|---|---|---|
| 检错 | 检错编码 | 丢弃帧,请求重传 | 奇偶校验、CRC |
| 纠错 | 纠错编码 | 接收方直接纠正 | 海明码 |
Tip
408 中 差错控制(位错)≠ 可靠传输(帧错):前者管"帧里比特对不对",后者管"帧有没有丢/重/乱",详见 流量控制与可靠传输机制。
检错编码¶
检错编码只需让接收方判断有无错误,出错后通常丢弃并重传,不需要定位错在哪一位。
奇偶校验码¶
Example
奇偶校验利用异或运算(模 2 加,记作 \(\oplus\))生成/检验校验位:
- \(0 \oplus 0 = 0\),\(0 \oplus 1 = 1\),\(1 \oplus 0 = 1\),\(1 \oplus 1 = 0\)
校验位规则(设最高位为校验位):
| 类型 | 规则 | 例:信息位 1001101(4 个 1) |
|---|---|---|
| 奇校验 | 全体比特中 1 的个数为奇数 | 校验位 = 1 → 1 1001101 |
| 偶校验 | 全体比特中 1 的个数为偶数 | 校验位 = 0 → 0 1001101 |
偶校验位的生成:对所有信息位做异或,结果即为偶校验位。例:\(1 \oplus 0 \oplus 0 \oplus 1 \oplus 1 \oplus 0 \oplus 1 = 0\)。
接收方检验:对收到的全部比特(含校验位)做异或。结果为 1 → 检测到错误;结果为 0 → 未检测到错误。
在实际场景中,偶校验的运用比奇校验更加广泛。
Warning
奇偶校验码只能检测出奇数位错,不能检测出偶数位错(两个比特同时翻转,1 的个数奇偶性不变);且无纠错能力。
CRC 循环冗余校验码¶
CRC(Cyclic Redundancy Check)是数据链路层最常用的检错方法,以太网帧尾 FCS 字段即采用 CRC-32。
基本思想¶
把比特串看作多项式系数(高位对应高次项),用生成多项式 \(G(x)\) 做模 2 除法,余数作为冗余码(FCS)附加在数据后面。接收方用同样的 \(G(x)\) 去除,余数为 0 则认为无错。
CRC 码的构造¶
设 \(G(x)\) 的阶数为 \(r\)(即冗余码位数为 \(r\)),信息位对应多项式为 \(M(x)\):
-
在 \(M(x)\) 末尾附加 \(r\) 个 0(相当于乘以 \(x^r\)),得到 \(M(x) \cdot x^r\)
-
用 \(G(x)\) 对 \(M(x) \cdot x^r\) 做模 2 除法,得到余数 \(R(x)\)
-
发送的帧 = 原信息位 + \(R(x)\)(共 \(r\) 位冗余码)
模 2 除法
模 2 运算中,加法和减法都等价于异或(\(\oplus\))。除法过程与二进制除法类似,但每一步的减法都用异或代替:
-
被除数最高位为 1 时,商对应位为 1,用除数异或上去
-
被除数最高位为 0 时,商对应位为 0,下移一位
-
重复直到余数位数小于除数位数
CRC 构造示例
设信息位 1101(\(M(x) = x^3 + x^2 + 1\)),生成多项式 1011(\(G(x) = x^3 + x + 1\),阶数 \(r = 3\))。
-
附加 3 个 0 →
1101000 -
模 2 除法:
1101000 ÷ 1011 ───────────── 1011 → 商 = 101,余数 = 101 ───── 1110 1011 ──── 101 ← 余数 R(x) -
发送帧 =
1101+101=1101101
CRC 码的校验¶
接收方收到帧后,用同样的生成多项式 \(G(x)\) 对整个帧(信息位 + FCS)做模 2 除法:
-
余数为 0 → 认为无差错
-
余数非 0 → 认为有差错,丢弃该帧
Tip
手算 CRC 时,构造和校验用的都是模 2 除法,关键工具是异或运算。计算时先确认 \(G(x)\) 的阶数 \(r\),再决定补几个 0。
CRC 码的检错与纠错能力¶
设 \(G(x)\) 的阶数为 \(r\),则:
| 错误类型 | 检错能力 |
|---|---|
| 任意奇数个比特错 | 全部能检出 |
| 长度为 \(\leq r\) 的突发错 | 全部能检出 |
| 长度为 \(r + 1\) 的突发错 | 检出的概率为 \(1 - 2^{-r}\) |
| 长度 \(> r + 1\) 的突发错 | 检出的概率为 \(1 - 2^{-r}\) |
纠错编码¶
纠错编码不仅能让接收方发现错误,还能定位并纠正错误位,无需重传。408 重点掌握海明码的基本原理。
海明码¶
海明码(Hamming Code)是一种典型的线性分组纠错码,通过增加冗余校验位,使接收方能纠正有限个比特错误。
码距¶
码距(Hamming Distance,也称最小汉明距离 \(d_{\min}\))指任意两个合法码字之间,对应位不同的比特数的最小值。
码距决定纠错/检错能力:
| 最小码距 \(d_{\min}\) | 能力 |
|---|---|
| \(\geq 2\) | 可检测 1 位错 |
| \(\geq 3\) | 可纠正 1 位错,或检测 2 位错 |
| \(\geq 5\) | 可纠正 2 位错,或检测 4 位错 |
| \(\geq 2t + 1\) | 可纠正 \(t\) 位错 |
Tip
408 常考口诀:"纠 \(t\) 需 \(2t+1\),检 \(t\) 需 \(t+1\)"(码距层面)。海明码 \(d_{\min} = 3\),所以能纠 1 位错。
海明码的编码过程¶
以 (7, 4) 海明码 为例:7 位码字中,4 位为信息位,3 位为校验位。
校验位位置:放在编号为 \(2^i\) 的位置(即第 1、2、4 位),其余位置放信息位。
位编号: 1 2 3 4 5 6 7
P1 P2 D1 P4 D2 D3 D4
↑ ↑ ↑
2^0 2^1 2^2
各校验位的覆盖范围:\(P_i\) 负责检查所有编号二进制表示中第 \(i\) 位为 1 的位置。
| 校验位 | 覆盖的位编号 | 覆盖的位 |
|---|---|---|
| \(P_1\)(第 1 位) | 1, 3, 5, 7 | \(P_1, D_1, D_2, D_4\) |
| \(P_2\)(第 2 位) | 2, 3, 6, 7 | \(P_2, D_1, D_3, D_4\) |
| \(P_4\)(第 4 位) | 4, 5, 6, 7 | \(P_4, D_2, D_3, D_4\) |
编码步骤(设 4 位信息为 \(D_1 D_2 D_3 D_4\)):
-
按上表填入信息位
-
每个校验位 = 其覆盖范围内所有位的偶校验(异或结果为 0)
海明码编码示例
设信息位 \(D_1 D_2 D_3 D_4 = 1\ 0\ 1\ 1\)。
位编号: 1 2 3 4 5 6 7
P1 P2 1 P4 0 1 1
-
\(P_1 = D_1 \oplus D_2 \oplus D_4 = 1 \oplus 0 \oplus 1 = 0\)
-
\(P_2 = D_1 \oplus D_3 \oplus D_4 = 1 \oplus 1 \oplus 1 = 1\)
-
\(P_4 = D_2 \oplus D_3 \oplus D_4 = 0 \oplus 1 \oplus 1 = 0\)
最终码字:0 1 1 0 0 1 1
接收方纠错:对 \(P_1, P_2, P_4\) 分别做偶校验,得到纠错码 \(S_1 S_2 S_4\):
-
\(S_1 S_2 S_4 = 000\) → 无错
-
\(S_1 S_2 S_4 \neq 000\) → 将 \(S_1 S_2 S_4\) 看作二进制数,其值即为出错位的编号,翻转该位即可纠正
Abstract
-
奇偶校验只能检奇数位错;CRC 检错能力强得多,是链路层主流方案
-
CRC 的模 2 除法中,加减法都是异或,没有借位/进位
-
CRC 是检错不是纠错——出错后丢弃,不是纠正
-
海明码 \(d_{\min} = 3\):纠 1 位错 / 检 2 位错,校验位放在 \(2^i\) 位置
-
纠错码开销大、实现复杂,实际链路层多用 CRC 检错 + 重传,而非海明码纠错
-
UDP 校验和 也是检错机制,但属于传输层,检验范围含伪首部

