【计算机网络】数据链路层 : 差错控制 ( 纠错编码 | 海明码 | “海明码“ 原理 | “海明码“ 工作流程 | 确定校验啊位数 | 确定校验码和数据位置 | 求校验码值 | 检错纠错 )★





一、 “海明码” 工作原理



海明码 可以 发现 双比特错误 , 但只能纠正 单比特错误 ;


海明码 工作原理 :

① 添加校验码 : 发送数据 , 在数据中加入 冗余信息 ( 冗余码 / 校验码 ) ;

② 校验码作用 : 每个 校验码 不仅可以校验本身的信息 , 还可以同时校验多为信息 ;

③ 比特位 多重校验 : 某些 比特位 可以 同时被多个校验码校验 ;

④ 检查差错 : 如果这个被多位校验码校验的比特位 出现错误 , 那么多个校验码校验时 , 就会知道数据 出现差错 ;

⑤ 定位差错 : 每个校验码逐个校验 , 最终能 定位出是哪个比特位出现了差错 , 从而将其纠正 ;





二、 “海明码” 工作流程



"海明码" 工作流程 :

  • 确定校验码位数
  • 确定校验码位置 和 数据位置
  • 求校验码值
  • 检错纠错




三、 确定校验码位数



海明不等式 : 2rk+r+12^r \geq k+r+1

  • rr 是冗余信息位
  • kk 是信息位

根据信息位位数 , 求出满足 海明不等式 最小的 r ;


确定校验码位数示例 : 发送数据 101101101101 , 求海明码位数 ;

① 数据位数 : k=6k = 6 ;

② 将数据位数代入海明不等式 : 2r6+r+12^r \geq 6+r+1

③ 满足海明不等式最小 rr 计算 : 2r7+r2^r \geq 7+r , 依次从 11 开始代入 , 获取满足不等式最小的 rr 的值为 44 ;

④ 发送数据 : 发送的数据 海明码 是 1010 位 , 其中 原始数据有 66 位 , 校验码有 44 位 ;





四、 确定校验码和数据位置





0、 确定校验码位置



确定校验码和数据位置 : 发送数据 101101101101 , 海明码位数 为 1010 位 ;

① 校验码 44 位 : P1P_1 , P2P_2 , P3P_3 , P4P_4 ;

② 数据位 66 位 : D1D_1 , D2D_2 , D3D_3 , D4D_4 , D5D_5 , D6D_6 ;

③ 校验码位置 : 校验码 只能放在 22 的幂次方位置 , 如 20=12^0 = 1 , 21=22^1 = 2 , 22=42^2 = 4 , 23=82^3 =8 , 2n2^n等位置 ;

④ 数据位置 : 数据位 按照顺序依次 放在 非校验码位置上 ;

⑤ 最终生成的数据位 :

数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1P_1 P2P_2 11 P3P_3 00 11 11 P4P_4 00 11


1、 引入二进制位



求校验码值 :

在表格中引入二进制位 : 二进制的位数 就是 以 能代表 最大的序列索引的位数为准 , 如 该 数据 有 1010 位 , 最大索引值是 1010 , 对应二进制时 10101010 , 需要 44 位二进制数表示 , 这里的二进制位数是 44 ;

二进制位 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1P_1 P2P_2 11 P3P_3 00 11 11 P4P_4 00 11


2、 P1 校验位 计算



P1P_1 校验的位 计算 : P1P_1 对应的二进制位是 00010001 , 第一位是 11 , 查看 哪些 二进制位 的数据位 第 11 位是 11 ;

  • 数据位索引 33 : 00100111 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D1D_1 位 , 值为 11 ;
  • 数据位索引 55 : 01001011 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D2D_2 位 , 值为 00 ;
  • 数据位索引 77 : 01101111 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D4D_4 位 , 值为 11 ;
  • 数据位索引 99 : 10010011 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D5D_5 位 , 值为 00 ;

令所有要校验的位 异或 ( \oplus ) 计算后为 00 ;

异或计算 \oplus :00 , 异 11 , 两个位不同时为 11 , 两个位相同时为 00 ;


