前言
详解计算机网络基础中的循环冗余检验(CRC),从模二运算入手,举例说明,层层深入,一举拿下循环冗余算法。
模二运算
简单来说就是:异或运算 (相同为0,相异为1)
1.模二加减运算
0 ± 0 = 0 0±0=00±0=0
0 ± 1 = 1 0±1=10±1=1
1 ± 0 = 1 1±0=11±0=1
1 ± 1 = 0 1±1=01±1=0
2.模二乘法运算
1101 × 101 —————————— 1101 0000 1101 —————————— 111001
3.模二除法运算
110101(商) _____________ (除数)1101 | 101001000(被除数) 1101 ———— 01110 1101 ———— 001110 1101 ———— 001100 1101 ———— 001 (余数,位数为除数位数-1)
循环冗余检验
帧检验序列(FCS):模二除法运算所得的余数,例如上面模二除法运算所得的余数是 001 在循环冗余校验中就叫做帧检验序列。
生成多项式:用多项式表示循环冗余检验中的被除数与除数,例如上面模二除法运算的除数 1101 就可以表示成
样例
发送的数据(被除数):M = 101001(k = 6)
除数:P = 1101(n = 3)
① 补零:在数据(被除数)后面补 n 个零,n 是除数的位数 -1,在这里补 3 个零(补零这个步骤是为了求 FCS,进而得到接收方接收到的序列)
② 运用模二除法运算得:
110101(商) _____________ 1101 | 101001000(被除数,后面三个0是补的) 1101 ———— 01110 1101 ———— 001110 1101 ———— 001100 1101 ———— 001 (余数,位数 n 为除数位数-1)
即商 Q = 110101(没用),余数 R1 = 001(帧检验序列FCS)
③ 所以发送的帧为 101001 001,即接收方接收到的帧为 101001 001。
④ 用接收方接收到的帧作为被除数,再与除数进行模二运算,得到新的余数R2。
⑤ 判断,若R2 = 0,则这个帧没有差错,否则有错(但是无法判断哪里错了)。
举例说明
1101010(商) _____________ 11001 | 10110011010 11001 ————— 011110 11001 ————— 001111 00000 ————— 11111 11001 ————— 001100 00000 ————— 11001 11001 ————— 000000 000000 ————— 0
④ 判断:结果为 0,没有出错
100001(商) _____________ 11001 | 1100110000 11001 ————— 0000010000(简便运算:该步骤后面从被除数中拉下来4位,则直接在商里补4个零即可) 11001 ————— 1001
1100001010(商) __________________ 10011 | 11010110110000 10011 ————— 010011 10011 ————— 0000010110 10011 ————— 0010100 10011 ————— 01110(超出4位,从后往前取4位,得到R=1110)
④ 传输的数据为: 1101 0110 11 1110
2.最后一个1变成了0 → 1101 0110 11 1100
① 直接进行模二除法运算:
1100001010(商) __________________ 10011 | 11010110111100 10011 ————— 010011 10011 ————— 0000010111 10011 ————— 0010010 10011 ————— 0010 (从后往前保留4位)
② 判断:R不为0,出现差错
3.最后两个1变成了0 → 1101 0110 11 1000
① 直接进行模二除法运算:
1100001010(商) __________________ 10011 | 11010110111000 10011 ————— 010011 10011 ————— 0000010111 10011 ————— 0010000 10011 ————— 0110 (从后往前保留4位)
② 判断:R不为0,出现差错