数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输和差错检测
1、封装成帧
封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。在帧的数据部分的前面和后面分别添加上首部和尾部,构成了一个完整的帧。这就是数据链路层的数据传送单元——
帧。
一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定顿的界限)。此外,首部和尾部还包括许多必要的控制信息。
为了提高顿的传输效率,应当使顿的数据部分长度尽可能地大于首部和尾部的长度。但是,每一种链路层协议都规定了所能传送的顿的数据部分长度上限——最大传送单元MTU。
控制字符SOH放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT表示顿的结束。请注意,SOH
和EOT都是控制字符的名称。它们的十六进制编码分别是01(二进制是00000001)和04(二进制是00000100)。
2、透明传输
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。
当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
当数据部分是非ASCII码的文本文件时(如二进制代码的计算机程序或图像等),如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样数据链路层就会错误地“找到帧的边界”。
当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像SOH或EOT这样的顿定界控制字符。
为了解决透明传输问题,具体的方法是:
发送端的数据链路层在数据中出现控制字符"SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为
字节填充或字符填充
。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。
3、差错检测
比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫做比特差错。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER,
误码率与信噪比有很大的关系
。如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
目前在数据链路层广泛使用了循环冗余检验 CRC的检错技术。
循环冗余检验原理:
在发送端,先把数据划分为组,假定每组k个比特。现假定待传送的数据M= 101001(k = 6)。CRC运算就是在数据M的后面添加供差错检测用的n位冗余码
,然后构成一个帧发送出去,一共发送(k+n)位。
这n位冗余码可用以下方法得出:
用二进制的模2运算进行乘M的运算,这相当于在M后面添加n个0。得到的(k+ n)位的数除以收发双方事先商定的长度为(n +
1)位的除数P,得出商是Q而余数是R(n位,比P少一位)。这个余数R就作为冗余码拼接在数据M的后面发送出去
。这种为了进行检错而添加的冗余码常称为帧检验序列FCS。
在接收端把接收到的数据以帧为单位进行CRC检验:把收到的每一个帧都除以同样的除数P(模2运算),然后检查得到的余数R,如果在传输过程中无差错,那么经过CRC检验后得出的余数R肯定是0;否则,有差错就丢弃。
在上面的例子中,用多项式P(X)= X+X+1表示上面的除数P= 1101(最高位对应于x,最低位对应于x)。多项式P(X)称为生成多项式。
注意:数据链路层若仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差错接受,并不能向网络层提供“可靠传输”的服务。