D1D2D4D5P1=01010P1=0110P1=000P1=00P1=0\begin{array}{lcl}D_1 \oplus D_2 \oplus D_4 \oplus D_5 \oplus P_1 &=& 0 \\\\ 1 \oplus 0 \oplus 1 \oplus 0 \oplus P_1 &=& 0 \\\\ 1 \oplus 1 \oplus 0 \oplus P_1 &=& 0 \\\\ 0 \oplus 0 \oplus P_1 &=& 0 \\\\ 0 \oplus P_1 &=& 0 \end{array}

【计算机网络】数据链路层 : 差错控制 ( 纠错编码 | 海明码 | “海明码“ 原理 | “海明码“ 工作流程 | 确定校验啊位数 | 确定校验码和数据位置 | 求校验码值 | 检错纠错 )★

P1=0P_1 = 0 才能使上述式子成立 , 因此 校验位 P1=0P_1 = 0 ;



3、 P2 校验位 计算



P2P_2 校验的位 计算 : P2P_2 对应的二进制位是 00100010 , 第二位是 11 , 查看 哪些 二进制位 的数据位 第 22 位是 11 ;

  • 数据位索引 33 : 00001111 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D1D_1 位 , 值为 11 ;
  • 数据位索引 66 : 01011100 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D3D_3 位 , 值为 11 ;
  • 数据位索引 77 : 01011111 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D4D_4 位 , 值为 11 ;
  • 数据位索引 1010 : 10101100 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D6D_6 位 , 值为 11 ;

D1D3D4D6P2=01111P2=0011P2=011P2=00P2=0\begin{array}{lcl}D_1 \oplus D_3 \oplus D_4 \oplus D_6 \oplus P_2 &=& 0 \\\\ 1 \oplus 1 \oplus 1 \oplus 1 \oplus P_2 &=& 0 \\\\ 0 \oplus 1 \oplus 1 \oplus P_2 &=& 0 \\\\ 1 \oplus 1 \oplus P_2 &=& 0 \\\\ 0 \oplus P_2 &=& 0 \end{array}


P2=0P_2 = 0 才能使上述式子成立 , 因此 校验位 P2=0P_2 = 0 ;



4、 P3 校验位 计算



P3P_3 校验的位 计算 : P3P_3 对应的二进制位是 01000100 , 第 33 位是 11 , 查看 哪些 二进制位 的数据位 第 33 位是 11 ;

  • 数据位索引 55 : 00110101 , 二进制的第 33 位是 11 , 红色部分 ; 对应数据位 D2D_2 位 , 值为 00 ;
  • 数据位索引 66 : 00111010 , 二进制的第 33 位是 11 , 红色部分 ; 对应数据位 D3D_3 位 , 值为 11 ;
  • 数据位索引 77 : 0011011011 , 二进制的第 33 位是 11 , 红色部分 ; 对应数据位 D4D_4 位 , 值为 11 ;

D2D3D4P3=0011P3=011P3=00P3=0\begin{array}{lcl}D_2 \oplus D_3 \oplus D_4 \oplus P_3 &=& 0 \\\\ 0 \oplus 1 \oplus 1 \oplus P_3 &=& 0 \\\\ 1 \oplus 1 \oplus P_3 &=& 0 \\\\ 0 \oplus P_3 &=& 0 \end{array}


P3=0P_3 = 0 才能使上述式子成立 , 因此 校验位 P3=0P_3 = 0 ;



5、 P4 校验位 计算



P4P_4 校验的位 计算 : P4P_4 对应的二进制位是 10001000 , 第 44 位是 11 , 查看 哪些 二进制位 的数据位 第 44 位是 11 ;

  • 数据位索引 99 : 11001001 , 二进制的第 44 位是 11 , 红色部分 ; 对应数据位 D5D_5 位 , 值为 00 ;
  • 数据位索引 1010 : 11010010 , 二进制的第 44 位是 11 , 红色部分 ; 对应数据位 D6D_6 位 , 值为 11 ;

D5D6P4=001P4=01P4=0\begin{array}{lcl}D_5 \oplus D_6 \oplus P_4 &=& 0 \\\\ 0 \oplus 1 \oplus P_4 &=& 0 \\\\ 1 \oplus P_4 &=& 0 \end{array}


