本章围绕数据链路层在点对点信道和广播信道上的工作展开:先把网络层交下来的数据封装成帧,再检测传输差错;需要可靠服务时,使用确认、编号和重传机制;进入局域网后,还要解决共享信道接入、MAC 编址、帧交换、环路和广播域划分等问题。

3.1 数据链路层概述
链路是从一个节点到相邻节点的一段物理线路,例如网线、光纤或无线电波传播的通道。仅有物理线路只能传送比特,还不足以完成有规则的数据通信。
在链路的基础上,加上必要的硬件和实现协议的软件,就构成了数据链路 。主机、路由器和局域网交换机都需要实现数据链路层。数据链路层的协议数据单元是帧。
本章首先以点对点信道为背景,讨论三个基本问题:
- 封装成帧:如何让接收方从连续比特流中识别出一帧的开始和结束。
- 差错检测:传输中发生比特差错时,如何发现错误帧。
- 可靠传输:错误帧被丢弃后,如何保证正确副本最终能到达接收方。
若使用广播信道,多个节点共用同一介质,除了上述问题,还要解决编址和媒体接入控制问题:帧应交给哪个节点,以及多台设备同时想发送时如何避免或处理冲突。
3.2 封装成帧
3.2.1 帧定界
封装成帧就是在上层交付的数据前后增加首部和尾部,形成帧。首部和尾部包含控制信息,其中一个重要作用是帧定界:接收方据此从物理层送来的连续比特流中提取一个个完整的帧。
并非所有链路层协议都使用相同的帧定界方式。以太网 MAC 帧通过前导码实现接收端时钟同步,并用帧开始定界符标记 MAC 帧的开始;以太网还规定帧间间隔,因此不依靠专门的帧结束定界符来切分连续比特流。
3.2.2 透明传输
帧定界符是一个特定的数据值。如果上层交付的数据中恰好出现相同的值,接收方就可能把普通数据误认为帧边界,造成帧错误拆分。透明传输要解决的就是这个矛盾:上层交付的数据可以包含任意比特或字节组合,而不会干扰链路层对帧边界的识别。
面向字节的物理链路可以使用字节填充。发送端在数据中遇到控制字符时,在其前面插入转义字符 ESC;接收端在把数据交给网络层前删除这个 ESC。若 ESC 本身出现在数据中,同样要在前面再插入一个 ESC。
面向比特的物理链路使用比特填充 。发送方在数据中每检测到连续 5 个 1,就在其后插入一个 0;接收方检测到连续 5 个 1 后,删除紧随其后的填充 0。这样数据字段中的比特模式不会与帧定界模式混淆。
3.2.3 帧的数据部分长度
帧的数据部分越长,首部和尾部的开销占比越小,传输效率通常越高;但帧过长会增加缓存需求,也会使一旦出错后需要重传的数据量变大。因此数据链路层会规定长度上限,即最大传送单元 MTU。MTU 限定的是一帧能够承载的数据部分长度,具体取值由链路层协议决定。
3.3 差错检测
传输过程中可能发生比特差错 :原来的 1 变成 0,或者 0 变成 1。误码率用于描述这种错误出现的概率,但接收方仍需要针对每一帧判断其是否正确。
3.3.1 奇偶校验
奇偶校验是在数据后附加一个校验位,使数据中 1 的总数保持为偶数或奇数。接收方按同一规则统计,就能发现奇数个比特发生翻转的情况。
它的实现简单,但检错能力有限:若发生偶数个比特错误,校验结果可能仍然正确。因此奇偶校验适合用来理解基本思想,实际链路通常需要检错能力更强的方法。
3.3.2 循环冗余校验 CRC
循环冗余校验 CRC 是链路层常用的差错检测方法。发送方根据约定的生成多项式计算帧校验序列,并把它附加在帧尾;接收方使用相同规则进行检验。检验结果不正确时,说明收到的帧在传输中发生了差错,应当丢弃该帧。
CRC 的作用是检错。它能够告诉接收方"这一帧不可信",但不能单靠自己找回丢失或出错的正确数据。后续是否重传,取决于数据链路层是否向上层提供可靠传输服务。
3.4 可靠传输
3.4.1 基本概念
接收方发现帧有误码后会丢弃该帧。若链路层提供不可靠服务,丢弃后不再采取措施;若提供可靠服务,就需要让发送方重发正确副本。
可靠传输需要处理的不只是数据帧出错,还包括数据帧丢失、确认帧丢失、确认帧迟到、重复帧和失序帧。确认 ACK、否认 NAK、超时重传和帧编号是常见的实现手段。

