计网学习笔记(一):差错控制(奇偶校验、海明校验、循环冗余校验)(超详细!!)

差错控制

由于数据通信系统传输特性的不理想和外部干扰的存在,传输中出现差错是不可避免的。
差错控制的目的:确保所有的帧按顺序正确递交到数据链路层用户(网络层实体)。
差错的分类:随机差错(随机的、单个的),突发差错(成片的、连续的)
差错控制的原理:在发送的数据码元序列中加入监督位,使监督位和数据位之间存在某种约束关系;在接收端检测约束关系是否被破坏从而查错,甚至可以纠错。
检错码:可以发现错误,但不能纠正错误。
纠错码:可以自动纠正错误。
计网学习笔记(一):差错控制(奇偶校验、海明校验、循环冗余校验)(超详细!!)_第1张图片
码间距离(d) :两个码字的对应位取值不同的个数。
汉明距离(d0) :一个有效编码集中,任意两个码字的码间距离的最小值。即一组编码中的最小码距。
如果要能检测 e 个差错,则编码集的汉明距离至少为 e + 1; 如果要能纠正 t 个差错,则编码集的汉明距离至少为 2 t + 1; 如果要能检测 e 个差错,同时能纠正 t 个差错( e > t ) ,则编码集的汉明距离至少为 e + t + 1;
检错码:循环冗余码、奇偶校验码
纠错码:汉明码

差错控制的几种编码

奇偶校验码

奇偶校验码是在数据码后附加一个校验位,使构成的码组中“1”的个数为奇数(奇校验)或偶数(偶校验)。接收端收到这组二进制数据后,则校验“1”的个数是否为奇数(偶数),从而确定传输代码的正确性。

水平奇偶校验

在每一行数据的最后加上一个校验位,使信息位与校验位处于同一行。

垂直奇偶校验

把数据分成若干组,一组数据排成一列,每一列后面加一个校验位,针对每一列采用奇校验或偶校验,最后数据列向传输。
例:
有32位数据10100101 00110110 11001100 10101011
垂直奇校验
1011
0010
1101
0100
0011
1110
0101
1001
1110 校验位

二维奇偶校验码

就是同时用水平校验和垂直校验。

接收端收到这组二进制数据后,则校验“1”的个数是否为奇数(偶数),从而确定传输代码的正确性。
特点:奇偶校验码只能检测出奇数个错码,而不能检测出偶数个错码,更不能纠错。奇偶校验码检错能力不高,但易于实现。

海明校验码

详细步骤:
1.确定校验位个数
核心公式:2^r ≥k+r+1 ,(其中r代表校验个数,k表示数据位数)
(重要!)从公式带入计算可得一张表:
在这里插入图片描述
2.确定校验位的位置
核心:校验码Pi 必须是在2的n次方位置,即只能放在H1,H2,H4,H8…
注意:这里指的位置都是从右向左排序,即:…H5 H4 H3 H2 H1
以下以4位信息码为例进行编码。
信息码组:1101 -----即: D3 D2 D1 D0 = 1 1 0 1
根据公式:2^r ≥k+r+1(或者表)得校验位 r=3,即校验位为 P3 P2 P1。
又因为上述Pi 只能放在2的n次方的位置,所以 P1插入H1,P2插入H2,P3插入H4。
信息码填入剩下的位置。
即:D0为H3,D1为H5,D2为H6,D3为H7
整理可得: H7 H6 H5 H4 H3 H2 H1
= D3 D2 D1 P3 D0 P2 P1
代入数字 = 1 1 0 P3 1 P2 P1
3.计算校验位
核心:通过数据位的下标可分解为几个校验位的下标之和,例如H7=H1+H2+H4;H6=H2+H4;H5=H1+H4;H3=H2+H1。
可得:P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或,即:与H1有关的信息码进行异或)
P2(H2) = H3 ⊕ H6 ⊕ H7
P3(H4) = H5 ⊕ H6 ⊕ H7
计算可得:P1 = 0,P2 = 1,P3 = 0
所以:最终海明码: H7 H6 H5 H4 H3 H2 H1 = 1 1 0 0 1 1 0
4.检错和纠错
设检测位G1,G2,G3:
则有:G1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 ;
G2 = P2 ⊕ H3 ⊕ H6 ⊕ H7;
G3 = P3 ⊕ H5 ⊕ H6 ⊕ H7;
当校验时得到G3 G2 G1 值皆为0则数据无误,若G3 G2 G1不全为0说明数据传输有误,且其十进制指出了错误发生的位置。
例如:G3 G2 G1 = 101,其十进制为 5 ,即:H5 发生了错误,H5的位置为D1,则说明D1传输错误,则将D1的位置的二进制数取反,即可纠错。
特点:具有纠正一位错误的能力。

循环冗余码

码多项式:(n,k)循环码中(n是数据位+监督位之后的位数,k是数据位位数),为了便于描述与计算,经常使用 n-1 次 码多项式来表示码字,码字 A =[an-1 an-2 … a1 a0 ],它对应的码多项式为:
计网学习笔记(一):差错控制(奇偶校验、海明校验、循环冗余校验)(超详细!!)_第2张图片
CRC 算法的基本思想是将传输的数据当做一个位数很长的数,将这个数除以生成多项式,得到的余数作为校验数据附加到原数据后面。
以一个题目为例:设待校验的数据为:D8~D1 = 10101011,若采用CRC,且生成多项式为 10011。这里要注意题目中的一个表述——“多项式”,该题目中写作“10011”,在有的题目中往往写作“x^4+x+1”。
首先,在数据位后加生成多项式最高幂次个0,比如这里的多项式最高次项为x^4,那就在数据位后加四个0,变成:101010110000,作为被除数
然后,将多项式 10011 作为除数进行模2除法,对应位做异或运算,即相同位结果为0,不同位结果为1,然后将得到的余数作为校验位加到数据位之后则为整个CRC码:10101011 1010。
接收端:用CRC码与多项式 10011 仍然进行模2除法,若余数为0,则说明传输正确,若余数不为0,则说明数据传输中发生了错误。
特点:这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。一旦检测出差错,就丢弃这个差错的帧。
仅用CRC 差错检测技术只能做到无差错接受(accept)。“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近1的概率认为这些帧在传输过程中没有产生差错”。 要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。

CRC与FCS

FCS:在数据后面添加上的冗余码称为帧检验序列。
CRC与FCS的区别:
1.CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
2.FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。

你可能感兴趣的:(计算机网络)