数据链路层
在此层要解决的问题:封装成帧、透明传输、差错控制(检错、纠错)
- 点对点信道
- 这种信道使用一对一的点对点通信方式( PPP 协议 )
- 广播信道。
- 这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。 CSMA/CD 协议

为了分析链路层协议,采用简化的链路层模型
- 数据链路层以上的各层用一个主机代替;
- 物理层和通信线路等效成一条简单数据链路;

使用点对点信道的数据链路层
数据链路和帧
链路 (link) 是一条无源的结点到相邻结点的物理线路(有线或无线),中间没有任何其他的交换结点。
- 一条链路只是一条通路的一个组成部分。
数据链路 (data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
-
现在最常用的方法是使用 网络适配器(即网卡) 来实现这些协议的硬件和软 件。
-
一般的适配器都包括了数据链路层和物理层这两层的功能。
数据链路层的基本概念
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。
物理链路 就是上面所说的链路 。
逻辑链路 就是上面的数据链路,是物理链路加上必要的通信协议。
早期的数据通信协议曾叫做通信规程 (procedure) 。因此在数据链路层,规程和协议是同义语。
数据链路层的协议数据单元 - 帧

常常在两个对等的数据链路层之间画出一个数字管道,而在这条数字管道上传输的数据单位是帧

数据链路层不必考虑物理层如何实现比特传输的细节。 甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方
三个基本问题
封装成帧
(framing)
定义
在一段数据的前后分别添加首部和尾部然后就构成了一个帧。使接收方能确定帧的界限。换句话说,首部和尾部的一个重要作用就是进行帧定界

字节计数法
-
思想
在帧头设置一个长度域,放置该帧的字节数,当收方收到帧后,通过帧的长度,确定帧的开始。
-
问题
当帧的长度域出错,帧同步完全丢失;
该方法很少单独使用。

字符填充法
当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的 ASCII 码 不可打印 的控制字符 作为 帧定界符。
控制字符 SOH (Start Of Header) 放在一帧的最前面表示帧的首部开始 。 另一个控制字符 EOT (End Of Transmission) 表示帧的结束 。

比特填充法
-
思想
使用一个特殊的比特模式 01111110 作为帧的起始和结束标志。
发送方边发送边检查数据,每连续发送 5 个“ 1” 后在后面自动插入一个“ 0” 。这样数据中只会连续出现 5 个“ 1”,而不会出现定界符。
接收方在收到 5 个连续的 “1” 后将后面的 “0” 删掉而恢复出原始数据。
-
好处
数据传输的基本单位是比特而不是字符,可用来传输任意长度的二进制比特串,通用性强。

违法编码法
-
前提
物理介质上使用的信号编码有冗余码字时,使用这些冗余的码字来作为帧的定界。
-
举例
如曼彻斯特编码或差分曼彻斯特编码中,有效电平是 “低-高” 或 “高-低”,而 “低-低” 和 “高-高” 电平没有定义,这种违法编码 可以作为帧的边界。
透明传输
若所传的数据的比特片段与某一个控制信息相同,要有可靠机制,保证收方能正确识别
如果数据中的某个字节的二进制代码恰好和 SOH 或 EOT 一样,数据链路层就会错误地“找到帧的边界”

- 解决方法
- 发送端的数据链路层在数据中出现控制字符 “SOH” 或 “EOT” 的前面 插入一个转义字符 “ESC” (其十六进制编码是 1B) 。
- 接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
- 如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC 。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
- 对应字节填充法

差错控制
纠错:通过编码技术,接收方自动将差错改正过来
检错:检测出帧有错误,要么忽略或重传
-
在传输过程中可能会产生比特差错: 1 可能会变成 0 而 0 也可能变成 1 。
-
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)
- 例如误码率 10^-10^ ,表示 10^10^ 个比特就会出现 1 个比特的差错
-
误码率与信噪比有很大的关系。
-
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错控制措施。
- 考虑怎样发现和纠正信号传输中的差错。
-
方法
- 如何发现差错?
- 检错码(奇偶校验码、 CRC):能检测出错误,但不能纠正错误
- 纠错码(海明码):能知道错误,且知道错误的位置
- 发现差错如何处理?
- 前向纠错:由接收方来检查并纠正错误
- 自动重发请求:不能纠正,接收方反馈。若有错误则重发,否则给肯定应答
- 如何发现差错?
前向纠错
(FEC Forward Error Correct)
即发送方发送能使接收方检错并纠错的冗余位,纠错任务由接收方完成;常采用海明码
主要应用于没有反向信道或反向传输时间很长的场合
-
缺点:为纠错附加的冗余码较多,传输效率低;
-
优点:实时性好。
自动重发请求
(ARQ Automatic Repeat reQuest)
即发送方发送能使接收方检错的冗余位,若无差错,则接收方回送一个肯定应答 (ACK);若有差错,则接收方回送一个否定应答 (NAK),要求发送方重发。
- 缺点:信息传递连贯性差
- 优点:接收端设备简单,只要请求重发,无需纠正错误。
检错码
- 构造
- 检错码 (码字、传输帧) = 信息位+冗余校验位
- 码字长 n = K (信息位位数) + r (校验位位数)
- 编码效率 R = 有效数据位 K / 码字长 n
- 信息字段和校验字段之间的对应关系
- 校验字段越长,编码的检错能力越强,编码解码越复杂;附加的冗余信息在整个编码中所占的比例越大,传输的有效成分越低,传输的效率下降。
- 检错码一旦形成,整个检错码将作为一个整体被发往线路,通常的发送顺序是信息字段在前,校验字段在后。
奇偶校验码
根据数据字节中 1 的个数来检验数据传输中是否发生了错误。
-
奇校验:使码字中 1 的总个数为奇数 。
-
偶校验:使码字中 1 的总个数为偶数 。
-
奇 / 偶校验码:最常用的一种检验码,包括:
- 水平奇 / 偶校验码
- 垂直奇 / 偶校验码
- 水平垂直奇 / 偶校验码
水平奇 / 偶校验码
其信息字段以字符为单位,校验 字段仅含一个比特称为校验比特或校验位。
例如:使用七比特的 ASCII 码来构造成八比特的检错码时若采用奇 / 偶校验,校验位的取值应使整个码字包括校验位, 1 的比特个数为奇数或偶数。 信息字段 奇校验码 偶校验码 1000001 10000011 10000010
- 编码效率: Q / (Q+1) ( 信息字段占 Q 个比特 )
- 应用: 通常在异步传输方式中采用偶校验, 同步传输方式中采取奇校验。
垂直奇 / 偶校验码
被传输的信息进行分组,并排列为若干行和若干列。组中每行的相同列进行奇 / 偶校验,最终产生由校验位形成的校验字符 (校验行),并附加在信息分组之后传输
举例: 4 个字符( 4 行)组成一信息组
- 编码效率: PQ / P(Q+1) (假设信息分组占 Q 行 P 列)
水平垂直奇 / 偶校验
也叫方阵校验
在水平校验的基础上实施垂直校验。
例: 4 行 7 列信息组的水平垂直偶校验码为:

