4. 数据链路层(上):帧结构;MAC地址;以太网协议;CSMA/CD机制

数据链路层,说白了就是给物理层传输的原始比特流「套上缰绳」。它负责把不可靠的物理链路变成一条逻辑上无差错的通道。我刚开始接触网络时,总觉得这层就是封装一下数据,没什么技术含量。直到有一次排查一个丢包问题,发现是帧校验字段被网卡错误地修改了……嗯,从那以后我再也不敢小看数据链路层了。

4.1 以太网帧结构

以太网帧是数据链路层的核心单元。它就像一封信,有信封(头部)、信纸(数据)和封口(尾部)。我们来看看它的具体结构:

字段 长度(字节) 说明
前导码 7 用于同步时钟,101010... 交替模式
帧起始定界符 1 标志帧的开始,最后两位为 11
目的MAC地址 6 接收方网卡地址
源MAC地址 6 发送方网卡地址
长度/类型 2 ≤1500 表示数据长度;≥1536 表示上层协议类型
数据 46-1500 上层协议数据单元(IP包)
帧校验序列 4 CRC-32 校验,检测传输错误
个人经验: 我曾在项目中遇到过一个问题:两台设备直连,偶尔出现丢包。抓包后发现帧校验字段总是错误。排查了半天,发现是其中一块网卡的硬件CRC计算模块有bug。最后换了网卡才解决。所以,遇到莫名其妙的丢包,别忘了检查硬件。

这里有个细节要注意:前导码和帧起始定界符在物理层就被处理掉了,网卡不会把它们交给上层。所以你在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,发给所有设备。
避坑指南: 我曾经犯过一个低级错误——在代码里硬编码了MAC地址。后来设备换了网卡,程序就找不到目标了。记住,MAC地址是硬件相关的,不要写死在代码里。应该通过系统API动态获取。

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,全称是载波监听多点接入/碰撞检测。它是以太网的核心访问控制方法。说白了,就是多个设备共享一条传输介质时,怎么避免数据冲突。

它的工作流程可以概括为四个步骤:

  1. 先听后说:发送前先监听信道。如果空闲,就发送;如果忙,就等待。
  2. 边听边说:发送过程中持续监听。如果没检测到碰撞,就继续发送直到完成。
  3. 碰撞停止:一旦检测到碰撞,立即停止发送,并发送一个32位的阻塞信号(Jamming Signal),通知所有设备。
  4. 随机等待:等待一个随机时间(退避算法),然后重新尝试发送。

你想想看,如果两个设备同时检测到信道空闲,同时发送数据,就会发生碰撞。CSMA/CD就是解决这个问题的。

核心要点: 最小帧长64字节就是为了保证在发送完一帧之前,能够检测到碰撞。假设网络直径是2500米,信号传播速度是光速的0.7倍,那么最远端的设备发送数据到本地,往返时间大约是23.8微秒。在10Mbps速率下,这个时间内能发送约238比特,加上一些余量,就定在了512比特(64字节)。如果帧太短,发送完了才收到碰撞信号,那就没法重传了。

退避算法用的是截断二进制指数退避。具体来说:

  • 第1次碰撞:等待0或1个时隙(1个时隙=512比特时间)。
  • 第2次碰撞:等待0~3个时隙。
  • 第3次碰撞:等待0~7个时隙。
  • ……
  • 第10次碰撞后:等待0~1023个时隙。
  • 第16次碰撞:报告失败,丢弃帧。

这个算法的好处是:碰撞次数越多,等待时间范围越大,减少了再次碰撞的概率。

下面这张图展示了CSMA/CD的完整流程:

CSMA/CD 工作流程图 准备发送数据 监听信道 空闲 发送数据 边发边听 检测到碰撞? 否 发送完成 是 停止发送,发阻塞信号 退避算法,随机等待 重试 关键参数 • 最小帧长:64字节 • 时隙:512比特时间 • 最大重试次数:16 • 阻塞信号:32比特

CSMA/CD在早期的共享式以太网中非常重要。但现在,随着交换机的普及,全双工模式成为主流,CSMA/CD基本上用不到了。为什么呢?因为交换机每个端口都是一个独立的冲突域,设备之间不会互相干扰。

个人建议: 虽然CSMA/CD在实际应用中越来越少,但理解它的原理对掌握网络基础很有帮助。我面试新人时,经常问CSMA/CD的退避算法。能讲清楚的人,通常对网络协议的理解都比较扎实。

4.5 小结

这一章我们聊了数据链路层的核心内容:

  • 以太网帧结构:前导码、MAC地址、长度/类型、数据、FCS。
  • MAC地址:48位全球唯一标识,分单播、多播、广播。
  • 以太网协议:定义了帧格式、最小/最大帧长、帧间距。
  • CSMA/CD:先听后说、边听边说、碰撞停止、随机等待。