链路 (link) 是一条无源的点到点的物理线路段,中间没有任何其他的交换结点。 一条链路只是一条通路的一个组成部分。
数据链路 (data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
- 现在最常用的方法是使用适配器(即网卡)来实现这些协议的硬件和软件。(网卡工作在数据链路层)
- 一般的适配器都包括了数据链路层和物理层这两层的功能。(路由器的接口也是工作在数据链路层)
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。
物理链路就是上面所说的链路。
逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。
早期的数据通信协议曾叫做通信规程 (procedure)。因此在数据链路层,规程和协议是同义语。
在数据链路层,探讨的是如何将一段数据传递给另外一个节点的接口。在传递的时候变成电信号,光信号,还是无线信号,我们并不关心这个,因为这是物理层需要做的事情。
数据链路层像个数字管道
常常在两个对等的数据链路层之间画出一个数字管道,而在这条数字管道上传输的数据单位是帧。
数据链路层不必考虑物理层如何实现比特传输的细节。甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方。
三个基本问题
数据链路层协议有许多种,不管是哪种数据链路协议,但有三个基本问题则是共同的。这三个基本问题是:
- 封装成帧
- 透明传输
- 差错控制
1.封装成帧
分组
:当一台端系统向另外一台端系统发送数据时,通常会将数据进行分片,然后为每段加上首部字节,从而形成计算机网络的专业术语:分组。这些分组通过网络发送到端系统,然后再进行数据处理。
- 封装成帧 (framing) 就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。(网络层给你了数据包,网卡就要将其封装一下,加上头和尾部,从网络层给到数据链路层的ip数据报大小是有限制的,叫做最大传输单元,以太网是1500个字节,如果超过了这个大小,那么网络层的IP数据包就要分片)(封装成帧的意思就是给网络层的数据包加上头和尾,有头有尾代表一个完整的数据)
- 首部和尾部的一个重要作用就是进行帧定界。
举例:用控制字符进行帧定界的方法举例
当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符。
控制字符 SOH (Start Of Header) 放在一帧的最前面,表示帧的首部开始。另一个控制字符 EOT (End Of Transmission) 表示帧的结束。
ASCII表里面有非打印的字符,这些字符不是键盘输入的,都是一些控制字符。
2. 透明传输
如果数据中的某个字节的二进制代码恰好和 SOH 或 EOT 一样,数据链路层就会错误地“找到帧的边界”。当作无效帧丢弃就产生错误了。
解决透明传输问题
解决方法:字节填充 (byte stuffing) 或字符填充 (character stuffing)。
发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B)。
接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
封装成帧加上头和尾,传输的时候加上转义字符,接收的时候去掉转义字符,加头和尾的过程叫做封装成帧,插入转义字符和去掉转义字符的过程叫透明传输。
不同链路协议解决的透明传输的方法不一样,这个转义字符到底是啥,完全由数据链路层搞定,但是,所有的数据链路层都要解决这个问题。
透明
指某一个实际存在的事物看起来却好像不存在一样。
“在数据链路层透明传送数据”表示无论发送什么样的比特组合的数据,这些数据都能够按照原样没有差错地通过这个数据链路层。
透明传输是指不管所传的数据是什么样的比特组合,都能在链路上传输,当所传输的数据中的比特组成恰巧与链路层的某个控制信息完全一致时,就必须采取适当的措施,这样才不会使控制数据与需要传输的数据混淆,这样才能确保数据链路层的透明传输。
3. 差错检测
链路层数据以帧的形式发送,在发送的过程中,接收方节点的链路层硬件可能会由于信号干扰或者电磁噪音等原因错误的把 1 识别为 0 ,0 识别为 1。这种情况下没有必要转发一个有差错的数据报,所以许多链路层协议提供一种机制来检测这样的比特差错。通过让方节点在帧中包括差错检测比特,让接收节点进行差错检查,以此来完成这项工作。
运输层和网络层通过因特网校验和来实现差错检测,链路层的差错检测通常更复杂,并且用硬件实现。差错纠正类似于差错检测,区别在于接收方不仅能检测帧中出现的比特差错,而且能够准确的确定帧中出现差错的位置。
差错检测和纠正的技术主要有
-
奇偶校验:它主要用来差错检测和纠正
-
校验和:这是一种用于运输层检验的方法
-
循环冗余校验:它更多应用于适配器中的链路层
- 在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)。
- 误码率与信噪比有很大的关系。
- 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
- 在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。
帧的数据部分+数据链路层首部来计算帧校验序列,计算完之后将帧校验序列写到FCS一块发出去。接收端收到之后使用帧校验序列来验证里面有没有差错。如果有差错就丢掉了。
在数据链路层是不可靠传输,如果有差错就直接丢弃,不会重传。
数据链路层有没有重传功能,完全看数据链路层协议有没有这个功能。ppp hdlc以太网协议都不具有可靠传输,有错误就直接丢弃,由传输层来实现。
需要注意的是校验的部分是帧的数据部分和数据链路层首部,检擦这些部分在传输过程当作有没有差错。用于校验的部分写到帧的FCS位置。
循环冗余检验的原理
- 在发送端,先把数据划分为组。假定每组 k 个比特。
- 在每组 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,
- 被除数是 2nM = 101001000。
- 模 2 运算的结果是:商 Q = 110101,余数 R = 001。
- 把余数 R 作为冗余码添加在数据 M 的后面发送出去。发送的数据是:2nM + R,即:101001001,共 (k + n) 位。
循环冗余检验的原理说明
假设101001是我们要传输的数据,冗余码需要生成3位二进制,这个时候就需要在原始数据后面加上3个0,然后选一个除数,除数要比冗余码多一位,冗余码是3位,除数就得是4位。
这个除数其实是每种协议提前定义好的,发送端和接受端都知道这个除数。
冗余码的计算
接收端对收到的每一帧进行 CRC 检验
(1) 若得出的余数 R = 0,则判定这个帧没有差错,就接受 (accept)。
(2) 若余数 R ≠ 0,则判定这个帧有差错,就丢弃。
- 但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。
- 只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。
帧检验序列 FCS
算出来的CRC叫做帧校验序列,CRC是一个算法,当然也可以通过其他算法得出帧校验序列,FCS的计算方法除了CRC还有其他算法算出帧校验序列。
在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。
循环冗余检验 CRC 和帧检验序列 FCS 并不等同。
- CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
- FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。
应当注意
- 仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受 (accept)。
- “无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。
- 也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。
- 单纯使用 CRC 差错检测技术不能实现“无差错传输”或“可靠传输”。
- 应当明确,“无比特差错”与“无传输差错”是不同的概念。
- 在数据链路层使用 CRC 检验,能够实现无比特差错的传输,但这还不是可靠传输。
- 要做到“无差错传输”(即发送什么就收到什么)就必须再加上确认和重传机制。
- 本章介绍的数据链路层协议都不是可靠传输的协议。
补充
1 数据链路层概述
数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。数据链路层在不可靠的物理介质上提供可靠的传输。
该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
有关数据链路层的重要知识点:
-
数据链路层为网络层提供可靠的数据传输;
-
基本数据单位为帧;
-
主要的协议:以太网协议;
-
两个重要设备名称:网桥和交换机。
封装成帧:“帧”是数据链路层数据的基本单位:
透明传输:“透明”是指即使控制字符在帧数据中,但是要当做不存在去处理。即在控制字符前加上转义字符ESC。
2 数据链路层的差错监测
差错检测:奇偶校验码、循环冗余校验码CRC
-
奇偶校验码–局限性:当出错两位时,检测不到错误。
-
循环冗余检验码:根据传输或保存的数据而产生固定位数校验码。