循环冗余码
(Cyclic Redundancy Check CRC) 计算机和数据通信中使用最广泛的检错码 ,漏检率低,可用简单的电路实现。
-
操作
给定一个 k 比特的帧或报文,发送方生成 n 比特的序列(也称为帧检验序列 FCS Frame Check Sequence ),形成 ( k+n ) 的码字,该码字能被某个事先确定的数整除。接收方用相同的数去除收到的帧,如果无余数,则认为数据帧无差错
-
步骤
- 在发送端,先把数据划分为组
- 假定每组 k 个比特
- 假设待传送的一组数据 M = 101001 (现在 k = 6 )。我们在 M 的后面再添加供差错检测用的 n 位 冗余码 一起发送。
计算方法
- 用二进制的 模 2 运算 进行 2^n^ 乘 M 的运算,这相当于在 M 后面添加 n 个 0
- 得到的 ( k + n ) bit 的数除以事先选定好的长度为 ( n + 1) bit 的除数 P,得出商是 Q 而余数是 R,余数 R 比除数 P 少 1 位,即 R 是 n 位 。
- 将余数 R 作为冗余码 (帧检验序列) 拼接在数据 M 后面发送出去 。

说明:帧检验序列
在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence) 。 循环冗余检验 CRC 和帧检验序列 FCS 并不等同。
- CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
- FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。
接收端对收到的每一帧进行 CRC 检验
把收到的每一个帧都除以相同的除数 P 模 2 运算 然后 检查得到的余数 R
- 若得出的余数 R = 0 则判定这个帧没有差错就接受 (accept)
- 若余数 R 不等于 0 则判定这个帧有差错就丢弃
但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错 。
漏检 CRC 不能保证检测出所有的传输错误,但是只要选择位数足够的 P 可以使得差错的概率足够小
只要经过严格的挑选,并使用位数足够多的除数 P 那么出现检测不到的差错的概率就很小很小
