计算机网络-链路层-差错控制

差错控制


差错控制是数据通信中保障传输可靠性的核心技术,通过检错编码纠错编码两类手段,发现并处理传输过程中产生的比特错误。

检错编码(如奇偶校验、CRC)仅识别错误,不定位错误位置,发现后直接丢弃数据帧并请求发送方重传,实现简单、开销小,适合对实时性要求不高的场景。

纠错编码(如海明码)通过插入冗余校验位,不仅能检测错误,还能精准定位并自动纠正 1 位错误,无需重传,适合重传代价高的场景;扩展后可检测 2 位错误,但 2 位错仍需重传。

整体目标是在有限冗余开销下,最大化数据传输的准确性与效率。所谓差错控制的核心目标就是发现并解决一个帧内部的比特错误,保障数据传输的可靠性。

类型 核心功能 典型实现
检错编码 发现比特错误 → 丢弃帧并要求发送方重传 奇偶校验、CRC 循环冗余校验
纠错编码 发现并纠正比特错误,无需重传 海明码(汉明码)

一、检错编码

1. 奇偶校验码

基本原理

在信息位后添加 1 位校验位,使整个校验码(信息位 + 校验位)中 "1" 的个数满足:

  • 奇校验码:"1" 的个数为奇数
  • 偶校验码:"1" 的个数为偶数(更常用,可通过异或运算实现)
结构示意

**示例:**采用偶校验码进行差错控制,假设有效信息数据是: 10110001

那么信息为中共有偶数个1.因此校验位为0,校验码为:0 10110001

接收方收到数据后,对校验码进行校验,如果发现整个校验码中有偶数个1,则认为没有差错,否则认为数据出错

校验能力
  • 只能检测奇数位错误,无法检测偶数位错误
  • 无法定位错误位置,不具备纠错能力

2. CRC 循环冗余校验码(工程常用)

核心原理

发送方与接收方约定一个生成多项式 G(x),将信息位与校验位组合后,保证能被 G(x) 对应的二进制码模 2 除尽(余数为 0)。

关键参数
  • k:信息位位数
  • r:生成多项式的最高次幂(即校验位位数)
  • 总码长:N=k+r
结构示意

示例 :双方约定生成多项式为G(x)=x3+x2+1G(x)=x^3+x^2+1G(x)=x3+x2+1,信息码为101001,求CRC码

  1. 确定生成多项式二进制码

    G(x)=1⋅x3+1⋅x2+0⋅x1+1⋅x0G(x)=1⋅x^3+1⋅x^2+0⋅x^1+1⋅x^0G(x)=1⋅x3+1⋅x2+0⋅x1+1⋅x0⟹1101

    r=3,k=信息码长度=6,总码长 N=6+3=9

  2. 信息位左移补 0

    在信息位后补 r 个 0 → 101001000

  3. 模 2 除法求余数

    用补 0 后的信息码除以生成多项式 1101,得到 r 位余数(即校验位)(具体运算过程在下方)

  4. 拼接 CRC 码

    CRC 码 = 原信息码 + 余数 → 101001001

模 2 运算规则
  • 模 2 减法 = 异或运算(无借位):1−1=0,1−0=1,0−1=1,0−0=0
  • 模 2 除法:只看被除数最高位,为 1 则商 1 并做模 2 减,为 0 则商 0 并补 0
检错能力
  • 可检测所有奇数位错误
  • 可检测所有长度 ≤r 的突发错误
  • 无法纠错,仅用于检错重传

二、纠错编码:海明码(汉明码)

核心思想

将信息位分组进行偶校验,生成多个校验位,通过多组校验结果定位并纠正 1 位错误。

校验位数量计算(海明不等式)

设信息位为 n 位,校验位为 k 位,总码长 n+k 位,需满足:

2k≥n+k+1 2k≥n+k+1 2k≥n+k+1

  • 含义:k 个校验位可表示 2k 种状态,其中 1 种表示 "无错误",剩余 2k−1 种需覆盖 n+k 位中任意 1 位出错的情况。

示例计算

设信息位=1010(四位,n=4),求海明码:

1.确定海明码的位数
  • 试算 k=3:23=82^3=823=8,4+3+1=8,满足不等式 → 需 3 个校验位 P1 P2 P3
  • 信息位n=4,记为D4 D3 D2 D1
  • 总码长:4+3=7 位,记为 H7 H6 H5 H4 H3 H2 H1
2.确定校验位的分布

三个校验位并不是在开头或者结尾,而是每一个都有自己定位置

