数据链路层
约 4576 字大约 15 分钟
2025-07-27
概述
数据链路层(Data Link Layer)是 OSI 七层模型中的第 2 层,位于物理层之上、网络层之下。它的核心任务是将物理层提供的原始比特流封装成帧,并在相邻节点之间实现可靠、高效的数据传输。
基本概念
| 概念 | 说明 |
|---|---|
| 链路(Link) | 一条无源的点到点的物理线路段,中间没有任何交换节点。只是一段物理介质。 |
| 数据链路(Data Link) | 在链路上加上通信协议和硬件(网卡等),构成逻辑上的数据传输通道。 |
| 帧(Frame) | 数据链路层的协议数据单元(PDU)。网络层的 IP 数据报传入数据链路层后,被封装在帧中传输。 |
| 节点(Node) | 拥有 MAC 地址并参与数据链路层通信的设备,如主机、路由器、交换机。 |
提示
一句话区分:链路是"路",数据链路是"有交通规则的路"——数据链路 = 链路 + 通信协议。
三大核心问题
数据链路层要解决三个根本问题:封装成帧、差错检测、可靠传输。
一、封装成帧
发送端将网络层下发的 IP 数据报加上帧头和帧尾,构成一个完整的帧。帧头和帧尾中包含的重要字段包括帧起始定界符和帧结束定界符。
核心难点:透明传输——无论数据部分是什么样的比特组合,都不应被误判为帧的边界。
1. 字符填充法(面向字节)
在数据中出现的每个 帧定界符字符 前面插入一个 转义字符 ESC。
| 场景 | 操作 |
|---|---|
数据中出现 SOH(帧开始) | 发送 ESC + SOH |
数据中出现 EOT(帧结束) | 发送 ESC + EOT |
数据中出现 ESC(转义符本身) | 发送 ESC + ESC |
接收端收到后,删除转义字符,恢复原始数据。
原始数据: A SOH B ESC C EOT D
发送的帧: SOH A ESC+SOH B ESC+ESC C ESC+EOT D EOT
↑ 透明传输处理区域 ↑注意
字符填充法仅适用于面向字节的链路层协议(如 PPP),不适用于面向比特的协议。
2. 零比特填充法(面向比特)
以 01111110(即连续 6 个 1)作为帧的定界符。发送端扫描数据部分,每遇到 5 个连续的 1,就在其后插入一个 0。
发送端:
原始数据: 01101111111111100
填充后: 0110111110 11111 0 100
↑ ↑
5个1后插0 5个1后插0
接收端:
收到数据,每遇到5个连续的1,删除后面的0,恢复原始数据。若收到 6 个连续的 1,则视为帧的边界。优点:易于硬件实现,广泛应用于 HDLC、PPP(同步模式)等协议。
3. 透明传输的本质
提示
透明传输是指:无论上层数据是什么样的比特组合,数据链路层都能正确地将它作为数据传送,而不会误认为是控制信息。对上层而言,底层的传输机制是"透明"的。
二、差错检测 —— CRC 循环冗余检验
CRC(Cyclic Redundancy Check)是目前数据链路层最广泛使用的差错检测技术。
基本原理(模二除法)
- 发送端和接收端事先约定一个生成多项式 G(x)
- 发送端在数据末尾加上 冗余码(FCS),使得加码后的数据能被 G(x) 整除
- 接收端用 G(x) 除收到数据,若余数为 0 则无差错,否则丢弃
计算步骤
设:
待发送数据 D = 1101(二进制)
生成多项式 G(x) = x³ + x + 1 → 二进制 1011
r = 生成多项式的最高次幂 = 3
步骤1:在 D 后面补 r 个 0 → 1101000
步骤2:用补零后的数据 ÷ 生成多项式(模二除法,不进位加法/减法 = XOR)
步骤3:余数即为 FCS(冗余码),长度为 r
_______________
1011 ) 1101000
1011 ← 1101 XOR 1011 = 0110
----
0110
0000 ← 补0对齐
----
1100
1011
----
1110
1011
----
101 ← 余数,不足3位前面补0 → 101
步骤4:发送的帧 = D + FCS = 1101 101
接收端:
收到 1101101,除以 1011:
若余数为 000 → 无差错
若余数不为 0 → 有差错,丢弃注
常见的生成多项式标准:
- CRC-16:x¹⁶ + x¹⁵ + x² + 1
- CRC-32(以太网):x³² + x²⁶ + x²³ + x²² + x¹⁶ + x¹² + x¹¹ + x¹⁰ + x⁸ + x⁷ + x⁵ + x⁴ + x² + x + 1
CRC 的特点
| 特性 | 说明 |
|---|---|
| 检错能力 | 能检测出所有奇数个随机差错、所有突发长度 ≤ r 的差错 |
| 无法纠错 | CRC 只能检测差错,不能定位和纠正(需要上层的重传机制) |
| 性能 | 硬件实现极快,几乎不增加传输延迟 |
三、可靠传输
当接收端检测到帧出错时,需要某种机制让发送端重传。三种典型的自动重传请求(ARQ)协议:
1. 停止-等待协议(Stop-and-Wait ARQ)
最简单的可靠传输协议。
发送端 接收端
│ │
│─────── 帧 0 ────────→ │
│←────── ACK 0 ────────│
│─────── 帧 1 ────────→ │
│←────── ACK 1 ────────│
│ │
│ ─→ 超时重传 ←─ │ (超时未收到 ACK)
│─────── 帧 1 ────────→ │ (重传)| 特性 | 数值 |
|---|---|
| 信道利用率 | 极低(发送方大部分时间在等待 ACK) |
| 需要的序号范围 | 1 bit(0 或 1) |
| 适用场景 | 卫星通信等高延迟信道?效率太低,基本不用于高速网络 |
信道利用率公式:
U=TD+2×Tprop+Tproc+TATD
其中 TD 为发送时延,Tprop 为传播时延。
2. 回退 N 帧协议(Go-Back-N, GBN)
发送端可以连续发送多个帧,不用等待每个 ACK,但接收端只按顺序接收。
核心规则:
提示
累积确认:接收端只确认按序到达的最后一个帧。发送端收到 ACK n 表示序号 ≤ n 的所有帧都已正确到达。
发送端(窗口大小 = 4) 接收端
│ │
│── 0 ──→ │ ✓ 接收,发送 ACK0
│── 1 ──→ │ ✓ 接收,发送 ACK1
│── 2 ──→ │ ✓ 接收,发送 ACK2
│── 3 ──→ │ ✗ 帧3出错,丢弃
│── 4 ──→ │ ✗ 期待3,丢弃
│── 5 ──→ │ ✗ 期待3,丢弃
│ │
│←── ACK2 ───│ │ 累积确认,只确认到2
│ │
│ 超时,回退到3开始重传 │
│── 3 ──→ │ ✓
│── 4 ──→ │ ✓
│── 5 ──→ │ ✓| 特性 | 说明 |
|---|---|
| 发送窗口 | 1 < Ws ≤ 2ⁿ - 1(n 为序号位数) |
| 接收窗口 | 1 |
| 优点 | 连续发送,信道利用率高于停止-等待 |
| 缺点 | 一个帧出错会导致大量重传(回退 N 个帧) |
3. 选择重传协议(Selective Repeat, SR)
接收端设置接收窗口,可以接收和缓存乱序到达的帧,仅要求发送端重传真正出错的帧。
核心规则:
提示
逐个确认,只重传出错帧:接收端缓存乱序到达的正确帧,并为每个正确接收的帧单独发送 ACK。发送端仅重传超时或收到 NAK 的帧。
发送端(窗口大小 = 4) 接收端(窗口大小 = 4)
│ │
│── 0 ──→ │ ✓
│── 1 ──→ │ ✓
│── 2 ──→ │ ✗ 出错,丢弃
│── 3 ──→ │ ✓ 缓存(不提交上层)
│ │
│←──── ACK0 ────│ │
│←──── ACK1 ────│ │
│←──── ACK3 ────│ │ 跳过2(未收到)
│ │
│ 超时,仅重传帧2 │
│── 2 ──→ │ ✓ 提交 2+3,窗口滑动
│ │
│── 4 ──→ │ 继续发送新帧| 特性 | 说明 |
|---|---|
| 发送窗口 | 1 < Ws ≤ 2^(n-1) |
| 接收窗口 | 1 < Wr ≤ 2^(n-1),且 Ws = Wr |
| 优点 | 出错时只重传必要的帧,效率最高 |
| 缺点 | 接收端需要缓存,实现复杂度高 |
三种协议对比:
| 协议 | 发送窗口 | 接收窗口 | 重传策略 | 信道利用率 |
|---|---|---|---|---|
| 停止-等待 | 1 | 1 | 超时全部重传 | 低 |
| 回退 N 帧(GBN) | >1 | 1 | 从错帧开始全部重传 | 中 |
| 选择重传(SR) | >1 | >1 | 仅重传出错帧 | 高 |
IP 地址 vs MAC 地址 vs ARP 协议
这是网络中最容易混淆的三组概念,理解它们的区别是掌握计算机网络的关键。
| 对比维度 | IP 地址 | MAC 地址 |
|---|---|---|
| 层次 | 网络层(逻辑地址) | 数据链路层(物理地址) |
| 长度 | IPv4: 32 bit, IPv6: 128 bit | 48 bit(6 字节) |
| 格式 | 192.168.1.1 | 00-1A-2B-3C-4D-5E |
| 分配方式 | 网络管理员 / DHCP 动态分配 | 出厂时烧录在网卡 ROM 中 |
| 是否可变 | 可变(更换网络后改变) | 通常固定不变 |
| 作用范围 | 端到端(跨网络) | 点到点(同一链路内) |
| 层次含义 | 标识主机在网络中的位置(在哪) | 标识网卡的唯一身份(是谁) |
提示
一句话记忆:IP 地址是"你要去哪个城市"(跨网络定位),MAC 地址是"到了这个城市,去哪个具体门牌号"(链路上的最终交付)。
ARP 协议(Address Resolution Protocol)
功能:根据 IP 地址解析出对应的 MAC 地址。
工作过程:
主机 A(192.168.1.1) 想给 主机 B(192.168.1.2) 发数据
│
├─ 步骤1:查 ARP 缓存表
│ 若已有 B 的 MAC → 直接封装帧发送
│ 若无 → 进行步骤2
│
├─ 步骤2:广播 ARP 请求
│ 发送到 Ethernet 广播地址 FF-FF-FF-FF-FF-FF
│ 内容:"谁的 IP 是 192.168.1.2?请告诉我你的 MAC 地址"
│
├─ 步骤3:目标主机响应(单播)
│ 主机 B 识别是自己的 IP,发送 ARP 应答
│ 内容:"192.168.1.2 的 MAC 是 00-1A-2B-3C-4D-5E"
│
└─ 步骤4:写入 ARP 缓存
主机 A 将映射写入缓存(通常保留 20 分钟)| 帧类型 | 目标 MAC | 源 MAC | 说明 |
|---|---|---|---|
| ARP 请求 | FF-FF-FF-FF-FF-FF(广播) | A 的 MAC | 同一广播域内所有主机都能收到 |
| ARP 应答 | A 的 MAC(单播) | B 的 MAC | 只有请求方收到 |
注意
ARP 欺骗:攻击者发送伪造的 ARP 应答,将目标 IP 映射到攻击者的 MAC 地址,从而实现中间人攻击(MITM)。防范措施包括静态 ARP 表、DAI(Dynamic ARP Inspection)等。
两种信道类型
数据链路层按信道类型分为两大类:点对点信道和广播信道。
一、点对点信道 —— PPP 协议
PPP(Point-to-Point Protocol)是目前最广泛使用的点对点数据链路层协议。
应用场景:拨号上网、DSL、VPN 隧道、两个路由器之间的专线连接。
PPP 帧格式
┌─────┬──────┬──────┬──────────┬──────────┬──────┐
│标志F│地址A │控制C │ 协议字段 │ 信息部分 │ FCS │
│7E │ FF │ 03 │ 1-2字节 │ ≤1500字节 │2/4B │
└─────┴──────┴──────┴──────────┴──────────┴──────┘| 字段 | 长度 | 说明 |
|---|---|---|
| 标志 F | 1 字节 | 0x7E,帧的定界符 |
| 地址 A | 1 字节 | 0xFF,广播地址(PPP 不区分源/目标地址) |
| 控制 C | 1 字节 | 0x03,无序号帧 |
| 协议 | 2 字节 | 标识信息部分承载的协议:0x0021=IP, 0xC021=LCP, 0x8021=NCP |
| 信息 | ≤ 1500 字节 | 上层数据报 |
| FCS | 2 或 4 字节 | CRC 校验码 |
PPP 协议栈
┌─────────────────────────────┐
│ 上层协议(IP等) │
├─────────────────────────────┤
│ NCP —— 网络控制协议 │ ← 配置网络层参数(如 IPCP 分配 IP)
├─────────────────────────────┤
│ LCP —— 链路控制协议 │ ← 建立、配置、测试数据链路连接
├─────────────────────────────┤
│ PPP 封装 + HDLC-like │ ← 帧封装
└─────────────────────────────┘PPP 的工作阶段
链路不可用 ──→ 链路建立(LCP协商) ──→ 身份认证(可选) ──→ 网络层协议(NCP配置) ──→ 数据传送
↑ │
└────────────────────────────── 终止 ───────────────────────────────────────────┘二、广播信道 —— 以太网
广播信道的核心挑战:多个节点共享同一传输介质,如何避免冲突?
CSMA/CD(有线以太网)
载波监听多点接入/碰撞检测——有线以太网的核心介质访问控制协议。
工作原理("先听后说,边说边听"):
| 步骤 | 动作 | 说明 |
|---|---|---|
| 1. 载波监听 | 先听后说 | 发送前监听信道。空闲 → 发送,忙 → 继续监听 |
| 2. 碰撞检测 | 边说边听 | 发送过程中持续检测信号电压变化 |
| 3. 发现碰撞 | 停止发送 | 发送 32 bit 的阻塞信号,通知所有站点 |
| 4. 退避重传 | 随机等待 | 使用截断二进制指数退避算法等待随机时间后重试 |
提示
截断二进制指数退避算法:
- 第 i 次重传,退避时间在 [0, 2^i - 1] 个争用期中随机选择
- 争用期 = 51.2 μs(10Mbps 以太网时,对应 512 bit 的发送时间)
- 重传 16 次仍失败 → 向上层报告错误
最小帧长:64 字节(512 bit),保证在网络直径范围内能检测到碰撞。
CSMA/CA(无线 WiFi)
无线网络无法真正做到"边说边听"(发送时无法同时接收),因此使用 CSMA/CA——碰撞避免 替代 CSMA/CD 的碰撞检测。
| 特性 | CSMA/CD(有线以太网) | CSMA/CA(无线 WiFi) |
|---|---|---|
| 检测方式 | 碰撞检测(CD) | 碰撞避免(CA) |
| 能否边发边收 | 能(有线全双工) | 不能(无线半双工,信号收发同频) |
| 隐藏站问题 | 不存在 | 存在——需要通过 RTS/CTS 解决 |
| 帧确认 | 不必须(链路可靠度高) | 必须(链路不可靠,每帧需 ACK) |
RTS/CTS 机制(解决隐藏站问题)
A ────────── RTS ──────────→ B ← A 向 B 发送请求发送
A ←──────── CTS ─────────── B ← B 回复允许发送(同时通知其他站)
A ───────── 数据帧 ────────→ B ← A 开始发送数据
A ←───────── ACK ─────────── B ← B 确认收到注
隐藏站问题:节点 A 和 C 都在 B 的通信范围内,但彼此不在范围内。A 向 B 发送时,C 监听不到,可能同时向 B 发送,造成碰撞。RTS/CTS 机制通过 B 的"媒介"告知所有节点。
三、静态信道划分
在物理层范畴内,通过静态划分信道的方式实现多路复用:
| 复用方式 | 英文 | 原理 | 典型应用 |
|---|---|---|---|
| 频分复用 | FDM | 将信道划分为不同的频率段 | 广播电视、ADSL |
| 时分复用 | TDM | 将时间划分为固定的时隙,轮转分配 | 数字电话(PCM 中继) |
| 波分复用 | WDM | 在一根光纤中传输不同波长的光信号 | 光纤骨干网 |
| 码分复用 | CDM/CDMA | 不同用户使用互不相关的码序列 | 3G 移动通信 |
数据链路层设备
交换机(Switch)
交换机是数据链路层的关键设备,基于 MAC 地址进行帧转发。
自学习机制(MAC 地址表)
交换机维护一个 MAC 地址表(又称 CAM 表),通过学习自动构建:
┌────────────────────────────────────────────────────────┐
│ MAC 地址表 │
├──────────┬──────────────┬──────────────┬────────────────┤
│ MAC 地址 │ 端口 │ VLAN ID │ 老化时间 │
├──────────┼──────────────┼──────────────┼────────────────┤
│ AA-AA-AA │ Port 1 │ 10 │ 300s │
│ BB-BB-BB │ Port 2 │ 10 │ 298s │
│ CC-CC-CC │ Port 3 │ 20 │ 295s │
│ DD-DD-DD │ Port 4 │ 20 │ 290s │
└──────────┴──────────────┴──────────────┴────────────────┘学习过程:
| 步骤 | 操作 |
|---|---|
| 1 | 收到一个帧,记录源 MAC 地址和入端口的映射 |
| 2 | 查 MAC 地址表,找到目标 MAC 对应的端口 |
| 3a | 找到 → 精准转发,仅从该端口发送 |
| 3b | 未找到 → 泛洪(Flooding),向所有端口(除入端口外)广播 |
| 4 | 表中的条目有老化时间(通常 300s),超时未使用则删除 |
提示
交换机的自学习是透明的,不需要人为配置。这也是"透明网桥"名称的由来——对终端主机完全透明。
直通转发 vs 存储转发
| 转发方式 | 过程 | 延迟 | 检错 | 适用场景 |
|---|---|---|---|---|
| 直通转发 | 只读取目标 MAC 地址(前 6 字节)即开始转发 | 极低 | 无 | 对延迟敏感的内部网络 |
| 存储转发 | 完整接收整个帧,校验 FCS 无误后才转发 | 较高 | 有 | 需要差错控制的企业/数据中心 |
VLAN(虚拟局域网)
VLAN 通过逻辑上将物理局域网划分为多个虚拟局域网,隔离广播域。
| 特性 | 无 VLAN | 有 VLAN |
|---|---|---|
| 广播域范围 | 整个交换网络 | 每个 VLAN 独立 |
| 主机通信 | 任何主机都能通信 | 不同 VLAN 间需三层路由 |
| 安全性 | 低(广播可达所有主机) | 高(隔离敏感部门流量) |
| 网络管理 | 扁平结构,扩展受限 | 灵活,可按部门/功能划分 |
802.1Q 帧格式(VLAN 标记):
标准以太网帧: DA(6) + SA(6) + Type(2) + Data + FCS(4)
802.1Q 帧: DA(6) + SA(6) + TPID(2) + TCI(2) + Type(2) + Data + FCS(4)
│ └── VID(12 bit,可标识 4096 个 VLAN)
└── 0x8100(VLAN 协议标识)STP(生成树协议)
STP 的核心目的:消除环路,防止广播风暴。
| 概念 | 说明 |
|---|---|
| 桥 ID | 优先级(2 字节)+ MAC 地址(6 字节),越小越优先 |
| 根桥 | 桥 ID 最小的交换机,整个网络的逻辑中心 |
| 根端口 | 非根桥上距离根桥最近的端口 |
| 指定端口 | 每个网段上距离根桥最近的端口 |
| 阻塞端口 | 既不是根端口也不是指定端口的端口 → 逻辑阻塞 |
根桥(优先级 4096)
│
│
┌─────────────┼─────────────┐
│ │ │
交换机B 交换机C 交换机D
│ │ │
└─────────────┼─────────────┘
│
│(冗余链路 → 逻辑阻塞)
交换机E ← 阻塞端口,不转发数据帧,但持续接收 BPDU注意
STP 不消除物理环路,而是逻辑上阻断冗余链路使其不转发数据帧,同时保持接收 BPDU。当主链路故障时,STP 会自动激活被阻塞的端口(收敛时间约 30-50 秒)。RSTP(快速生成树)可将收敛时间缩短到 1-3 秒。
数据链路层的完整通信流程
下面是一个主机 A(192.168.1.1)向主机 B(192.168.1.2)发送数据的完整数据链路层流程:
主机 A 主机 B
│ │
│ ① 检查目标 IP 是否在同一子网 │
│ 是的(192.168.1.0/24) │
│ │
│ ② 查 ARP 缓存表 │
│ 无记录 → 广播 ARP 请求 │
│ ────────────────────────────────────────────→ │
│ "谁是 192.168.1.2?" │
│ │
│ ←──────────────────────────────────────────── │
│ "我是,我的 MAC 是 BB-BB-BB" │
│ 单播 ARP 应答 │
│ │
│ ③ 写入 ARP 缓存:192.168.1.2 → BB-BB-BB │
│ │
│ ④ 封装帧 │
│ 目标 MAC: BB-BB-BB │
│ 源 MAC: AA-AA-AA │
│ 数据: IP 数据报 │
│ 帧尾: CRC 校验码(FCS) │
│ │
│ ⑤ 交换机自学习 MAC(AA-AA-AA)→Port1 │
│ 查 MAC 表:BB-BB-BB → Port4 │
│ 精准转发 │
│ ────────────────────────────────────────────→ │
│ │
│ ⑥ 主机 B 校验 FCS → 正确 │
│ 解帧 → 提取 IP 数据报 → 上交网络层 │常见协议与端口号参考
| 协议 | 简称 | 所在层次(OSI) | 主要作用 |
|---|---|---|---|
| 以太网 | Ethernet | 数据链路层 | 最广泛使用的有线局域网技术 |
| 点对点协议 | PPP | 数据链路层 | 拨号/专线点对点连接 |
| 地址解析协议 | ARP | 数据链路层/网络层交界 | IP 地址 → MAC 地址映射 |
| 生成树协议 | STP | 数据链路层 | 防止交换机网络环路 |
| 虚拟局域网 | VLAN / 802.1Q | 数据链路层 | 逻辑分割广播域 |
| 链路层发现协议 | LLDP | 数据链路层 | 邻居设备发现和拓扑信息交换 |
[!SUMMARY] 数据链路层要点:
- 将比特流封装成帧,是网络层的基础
- 通过 CRC 检测传输差错
- 通过 ARQ(停止-等待/GBN/SR) 实现可靠传输
- ARP 协议 将 IP 地址解析为 MAC 地址
- 交换机基于 MAC 地址自学习和转发帧
- VLAN 隔离广播域,STP 防止环路
- 有线使用 CSMA/CD,无线使用 CSMA/CA
