2Computer Networks: A Systems Approach(第6版)

链路层

数据链路

帧编码差错检测以太网交换技术

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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 地址自学习和转发。


2/7链路层
0%