实际的通信链路都不是理想的,比特在传输过程中可能会产生差错:1可能变成0,0可能变成1
这称为比特差错,或称误码
传输错误的比特占所传输比特总数的比率称为误码率BER
那么接收方主机如何判断,帧在传输过程中是否出现了误码呢?
- 使用差错检测码(检错码)来检测数据在传输过程中,是否产生了比特差错
例如,这是以太网版本2的MAC帧格式
- 其帧尾中包含了一个长度为4字节的帧检验序列FCS字段
- 其作用就是让接收方的数据链路层检查帧在传输过程中是否产生了误码
例如,这是点对点协议PPP的帧格式
- 其帧尾中也包含了一个2字节的FCS字段
奇偶校验
在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中“1”的个数为奇数(奇校验)或偶数(偶校验)
- 偶数:在数据的后面添加0或1,使得整个比特流1的个数为偶数
- 奇数:在数据的后面添加0或1,使得整个比特流0的个数为奇数
例如。假设双方约定采用奇校验,对于”101101”,需要在最后面添加”1”,1的个数才为奇数
- 假设,传输过程中产生了一位误码(用红色表示)
- 接收放对收到的比特流做奇校验,发现比特1的总数为偶数,而不是奇数。
- 就知道传输过程中发生了误码。换句话说,采用奇校验,若比特1的数量的奇性改变,可以检查出错误
- 假设,传输过程中产生了二位误码
- 接收方对收到的比特流进行奇校验,发现比特1的总数为奇数,就误认为传输过程中没有发生误码
- 即,采用奇校验,若比特1的数量的奇性不改变,是无法检查出错误的。同理,如果采用偶校验,若比特流1数量的偶性不改变,是无法检查出错误的
如果奇数个位发生误码,则奇偶性发生变化,则检查出误码;如果有偶数个位发生误码,则奇偶性不发生变化,不能检查出误码。那就会导致漏检
- 奇偶校验漏检率比较高,因此计算机网络的数据链路层一般不会采用这种检测方法
循环冗余校验CRC
循环冗余校验CRC(Cyclic Redundancy Check),这是一种具有很强检错能力的检错方法,漏检率极低
- 收发双方约定好一个生成多项式G(x)
- 发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输
- 接收方通过生成多项式来计算收到的数据是否产生了误码
CRC评价
- 有很好的检错能力(漏检率非常低)
- 虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层
例如,使用“除法”来计算冗余码
- 发送方
- 待发送的数据作为被除数的一部分,后面添加生成多项式最高次个0以构成被除数
- 生成多项式各项系统构成的比特串作为除数
- 进行除法,得到商和余数。余数就是所计算出的冗余码
- 将其余数添加到待发送数据的后面一起发送
- 注意:冗余码的长度与生成多项式最高次数相同;而商仅作为标记,防止计算过程中对错位
- 接收方
- 被除数就是接收到的数据
- 除数仍是生成多项式各项系数构成的比特串
- 进行除法,得到商和余数
- 如果余数为0,则判断传输过程中没有产生误码;如果余数不为0,则判断产生了误码
生成多项式例子
例一:
- 第一步:生成多项式最高次数为3,那就在“101001”(待发送信息)后面填3个0
- 生成多项式,的各项的系数,构成的比特串就是除数,即“1101”
- 做除法(是一种特殊的运算,不是小学的除法)
- 和普通除法一样,但上下不是减,而是做异或运算
- 若当前被除数不够除(被除数位数 < 除数),那商就是0。若当前被除数够除(被除数位数 >= 除数位数),那商就是1
- 检查余数。余数算出来是1;但多项式最高次数是3;所以要补齐三位,即001。故余数是“001”
例二:
总结
检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。
- 要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用
在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢掉检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务,还是不可靠传输服务