差错检测和循环冗余检验crc

差错检测

传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。

在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER(Bit Error Rate)。

误码率与信噪比有很大的关系。

为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。


循环冗余检验 CRC

在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。
在发送端,先把数据划分为组。假定每组 k 个比特。 
假设待传送的一组数据 M = 101001(现在 k = 6)。我们在 M 的后面再添加供差错检测用的 n 位冗余码一起发送。
冗余码的计算
用二进制的模 2 运算进行 2n 乘 M 的运算,这相当于在 M 后面添加 n 个 0。
得到的 (k + n) 位的数除以事先选定好的长度为 (n + 1) 位的除数 P,得出商是 Q 而余数是 R,余数 R 比除数 P 少1 位,即 R 是 n 位。


差错检测和循环冗余检验crc_第1张图片


冗余码的计算举例
现在 k = 6, M = 101001。
设 n = 3, 除数 P = 1101,
被除数是 2nM = 101001000。 
模 2 运算的结果是:商 Q = 110101,
           余数 R = 001。
把余数 R 作为冗余码添加在数据 M 的后面发送出去。发送的数据是:2nM + R 
   即:101001001,共 (k + n) 位。


注:可以用生成多项式来表示循环冗余的除数,例P(X)=X3+X2+1可以表示1101这个除数。
练:101101的生成多项式P(X)=?


帧检验序列 FCS
在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。
循环冗余检验 CRC 和帧检验序列 FCS并不等同。
CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。



接收端对收到的每一帧进行 CRC 检验
检验:
若得出的余数 R = 0,则判定这个帧没有差错,就接受(accept)。
若余数 R  0,则判定这个帧有差错,就丢弃。


特点:
但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。
只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。


仅用循环冗余检验CRC 差错检测技术只能做到无差错接受(accept)。

“无差错接受”是指:“凡是接受的帧(即 不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。

要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认重传机制。

考虑:帧重复、帧丢失、帧乱序的情况

可以说“CRC是一种无比特差错,而不是无传输差错的检测机制”

OSI/RM 模型的观点:数据链路层要做成无传输差错的!但这种理念目前不被接受!





循环冗余检验CRC

你可能感兴趣的:(tcp/ip)