差错检测
汉明距离
汉明距离:汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。
计算方式:对两个字符串进行异或运算(),并统计结果为 的个数,那么这个数就是汉明距离。
最小汉明距离:在一个码组集合中,任意两个码字之间对应位上码元取值不同的位的数目定义为这两个码字之间的汉明距离。在一个码组集合中,任意两个编码之间汉明距离的最小值称为这个码组的最小汉明距离。最小汉明距离越大,码组越具有抗干扰能力。
设:码组的最小汉明距离为 。
- 若码组用于检错,设可以检错 个位,那么 (也即对于确定的 ,最多可以检测 个位的错误)。
- 设有两个距离为 的码字 A 和 B,如果 A 出现了 个错误,则 A 变成了以 A 为圆心, 为半径的球体表面的码字。为了能够准确地分辨出这些码字既不是 A 也不是 B,那么 A 误码后变成的球面上的点与 B 至少应该有一位距离(如果 B 在球面上或在球面内部则无法分辨出到底 B 是不是 A 的错误码),即 A 与 B 之间的最小距离 。
- 若码组用于纠错,设可以纠错 个位,那么 。
- 设有码字 A 和 B,如果 A 出现了 个错误,B 也出现了 个错误,则 A 码变成以 A 为圆心、 为半径的球面上的码字;B 码变成以 B 为圆心、 为半径的球面上的码字。为了在出现 个错之后,仍能分辨一个码字到底是属于 A 的错码还是属于 B 的错码,A、B 为球心的两个球面应该不相交,即球心 A、B 之间距离应该大于 ,所以 。
- 若码组用于检错 + 纠错,设可以检错 个位、纠错 个位,那么,这里 。这种检错 + 纠错方式结合的情况同上述两个情况类似。
- 当码字出现 个或者小于 个错时,系统按照纠错方式工作。
- 当码字出现超过 个错而小于等于 个错时,系统按照检错方式工作。
- 当 A 出现 个错,B出现 个错时,既要发现 A 的错,又要纠正 B 的错,则以 A 为球心, 为半径的球和以 B 为球心, 为半径的球应该不相交,所以 A、B 之间的距离应该大于等于 ,即 。
奇偶校验码
奇偶校验码是一种通过增加冗余位使得码字中 "1" 的个数恒为奇数或偶数的编码方法,它是一种检错码,用来检测数据传输过程中是否发生错误。顾名思义,它有两种校验方法:奇校验和偶校验。
- 奇校验:原始码流 + 校验位 总共有奇数个 。即若原始码流中 的个数为奇数,那么最后的冗余位为 ,否则为 。
- 偶校验:原始码流 + 校验位 总共有偶数个 。即若原始码流中 的个数为奇数,那么最后的冗余位为 ,否则为 。
奇偶校验码只能检测出发生奇数个错误的情况,即发生错误 位、 位 ... 位。
校验和(CheckSum)
发送端生成校验和:
- 将发送的进行检验和运算的数据分成若干个 16 位的位串,每个位串看成一个二进制数。
- 将 IP、UDP 或 TCP 的 PDU 首部中的检验和字段置为 0 ,该字段也参与检验和运算。
- 对这些 16 位的二进制数进行 1 的补码和(one's complement sum)运算,累加的结果再取反码即生成了检验码。将检验码放入检验和字段中。
- 其中 1 的补码和运算:即带循环进位(end round carry)的加法,最高位有进位应循环进到最低位。
- 反码:即二进制各位取反,如 0111 的反码为 1000 。
接收方校验检验和:
- 接收方将接收的数据(包括检验和字段)按发送方的同样的方法进行 1 的补码和运算,累加的结果再取反码。
- 校验,如果上步的结果为 0,表示传输正确;否则,说明传输有差错。

循环冗余检验(CRC)
Cyclic Redundancy Check 编码是在数据通信中常用的一种差错校验码。由信息字段和校验字段组成,其中信息字段和校验字段长度可以任意选定。目前数据链路层广泛使用了循环冗余检验(CRC)来检查比特差错。
CRC工作方法:在发送端产生一个循环冗余码,附加在信息位后面一起发送到接收端,接收端收到的信息按发送端形成循环冗余码同样的算法进行校验,若有错,需重发。
CRC校验码的算法分析:CRC 校验码的编码方法是用待发送的二进制数据 除以生成多项式 ,将最后的余数作为 CRC 校验码。
- 设待发送的数据块是 位的二进制多项式 ,生成多项式为 阶的 。
- 在数据块的末尾添加 个 ,即数据块左移 位,此时数据块的长度增加到 位。
- 用生成多项式 去除左移后的数据块 ,求得余数为阶数为 的二进制多项式 。此二进制多项式 就是 经过生成多项式 编码后的 CRC 校验码。例如:数据块 、,那么 , 模 的余数为 。
- 与 的组合即为包含了 CRC 校验码的待发送数据块。

接收端解码:解码时,可以用接受到的数据去除 ,如果余数为零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。解码时,将接收到的二进制数据去掉尾部的 位数据,得到的就是发送端的原始数据 。
循环冗余校验码的特点:
- 可以检测所有突发长度小于 位差错。
- 可检测出所有奇数位错。
- 可检测出所有双比特的错。
注:本文多为参考百度百科和博客的学习笔记,非原创内容。