3.4.2 停止-等待协议
停止-等待协议中,发送方每发送一个数据帧,就停止发送并等待接收方的确认。收到正确确认后发送下一个帧;收到否认确认或等待确认超时后,重传当前帧。
确认帧可能丢失。发送方超时后会重传数据帧,而接收方可能已经正确收到过该帧。为避免把重复帧再次交给上层,数据帧需要编号。确认迟到时同样依靠编号判断该确认对应的是当前帧还是旧帧。
停止-等待协议实现直观,但当往返时间 RTT 大于数据帧发送时延 Td 时,发送方会长时间等待确认,信道利用率较低。其近似利用率可写为:
text
U = Td / (Td + RTT + Ta)
其中 Ta 是确认帧发送时延。要提高长时延链路的利用率,不能只允许"发一帧、等一帧"。
3.4.3 回退 N 帧协议 GBN
回退 N 帧协议允许发送方连续发送多个尚未确认的帧,发送窗口内的帧不必逐帧等待确认。接收方通常按序接收:如果期望帧没有到达,就丢弃后续失序帧,并对最近正确接收的帧进行确认。
当某一帧超时,发送方需要从该帧开始,把后面已经发出但尚未确认的帧全部重传,因此称为"回退 N 帧"。它提高了正常情况下的信道利用率,但单个帧出错可能导致多个正确到达的后续帧被重复发送。
3.4.4 选择重传协议 SR
选择重传协议允许接收方接收并缓存失序但正确到达的帧。出现差错或丢失时,发送方只重传需要重传的那一个或几个帧;等缺失帧到达后,接收方再按序把数据交给上层。
SR 减少了不必要的重复传输,但发送方和接收方都要维护窗口、缓存和编号范围,控制逻辑比停止-等待和 GBN 更复杂。
3.5 点对点协议 PPP
PPP 是广泛使用的点对点数据链路层协议。它不只规定了如何把网络层数据封装成帧,还包括链路控制协议 LCP 和一组网络控制协议 NCP。
- 封装成帧:规定 PPP 帧格式,把网络层数据放入信息字段中传输。
- LCP:负责建立、配置和测试数据链路。
- NCPs:负责对不同网络层协议进行配置,例如协商网络层相关参数。
PPP 的透明传输可使用比特填充:发送方在连续 5 个 1 后插入 0,接收方再删除该 0。它保证帧定界标志不会被数据字段误触发。PPP 也会使用帧校验序列进行差错检测;需要注意的是,PPP 本身不提供可靠传输,不负责纠正差错帧或通过编号确认实现重传。
3.6 媒体接入控制 MAC
MAC 是媒体接入控制的缩写,主要研究广播信道中多个节点如何共享同一传输媒体。按分配方式可分为静态划分信道和动态接入控制。
3.6.1 静态划分信道
静态划分信道通常在物理层实现,常见方式包括:
- 频分复用 FDM:把总频带划分为多个子频带,分别分配给不同用户。
- 时分复用 TDM:把时间划分为周期性时隙,不同用户按时隙发送。
- 波分复用 WDM:在光纤中按不同波长复用多路光信号。
- 码分复用 CDM:为每个用户分配可区分的码型。
在 CDMA 中,每个比特时间进一步划分为 m 个短间隔,这些短间隔称为码片。不同用户按各自的码片序列发送和接收,从而在同一时间、同一频带中区分信号。

3.6.2 动态接入控制与 CSMA/CD
动态接入控制不预先把信道固定分给某个节点,而是根据节点实际发送需要进行竞争或协调。随机接入中的 CSMA/CD 由三部分组成:
- MA,多址接入:多个节点共享同一信道。
- CS,载波监听:发送前先监听介质是否空闲。
- CD,碰撞检测:发送过程中继续检测是否发生碰撞。
它适用于早期共享式总线以太网。站点监听到介质空闲后开始发送;如果发送过程中检测到碰撞,就立即停止发送,随后按截断二进制指数退避算法等待随机时间,再尝试重发。
以太网的争用期与最小帧长有关。经典以太网最小 MAC 帧长为 64 字节,传统以太网 V2 帧的最大长度为 1518 字节。最小帧长的设计使发送端仍在发送该帧时,有机会检测到最远端传播回来的碰撞信号。

