4. 数据链路层(上):帧结构;MAC地址;以太网协议;CSMA/CD机制
数据链路层,说白了就是给物理层传输的原始比特流「套上缰绳」。它负责把不可靠的物理链路变成一条逻辑上无差错的通道。我刚开始接触网络时,总觉得这层就是封装一下数据,没什么技术含量。直到有一次排查一个丢包问题,发现是帧校验字段被网卡错误地修改了……嗯,从那以后我再也不敢小看数据链路层了。
4.1 以太网帧结构
以太网帧是数据链路层的核心单元。它就像一封信,有信封(头部)、信纸(数据)和封口(尾部)。我们来看看它的具体结构:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 前导码 | 7 | 用于同步时钟,101010... 交替模式 |
| 帧起始定界符 | 1 | 标志帧的开始,最后两位为 11 |
| 目的MAC地址 | 6 | 接收方网卡地址 |
| 源MAC地址 | 6 | 发送方网卡地址 |
| 长度/类型 | 2 | ≤1500 表示数据长度;≥1536 表示上层协议类型 |
| 数据 | 46-1500 | 上层协议数据单元(IP包) |
| 帧校验序列 | 4 | CRC-32 校验,检测传输错误 |
这里有个细节要注意:前导码和帧起始定界符在物理层就被处理掉了,网卡不会把它们交给上层。所以你在Wireshark里看到的以太网帧,其实是从目的MAC地址开始的。
4.2 MAC地址
MAC地址,也叫物理地址、硬件地址。它是网卡出厂时烧录的唯一标识,长度48位,通常用十六进制表示,比如 00:1A:2B:3C:4D:5E。
MAC地址的结构是这样的:
- 前24位:组织唯一标识符(OUI),由IEEE分配给厂商。比如
00:1A:2B可能是某家公司的。 - 后24位:厂商自行分配的序列号,保证同一OUI下不重复。
MAC地址还有几个特殊类型:
- 单播地址:第1字节最低位为0,发给单个设备。
- 多播地址:第1字节最低位为1,发给一组设备。
- 广播地址:全1,即
FF:FF:FF:FF:FF:FF,发给所有设备。
4.3 以太网协议
以太网协议定义了数据链路层的帧格式和传输规则。目前主流的是IEEE 802.3标准。它有几个关键点:
- 最小帧长64字节:数据部分至少46字节。如果上层数据不足,需要填充(Padding)。
- 最大帧长1518字节:数据部分最多1500字节(MTU)。
- 帧间距:两个帧之间至少间隔96比特时间,用于设备准备接收。
为什么要有最小帧长?这跟后面的CSMA/CD机制有关。我稍后会解释。
以太网协议还定义了多种速率:10Mbps、100Mbps、1Gbps、10Gbps……速率越高,帧结构基本不变,但物理层的编码方式会变。比如千兆以太网用了8B/10B编码,而万兆以太网用了64B/66B编码。
4.4 CSMA/CD机制
CSMA/CD,全称是载波监听多点接入/碰撞检测。它是以太网的核心访问控制方法。说白了,就是多个设备共享一条传输介质时,怎么避免数据冲突。
它的工作流程可以概括为四个步骤:
- 先听后说:发送前先监听信道。如果空闲,就发送;如果忙,就等待。
- 边听边说:发送过程中持续监听。如果没检测到碰撞,就继续发送直到完成。
- 碰撞停止:一旦检测到碰撞,立即停止发送,并发送一个32位的阻塞信号(Jamming Signal),通知所有设备。
- 随机等待:等待一个随机时间(退避算法),然后重新尝试发送。
你想想看,如果两个设备同时检测到信道空闲,同时发送数据,就会发生碰撞。CSMA/CD就是解决这个问题的。
退避算法用的是截断二进制指数退避。具体来说:
- 第1次碰撞:等待0或1个时隙(1个时隙=512比特时间)。
- 第2次碰撞:等待0~3个时隙。
- 第3次碰撞:等待0~7个时隙。
- ……
- 第10次碰撞后:等待0~1023个时隙。
- 第16次碰撞:报告失败,丢弃帧。
这个算法的好处是:碰撞次数越多,等待时间范围越大,减少了再次碰撞的概率。
下面这张图展示了CSMA/CD的完整流程:
CSMA/CD在早期的共享式以太网中非常重要。但现在,随着交换机的普及,全双工模式成为主流,CSMA/CD基本上用不到了。为什么呢?因为交换机每个端口都是一个独立的冲突域,设备之间不会互相干扰。
4.5 小结
这一章我们聊了数据链路层的核心内容:
- 以太网帧结构:前导码、MAC地址、长度/类型、数据、FCS。
- MAC地址:48位全球唯一标识,分单播、多播、广播。
- 以太网协议:定义了帧格式、最小/最大帧长、帧间距。
- CSMA/CD:先听后说、边听边说、碰撞停止、随机等待。