校验位Pi要放在海明码位号为2(i−1)2^(i-1)2(i−1)的位置上,信息位则按顺序放到空位:

  • P1→20=1→H1P1 → 2^0=1 → H1P1→20=1→H1
  • P2→21=2→H2P2 → 2^1=2 → H2P2→21=2→H2
  • P3→22=4→H4P3 → 2^2=4 → H4P3→22=4→H4
海明码位 H7 H6 H5 H4 H3 H2 H1
对应位 D4 D3 D2 P3 D1 P2 P1
示例值 1 0 1 0
3.确定分组

有三个校验位,则需要把信息位分成三个组,分别做偶校验得到三个校验码

分组方式:将每个信息位的位置编号转为二进制,二进制中某一位为 1,则该信息位属于对应校验位的分组:

  • D1(H3 → 3 → 011)→ 属于 P1,P2 组
  • D2(H5 → 5 → 101)→ 属于 P1,P3 组
  • D3(H6 → 6 → 110)→ 属于 P2,P3 组
  • D4(H7 → 7 → 111)→ 属于 P1,P2,P3 组

直观的理解:

分组结果:

  • P1 组:D1,D2,D4
  • P2 组:D1,D3,D4
  • P3 组:D2,D3,D4
4.计算校验位取值(偶校验)
  • P1=D1⊕D2⊕D4=0⊕1⊕1=0
  • P2=D1⊕D3⊕D4=0⊕0⊕1=1
  • P3=D2⊕D3⊕D4=1⊕0⊕1=0

生成最终海明码:

海明码位 H7 H6 H5 H4 H3 H2 H1
对应位 D4 D3 D2 P3 D1 P2 P1
示例值 1 0 1 0 0 1 0

填入校验位后得到:1010010


海明码纠错流程

接收端重新计算各组校验结果,得到校正子 S3 S2 S1:

  • 若 S3 S2 S1 = 000 → 无错误
  • 若 S3 S2 S1 != 000 → 该二进制数即为出错位的位置编号 ,即第 S3 S2 S1位出错了将该位取反即可纠正

标准海明码仅具备纠 1 错能力,无法区分 "1 位错" 和 "2 位错"(例如 P1 与 P2 同时跳变)。

扩展方案:增加全校验位

在海明码后新增 1 位校验位,对整个海明码做偶校验:

扩展后海明码 H8 H7 H6 H5 H4 H3 H2 H1
对应位 D4 D3 D2 P3 D1 P2 P1
示例值 1 1 0 1 0 0 1 0
纠错 / 检错判断规则
  1. S3 S2 S1 = 000、且全校验通过 → 无错误
  2. S3 S2 S1 != 000、且全校验失败 → 1 位错,可纠正
  3. S3 S2 S1 != 000、且全校验通过 → 2 位错,需重传

三、三种编码对比总结

特性 奇偶校验 海明码 CRC 循环冗余校验
核心功能 检错(奇数位) 纠 1 错 / 检 2 错 检错(强能力)
冗余位 1 位 k 位(满足 2k≥n+k+1) r 位(生成多项式最高次幂)
运算方式 统计 1 的个数 / 异或 多组偶校验 模 2 除法
纠错能力 ❌ 无 ✅ 可纠 1 位错 ❌ 无
典型应用 内存简易校验 ECC 内存、低延迟通信 网络帧、磁盘存储、USB 传输
相关推荐
( •̀∀•́ )9201 小时前
Linux 下部署 `social-auto-upload` 遇到的问题及完整解决方案
linux·运维·服务器
代码中介商1 小时前
Libevent实战:高性能网络编程指南
linux·运维·网络
怀旧,1 小时前
【Linux网络编程】2. Socket编程 UDP
linux·网络·udp
liulilittle2 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
HelloWorld工程师2 小时前
SSL证书在哪里可以免费且快速申请?
服务器·网络协议·ssl
皮皮学姐分享-ppx2 小时前
上市公司数字技术风险暴露数据(2010-2024)|《经济研究》同款大模型测算
大数据·网络·数据库·人工智能·chatgpt·制造
号码认证服务2 小时前
如何让经销商接电话时看到“XX集团”?申请号码认证统一上线
服务器·经验分享·sql·华为·智能手机·华为云·云计算
皮卡蛋炒饭.3 小时前
应用层协议HTTP
网络·网络协议·http
原来是猿3 小时前
Linux - 【理解进程组、会话与作业控制】
linux·运维·服务器