P4=1P_4 = 1 才能使上述式子成立 , 因此 校验位 P4=1P_4 = 1 ;



6、 最终海明码结果



计算出的四个校验码 :

  • P1=0P_1 = 0
  • P2=0P_2 = 0
  • P3=0P_3 = 0
  • P4=1P_4 = 1

将上述校验码填写到表格中 :

二进制位 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1=0P_1 = 0 P2=0P_2 = 0 11 P3=0P_3=0 00 11 11 P4=1P_4=1 00 11

最终海明码为 : 00001100011011110101 , 蓝色是数据位 , 红色是校验位 ;





五、 检错纠错



发送的正确的海明码数据是 : 00001100011011110101 , 蓝色是数据位 , 红色是校验位 ;


海明码数据表格是 :

二进制位 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1=0P_1 = 0 P2=0P_2 = 0 11 P3=0P_3=0 00 11 11 P4=1P_4=1 00 11

假设 海明码 第 55 位出现错误 , D2D_2 数据原来是 00 , 出现错误变成 11 ;

正确海明码 : 00001100011011110101

错误海明码 : 00001100111111110101 , 第 55 位 的 00 变成了 11 ;

【计算机网络】数据链路层 : 差错控制 ( 纠错编码 | 海明码 | “海明码“ 原理 | “海明码“ 工作流程 | 确定校验啊位数 | 确定校验码和数据位置 | 求校验码值 | 检错纠错 )★


检错过程 : 44 个检验位 , 每个检验位 , 令所有要校验的位进行异或 \oplus 运算 ;


错误海明码数据表格是 :

二进制位 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1=0P_1 = 0 P2=0P_2 = 0 11 P3=0P_3=0 11( 错误位 ) 11 11 P4=1P_4=1 00 11


1、 P1 校验位 校验



P1P_1 校验的位 计算 : P1P_1 对应的二进制位是 00010001 , 第一位是 11 , 查看 哪些 二进制位 的数据位 第 11 位是 11 ;

  • 数据位索引 33 : 00100111 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D1D_1 位 , 值为 11 ;
  • 数据位索引 55 : 01001011 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D2D_2 位 , 值为 11 ;
  • 数据位索引 77 : 01101111 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D4D_4 位 , 值为 11 ;
  • 数据位索引 99 : 10010011 , 二进制的第一位是 11 , 红色部分 ; 对应数据位 D5D_5 位 , 值为 00 ;

令所有要校验的数据位 和 校验位 , 异或 ( \oplus ) 计算后为 00 ;

异或计算 \oplus :00 , 异 11 , 两个位不同时为 11 , 两个位相同时为 00 ;


D1D2D4D5P1=11100=0100=100=10=1\begin{array}{lcl} &&D_1 \oplus D_2 \oplus D_4 \oplus D_5 \oplus P_1 \\\\ &=& 1 \oplus 1 \oplus 1 \oplus 0 \oplus 0 \\\\ &=& 0 \oplus 1 \oplus 0 \oplus 0 \\\\ &=& 1 \oplus 0 \oplus 0 \\\\ &=& 1 \oplus 0 \\\\ &=& 1 \end{array}


P1P_1 校验位 校验出错 ; D1,D2,D4,D5D_1 , D_2, D_4, D_5 位中 , 有错误出现 ;



2、 P2 校验位 校验



P2P_2 校验的位 计算 : P2P_2 对应的二进制位是 00100010 , 第二位是 11 , 查看 哪些 二进制位 的数据位 第 22 位是 11 ;

  • 数据位索引 33 : 00001111 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D1D_1 位 , 值为 11 ;
  • 数据位索引 66 : 01011100 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D3D_3 位 , 值为 11 ;
  • 数据位索引 77 : 01011111 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D4D_4 位 , 值为 11 ;
  • 数据位索引 1010 : 10101100 , 二进制的第 22 位是 11 , 红色部分 ; 对应数据位 D6D_6 位 , 值为 11 ;

