Data Link Layer Functions
数据链路层
数据链路层位于物理层之上、网络层之下。物理层只负责把比特变成信号并在传输媒体上传送;数据链路层要把网络层交下来的分组封装成帧,并让帧在一段链路上或一个局域网内传输。
网络层看的是源主机到目的主机的端到端路径;数据链路层看的是相邻节点之间的一段链路。一个网络层分组经过多个路由器时,会在每一跳被解封装和重新封装成新的数据链路层帧。
链路、数据链路和帧
链路是从一个节点到相邻节点的一段物理线路,中间没有其他交换节点。它强调的是物理通路,可以是有线链路,也可以是无线链路。
数据链路是在链路基础上加上通信协议和相关硬件、软件后形成的逻辑通道。链路只是“线”,数据链路还包含如何识别帧、如何处理差错、如何协调发送等规则。
帧是数据链路层的协议数据单元。网络层交给数据链路层的是分组;数据链路层给分组加上首部和尾部后形成帧。
数据链路层的功能
数据链路层的功能可以概括为:
| 功能 | 解决的问题 |
|---|---|
| 为网络层提供服务 | 屏蔽具体链路细节,让网络层能交付分组 |
| 链路管理 | 建立、维持和释放数据链路 |
| 组帧 | 从比特流中识别一帧的开始和结束 |
| 差错控制 | 检测或纠正传输过程中的比特差错 |
| 流量控制 | 避免发送方过快导致接收方来不及处理 |
| 介质访问控制 | 多个站点共享信道时决定谁可以发送 |
不是每一种数据链路层协议都会完整实现所有功能。例如,以太网通常只提供不可靠传输;无线局域网链路误码率更高,需要在数据链路层引入确认和重传。
组帧
组帧是把网络层分组封装成数据链路层帧。接收方收到的是连续比特流,必须知道哪里是一帧的开始,哪里是一帧的结束。
常见帧结构包括:
- 帧首部:携带控制信息,如地址、类型、长度等。
- 数据载荷:通常是网络层分组。
- 帧尾部:常用于差错检测,如 FCS。
- 帧定界:标识帧的边界。
组帧的关键不是“加一点包装”,而是让接收方能稳定地从连续比特流中恢复出一帧一帧的数据。
透明传输
透明传输指无论数据载荷中出现什么比特组合,数据链路层都能把它原样交付给接收方的网络层。
问题在于:如果协议使用某个特定符号作为帧定界符,而数据载荷中恰好也出现了同样的符号,接收方可能误以为帧提前结束。
字节填充法
面向字节的链路可以使用字节填充法。发送方在数据载荷中的特殊控制字节前插入转义字节;接收方看到转义字节后,知道后面的字节是普通数据,而不是控制符号。
这种方法的核心是:让载荷中的定界符“失去定界含义”。
零比特填充法
面向比特的链路常用零比特填充法。若帧定界符为:
$$
01111110
$$
发送方扫描数据载荷,只要发现 5 个连续的 1,就在后面插入一个 0。接收方在交付数据前执行逆操作:每发现 5 个连续的 1,就删除其后的一个填充 0。
这样处理后,载荷中不会自然出现 01111110,真正的 01111110 就只用于帧定界。
前导码和帧间间隔
以太网帧前面还有前导码和帧开始定界符,用来帮助接收方同步比特时钟并确定帧开始。此外,以太网帧之间还需要保留帧间最小间隔。
这些内容容易和“组帧”混在一起。可以这样区分:
- 帧首部和帧尾部属于数据链路层帧本身。
- 前导码用于物理层同步,不计入 MAC 帧长度。
- 帧间间隔是相邻帧之间必须留出的空闲时间,不是某一帧的字段。