数据链路层在物理层提供服务的基础上向网络层提供服务, 其最基本的服务是将源自网络层来的数据可靠地传输到相邻结点的目标机网络层, 其主要作用是加强物理层传输原始比特流的功能, 将物理层提供的可能出错的物理链接改造成为逻辑上无差错的数据链路, 使之对网络层表现出一条无差错的链路, 具体如下:
封装成帧就是在一段数据(数据报)的前后部分添加首部和尾部, 这样就构成了一个帧. 接收端在收到物理层上交的比特流后, 就能根据首部和尾部的标记, 从收到的比特流中识别帧的开始和结束.
首部和尾部包含许多的控制信息, 他们的一个重要作用: 帧定界(确定帧的界限).
接收方应当能从接收到的二进制比特流中区分出帧的起始和终止.
在了解组帧方法之前, 需要先了解透明传输.
透明传输是指不管所传数据是什么样的比特组合, 都应当能够在链路上传送. 因此, 链路层就"看不见"有什么妨碍数据传输的东西.
当所传数据中的比特组合恰巧与某一个控制信息完全一样时, 就必须采取适当的措施, 使接收方不会将这样的数据误认为是某种控制信息. 这样才能保证数据链路层的传输是透明的.
帧首部使用一个计数字段(第一个字节, 八位)来标明帧内字符数.
缺点:
如果一个计数字段发生错误, 那么后面的字段就会全错.
控制字符:
当传送的帧是由文本文件组成时(文本文件的字符都是从键盘上输入的, 都是ASCII码), 不管从键盘上输入什么字符都可以放在帧里传过去, 即透明传输.
当传送的帧是由非ASCII码的文本文件组成时(二进制代码的程序或图像等), 就要采用字符填充方法实现透明传输.
具体实现过程:
假如原始数据的数据部分出现了很多控制字符(SOH, EOT), 就会在数据部分的控制字符前面加上转意字符, 然后就可以放到数据链路上传送.
允许数据帧中包含任意个数的比特, 同样是在帧的头尾添加首部标识符, 尾部标识符, 同字节填充法的区别是首尾标识符是相同的.
当帧的数据部分出现了与收尾标识符相同的比特组合时, 方法归纳起来可以用5"1"1"0"来总结.
具体操作为(假设首尾标识符的字节为01111110):
优点:
保证了透明传输: 在传送的比特流中可以任意传输任意比特组合, 而不是引起对帧边界的判断错误.
举例:
回顾曼彻斯特编码法, 当数据链路层把一个帧的比特流传给物理层时, 物理层会对0/1进行如下编码:
"高-低"代表1, "低-高"代表0.
所以可以用"高-高", "低-低"来界定帧的起始和终止, 这就是违规编码法.
由于字符计数法中Count字段的脆弱性(其值若有差错将导致灾难性后果)及字符填充实现上的复杂性和不兼容性, 目前较普遍使用的帧同步法是零比特填充和违规编码法.
数据链路层传输的差错都是由于噪声引起的.
由于线路本身电气特性所产生的随机噪声(热噪声), 是信道固有的, 随机存在的.
解决办法:
提高信噪比来减少或避免干扰(对传感器下手).
外界特定的短暂原因所造成的冲击噪声, 是产生差错的主要原因.
解决办法:
通常利用编码技术来解决.
下面举例来具体说明, 假设传送的三个帧为f1, f2, f3, 那么帧错就会存在以下三种情况:
- 丢失: 收到了f1, f3, 丢掉了f2
- 重复: 收到了f1, f2, f2, f3, f2重复收到了
- 失序: 收到了f1, f3, f2, 其中f2, f3收到的顺序错了
回顾链路层为网络层提供服务: 无确认无连接服务, 有确认无连接服务, 有确认面向连接服务, 对于通信质量好, 有线传输链路, 就会采用无确认无连接服务. 对于通信质量差的无线传输链路, 数据链路层就会采取有确认的服务(包括有确认无连接服务以及有确认面向连接服务).
可分为:
- 奇偶校验码
- 循环冗余码CRC
只能检错
海明码
不仅能够检错, 还能发现错误的码是哪一位
数据链路层编码与物理层的数据编码与调制不同. 物理层编码针对的是单个比特, 解决传输过程中比特的同步问题, 如曼彻斯特编码. 而数据链路层的编码针对的是一组比特, 它通过冗余码的技术实现一组二进制比特串在传输过程是否出现了差错.
在数据发送之前, 先按某种关系附加上一定的冗余位, 构成一个符合某一规则的码字后再发送. 当要发送的有效数据变化时, 相应的冗余位也随之变化, 使码字遵从不变的规则. 接收端根据收到的码字是否仍符合原规则, 从而判断是否出错.
有了以上概念之后, 接下来再具体看一下上面的两种针对位错的差错控制方法:
1. 奇偶校验码
构造: n-1位信息元和一位校验元
分类:
奇校验码: 整个n位1的个数为奇数
偶校验码: 整个n位1的个数为偶数
特点:
只能检查出奇数个比特错误, 检错能力为50%.
2. 循环冗余码CRC
最常用: 海明码
较高的发送速度和较低的接收能力的不匹配, 会造成传输出错, 因此流量控制也是数据链路层的一项重要工作. 这里的传输出错指的就是, 如果发送方的传输速率过高而接收方接收的能力较差, 这样发送方发来的数据就有可能超出接收方的缓冲空间导致溢出, 从而导致发送方发来的数据接收方无法接收, 所以说流量控制是必须的.
流量控制在数据链路层中有, 在传输层中也有, 二者的区别是:
- 后退n帧协议(GBN)
- 选择重传协议(SR)