3.6.3 CSMA/CA
CSMA/CA 用于无线局域网,CA 表示碰撞避免。无线节点难以在发送数据的同时可靠检测碰撞,因此协议重点放在发送前监听信道、随机退避和确认等机制上,尽量降低同时发送的概率。
CSMA/CD 与 CSMA/CA 的区分应放在使用环境中理解:共享式有线总线以太网使用碰撞检测;无线局域网使用碰撞避免。现代交换式全双工有线以太网已不再依赖 CSMA/CD。
3.7 MAC 地址、IP 地址与 ARP 协议
3.7.1 MAC 地址
MAC 地址是以太网 MAC 子层使用的地址,也常被称为硬件地址或物理地址。它用于帧在当前链路上的交付。以太网 MAC 地址通常为 48 位,地址的相关比特可区分全球管理/本地管理,以及单播/多播等属性。
3.7.2 IP 地址
IP 地址属于网络层。网络编号用于标识互联网中的网络,主机编号用于标识同一网络中的不同主机或路由器接口。
数据报经由路由器转发时,IP 数据报中的源 IP 地址和目的 IP 地址通常保持不变;但每经过一段新的链路,路由器都要重新封装一个链路层帧,所以源 MAC 地址和目的 MAC 地址会随当前链路改变。
3.7.3 ARP 协议
ARP 用于根据 IP 地址解析出对应的 MAC 地址。主机在本局域网内发送 IP 数据报前,需要知道目标主机或下一跳路由器的 MAC 地址;ARP 请求和应答完成这一映射,结果保存在 ARP 表中。
ARP 表项可以是动态的,也可以是静态的。动态表项由系统自动学习并根据操作系统策略老化;静态表项由管理员手工设置,生命周期和配置方式因操作系统而异。

3.8 集线器与以太网交换机
集线器工作在物理层。它将收到的信号复制到其他端口,使用集线器的以太网在逻辑上仍是总线型网络,连接在同一集线器上的设备共享碰撞域。集线器具备的容错和网络管理能力有限。
以太网交换机工作在数据链路层,拥有多个接口,能够读取帧的目的 MAC 地址,并在帧交换表中查找该地址对应的接口号。交换机把每个端口划分为独立的碰撞域,端口使用全双工工作时可以避免碰撞。
交换机常见的帧转发方式有两种:
- 存储转发:接收完整帧并进行差错检查后再转发。
- 直通交换:读取到目的 MAC 地址后尽快开始转发,不等待完整帧,也通常不检查帧是否出错。
可以把两者的差别记成:存储转发先验后发,直通交换更关注低转发时延。

3.9 以太网交换机自学习和转发帧的流程
交换机通过自学习算法逐渐建立帧交换表。表项的核心内容是"MAC 地址 - 接口号"的对应关系,并带有老化时间。
收到一个帧时,交换机按下面的顺序处理:
- 根据帧的源 MAC 地址和入接口登记或更新帧交换表。
- 查找帧的目的 MAC 地址对应的接口号。
- 根据查找结果决定转发动作。
转发结果分为三种:
- 明确转发:查到目的 MAC 对应的接口,且该接口不是入接口,则只从这个接口转发。
- 盲目转发:查不到目的 MAC 对应的接口,交换机在同一 VLAN 的其他接口泛洪该帧。
- 明确丢弃:查到目的 MAC 对应的接口就是入接口,说明目的主机与源主机在同一侧,不需要再转发。
交换机的自学习依赖源 MAC 地址,而转发决策依赖目的 MAC 地址。这两个方向不能混淆。
3.10 以太网交换机的生成树协议 STP
为了提高以太网的可靠性,交换机之间常部署冗余链路。但二层网络出现环路后,广播帧和未知单播帧会在环中反复转发,可能造成广播风暴和帧交换表震荡。
生成树协议 STP 在保留冗余物理线路的同时,计算出无环路的逻辑拓扑。部分端口在正常情况下不转发普通数据帧;当活动链路故障时,协议重新计算并启用合适的冗余路径。这样既提高可用性,又避免二层环路。
3.11 虚拟局域网 VLAN
交换网络规模扩大后,若所有端口仍属于同一个广播域,广播流量可能不断增加,严重时形成广播风暴。使用路由器可以分割广播域,但成本和部署复杂度更高;VLAN 提供了在二层交换网络中划分广播域的方式。
VLAN 是把局域网中的设备划分为与物理位置无关的逻辑组的技术。处于同一 VLAN 的设备共享一个广播域;不同 VLAN 之间的通信需要三层转发。
3.11.1 IEEE 802.1Q 帧
IEEE 802.1Q 通过在以太网帧中加入 VLAN 标签,让一条链路可以识别并承载多个 VLAN 的流量。标签中包含 VLAN 标识等控制信息,交换机据此决定帧属于哪个 VLAN。
3.11.2 交换机端口类型
- Access 端口:通常连接终端设备,只属于一个 VLAN。
- Trunk 端口:通常连接交换机、路由器等网络设备,可承载多个 VLAN,链路上通常携带 802.1Q 标签。
- Hybrid 端口:可以连接终端或网络设备,能够按配置承载多个 VLAN,并分别决定出端帧是否携带标签。

总结
本章的顺序可以归纳为:先解决帧如何形成、如何检错和如何可靠到达;再解决共享信道中的媒体接入与 MAC 编址;最后通过交换机自学习完成帧转发,并用 STP 控制二层环路、用 VLAN 划分广播域。这样从点对点链路到交换式局域网,数据链路层各机制的职责就能对应起来。
参考资料
湖科大计算机网络第三章