D1D3D4D6P2=11110=0110=110=00=0\begin{array}{lcl} &&D_1 \oplus D_3 \oplus D_4 \oplus D_6 \oplus P_2 \\\\ &=& 1 \oplus 1 \oplus 1 \oplus 1 \oplus 0 \\\\ &=& 0 \oplus 1 \oplus 1 \oplus 0 \\\\ &=& 1 \oplus 1 \oplus 0 \\\\ &=& 0 \oplus 0 \\\\ &=& 0 \end{array}


P2P_2 校验位 校验正确 ; D1,D3,D4,D6D_1 , D_3, D_4, D_6 位数据正确 ;



3、 P3 校验位 校验



P3P_3 校验的位 计算 : P3P_3 对应的二进制位是 01000100 , 第 33 位是 11 , 查看 哪些 二进制位 的数据位 第 33 位是 11 ;

  • 数据位索引 55 : 00110101 , 二进制的第 33 位是 11 , 红色部分 ; 对应数据位 D2D_2 位 , 值为 11 ;
  • 数据位索引 66 : 00111010 , 二进制的第 33 位是 11 , 红色部分 ; 对应数据位 D3D_3 位 , 值为 11 ;
  • 数据位索引 77 : 0011011011 , 二进制的第 33 位是 11 , 红色部分 ; 对应数据位 D4D_4 位 , 值为 11 ;

D2D3D4P3=1110=010=10=1\begin{array}{lcl} &&D_2 \oplus D_3 \oplus D_4 \oplus P_3 \\\\ &=& 1 \oplus 1 \oplus 1 \oplus 0 \\\\ &=& 0 \oplus 1 \oplus 0 \\\\ &=& 1 \oplus 0 \\\\ &=& 1 \end{array}


P3P_3 校验位 校验出错 ; D2,D3,D4D_2 , D_3, D_4 位中 , 有错误出现 ;



4、 P4 校验位 校验



P4P_4 校验的位 计算 : P4P_4 对应的二进制位是 10001000 , 第 44 位是 11 , 查看 哪些 二进制位 的数据位 第 44 位是 11 ;

  • 数据位索引 99 : 11001001 , 二进制的第 44 位是 11 , 红色部分 ; 对应数据位 D5D_5 位 , 值为 00 ;
  • 数据位索引 1010 : 11010010 , 二进制的第 44 位是 11 , 红色部分 ; 对应数据位 D6D_6 位 , 值为 11 ;

D5D6P4=011=11=0\begin{array}{lcl} &&D_5 \oplus D_6 \oplus P_4 \\\\ &=& 0 \oplus 1 \oplus 1 \\\\ &=& 1 \oplus 1 \\\\ &=& 0 \end{array}


P4P_4 校验位 校验正确 ; D5,D6D_5, D_6 位数据正确 ;



5、 纠错



校验结果 :

  • P1P_1 校验位 校验出错 ; D1,D2,D4,D5D_1 , D_2, D_4, D_5 位中 , 有错误出现 ;
  • P2P_2 校验位 校验正确 ; D1,D3,D4,D6D_1 , D_3, D_4, D_6 位数据正确 ;
  • P3P_3 校验位 校验出错 ; D2,D3,D4D_2 , D_3, D_4 位中 , 有错误出现 ;
  • P4P_4 校验位 校验正确 ; D5,D6D_5, D_6 位数据正确 ;

综合上面 44 次校验结果 , 发现 D2D_2 数据错误 , 将下面的表格中的 D2D_2 错误纠正 , 由 11 纠正成 00 即可 ;


错误海明码数据表格是 :

二进制位 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1=0P_1 = 0 P2=0P_2 = 0 11 P3=0P_3=0 11( 错误位 ) 11 11 P4=1P_4=1 00 11

正确海明码数据表格是 :

二进制位 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位索引 1 2 3 4 5 6 7 8 9 10
名称 P1P_1 P2P_2 D1D_1 P3P_3 D2D_2 D3D_3 D4D_4 P4P_4 D5D_5 D6D_6
实际值 P1=0P_1 = 0 P2=0P_2 = 0 11 P3=0P_3=0 00( 纠错后的结果 ) 11 11 P4=1P_4=1 00 11

最终将错误的海明码 00001100111111110101 ( 第 55 位 的 00 变成了 11 ) , 纠正 为 正确的海明码 00001100011011110101 ;