计算机网络(3.4)数据链路层- 透明传输和差错检测
一、透明传输
如果数据中的某个字节的二进制代码恰好和SOH或EOT一样,数据链路层就会错误地“找到帧的边界”。
解决方法:字节填充 (byte stuffing) 或字符填充 (character stuffing)。
发送端的数据链路层在数据中出现控制字符“SOH” 或“EOT”的前面插入一个转义字符“ESC” (其十六 进制编码是 1BH)。接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
二、差错检测
在传输过程中可能会产生比特差错:1可能会变成0而0也可能变成1。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。误码率与信噪比有很大的关系。为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
差错控制是数据链路层的主要功能之一,但不是数据链路层所特有的功能。在网络层和传输层也都有差错控制能力,只是差错控制的对象不同。 数据链路层的差错控制是保证相邻结点之间的传输差错控制在所允许的最小范围内。
循环冗余检验的原理
在数据链路层传送的帧中,广泛使用了循环冗余检验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位。将余数R 作为冗余码拼接在数据 M 后面发送出去。
计算举例
现在 k = 6, M = 101001。设n = 3, 除数 P = 1101,被除数是 2^nM= 101001000。模2运算的结果是:商 Q = 110101, 余数R= 001。 把余数R作为冗余码添加在数据M的后面发送出去。发送的数据是:2^nM + R 即:101001001,共(k + n) 位。
帧检验序列FCS
在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。循环冗余检验CRC 和帧检验序列 FCS 并不等同。CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。
接收端对收到的每一帧进行 CRC 检验
(1) 若得出的余数 R = 0,则判定这个帧没有差错, 就接受(accept)。
(2)若余数 R!=0,则判定这个帧有差错,就丢弃。
但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。只要经过严格的挑选,并使用位数足够多的除数 P, 那么出现检测不到的差错的概率就很小很小。
循环冗余码
在数据链路层传送的帧中,广泛使用了CRC 检错技术。
循环冗余校验码CRC(Cyclic Redundancy Check),能够检测出数据帧中的1位或n位错误,然后丢弃重传, 具有良好的检错能力。CRC方法也称为多项式编码(表示除数),标准格式为:
仅用循环冗余检验CRC差错检测技术只能做到无差错接受(accept)。
“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。
要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。
应当明确,“无比特差错”与“无传输差错”是不同的概念。 • 在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。