差错检测
实际的通信链路都不是理想的,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这称为比特差错。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
FCS用于让接收方的数据链路层检查是否产生误码。
奇偶校验
-
在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中**“1”的个数**为奇数(奇校验)或偶数(偶校验)。
-
如果有奇数个位发生误码,则奇偶性发生变化,可以检查出误码;
-
如果有偶数个位发生误码,则奇偶性不发生变化,不能检查出误码(漏检)。
漏检率高,计算机网络的数据链路层一般不用奇偶校验。
循环冗余校验CRC(Cyclic Redundancy Check)
-
收发双方约定好一个生成多项式G(x);
-
发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输;
-
接收方通过生成多项式来计算收到的数据是否产生了误码。
例题:待发送的信息为101001,生成多项式为G(x)= x^3+ x^2+ 1,计算余数。
解析:1.构造被除数 待发送信息后面添加生成多项式最高次数个0
2.构造除数 生成多项式各项系数构成的比特串
3.做“除法”
4.检查余数 余数的位数应与生成多项式最高次数相同,如果位数不够,则在余数前补0来凑足位数。
例题:接收到的信息为101101001,生成多项式为G(x)= x^3 +x^2+l,判断传输是否误码?
解析:1.构造被除数 接收到的信息就是被除数
2.构造除数 生成多项式各项系数构成的比特串
3.做“除法”
4.检查余数 余数为0,可认为传输过程无误码;余数不为0,可认为传输过程产生误码。
检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。
要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用。
循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。
在计算机网络中通常采用我们后续中将要讨论的检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。