第2章:链路层(Link Layer)
一、导读
1.1 本章学习目标
第2章讲解链路层——负责在相邻节点之间传输数据的协议层。从帧编码到差错检测,从以太网到交换技术,本章构建了理解局域网和数据中心网络的基础。
本章核心学习目标:
- 掌握帧编码技术:字节计数、字符填充、位填充
- 理解差错检测机制:校验和、CRC 循环冗余校验
- 掌握以太网的工作原理:CSMA/CD、帧格式、自学习交换
- 理解 VLAN 的作用:逻辑隔离广播域
- 了解数据中心网络架构:叶脊拓扑、ECMP
1.2 为什么本章如此重要
链路层是网络的基础设施。无论是传统以太网还是现代数据中心网络,理解链路层的设计是构建高性能网络的前提。
1.3 核心问题引导
为什么以太网使用 CSMA/CD 而 WiFi 使用 CSMA/CA?
CRC 如何检测突发错误?为什么比校验和更可靠?
交换机如何自学习 MAC 地址映射?
二、核心概念详解
2.1 差错检测
2.1.1 CRC 循环冗余校验
CRC 原理:
将数据视为多项式 D(x),选择生成多项式 G(x)
CRC 余数 R(x) = D(x) × x^r mod G(x)
发送: D(x) × x^r + R(x) (可被 G(x) 整除)
接收: 检查接收到的帧是否能被 G(x) 整除
常用生成多项式:
CRC-32 (以太网): x³² + x²⁶ + x²³ + x²² + x¹⁶ + x¹² + x¹¹ + x¹⁰ + x⁸ + x⁷ + x⁵ + x⁴ + x² + x + 1
CRC 的检测能力:
- 所有单比特错误
- 所有双比特错误(如果 G(x) 有 ≥ 3 项)
- 所有奇数个错误(如果 G(x) 包含 x+1 因子)
- 所有 ≤ r 位的突发错误
- 大部分 > r 位的突发错误(概率 1-2^{-r})2.2 以太网
以太网帧格式:
┌────────┬──────────┬──────────┬──────┬──────────────────┬─────┐
│前导码(8)│目的MAC(6)│源MAC(6) │类型(2)│ 数据(46-1500) │FCS(4)│
└────────┴──────────┴──────────┴──────┴──────────────────┴─────┘
前导码: 10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011
目的MAC: 6 字节,广播地址 FF:FF:FF:FF:FF:FF
源MAC: 6 字节,网卡的物理地址
类型: 0x0800=IP, 0x0806=ARP, 0x86DD=IPv6
数据: 46-1500 字节(不足 46 字节需填充)
FCS: 32 位 CRC
最小帧长: 64 字节
原因: 确保发送完帧之前能检测到冲突
64 bytes × 8 bits / 10 Mbps = 51.2 μs ≈ 2 × 传播延迟 (500m 以太网)2.3 交换技术
交换机工作原理:
1. 自学习: 记录源 MAC 和端口的映射
2. 转发: 根据目的 MAC 查找端口
3. 泛洪: 未知目的 MAC 时广播到所有端口
MAC 地址表:
┌─────────────────┬──────┬────────────┐
│ MAC 地址 │ 端口 │ 时间戳 │
├─────────────────┼──────┼────────────┤
│ AA:BB:CC:DD:EE:01│ 1 │ 10:30:00 │
│ AA:BB:CC:DD:EE:02│ 2 │ 10:30:01 │
│ AA:BB:CC:DD:EE:03│ 3 │ 10:30:02 │
└─────────────────┴──────┴────────────┘
生成树协议 (STP):
- 防止交换环路
- 构建无环的转发树
- 冗余链路作为备份
VLAN (虚拟局域网):
- 在物理交换机上创建逻辑隔离的广播域
- 802.1Q 标签: 4 字节插入以太网帧
- TPID (16 bit): 0x8100
- TCI (16 bit): VLAN ID (12 bit) + 优先级 (3 bit) + DEI (1 bit)三、实战案例
3.1 案例一:CRC 计算
python
def crc32(data: bytes) -> int:
"""计算 CRC-32"""
crc = 0xFFFFFFFF
poly = 0xEDB88320 # 反转的 CRC-32 多项式
for byte in data:
crc ^= byte
for _ in range(8):
if crc & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
return crc ^ 0xFFFFFFFF
# 测试
data = b"Hello, World!"
checksum = crc32(data)
print(f"CRC-32: {checksum:08X}")
# 验证
import binascii
expected = binascii.crc32(data) & 0xFFFFFFFF
print(f"Expected: {expected:08X}")
print(f"Match: {checksum == expected}")四、本章小结
CRC 是最可靠的差错检测机制,能检测所有单比特和大部分多比特错误
以太网 使用 CSMA/CD 解决共享介质冲突,交换机通过自学习实现高效转发
VLAN 在物理网络上创建逻辑隔离,提高安全性和灵活性
五、思考与练习
思考题
为什么以太网的最小帧长是 64 字节?如果速率从 10 Mbps 提升到 10 Gbps,最小帧长需要改变吗?
交换机的 MAC 地址表溢出时会发生什么?
编程练习
实现 CRC-32 算法,验证其对单比特和双比特错误的检测能力。
实现一个简单的交换机模拟器,支持 MAC 地址自学习和转发。