3、数据链路层:帧结构、MAC地址、以太网协议、CSMA/CD机制、交换机工作原理
数据链路层,说白了就是给物理层传输的原始比特流「套上缰绳」。我刚开始接触网络时,总觉得这层就是简单封装一下数据,后来踩过几次坑才明白——这一层要是没搞好,上层再牛也白搭。
3.1 以太网帧结构——数据怎么穿衣服
以太网帧,你可以想象成一个快递包裹。它得有收件人地址、寄件人地址,还得告诉快递员里面装的是什么。我习惯把帧结构拆成三块来看:头部、数据、尾部。
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 前导码 | 7 | 同步时钟用,实际工作中我们一般不关心它 |
| 帧起始定界符 | 1 | 告诉接收端:真正的帧要开始了 |
| 目的MAC地址 | 6 | 谁收这个包 |
| 源MAC地址 | 6 | 谁发的这个包 |
| 类型/长度 | 2 | 标识上层协议(比如0x0800就是IP) |
| 数据 | 46~1500 | 实际要传的内容,不够46字节要填充 |
| 帧校验序列 | 4 | CRC校验,检查数据有没有传错 |
这里有个坑,我当年调试一个嵌入式设备时遇到过——数据字段最小46字节。如果你上层传下来的数据只有10个字节,底层会自动填充到46字节。接收端怎么知道哪些是有效数据?嗯,上层协议头里会标明长度,所以别担心。
核心要点:以太网帧最小64字节(不含前导码),最大1518字节。这个限制跟后面的CSMA/CD机制有直接关系。
3.2 MAC地址——设备的身份证
MAC地址是48位的,通常写成六组十六进制数,比如 00:1A:2B:3C:4D:5E。前24位是厂商代码,后24位是设备序列号。你想想看,全球那么多网卡,理论上每个MAC地址都是唯一的。
不过,我建议你别太迷信MAC地址的唯一性。为什么?因为很多虚拟机和软网卡可以随意修改MAC地址。我在做网络攻防实验时,就经常需要伪造MAC地址来绕过某些访问控制。
MAC地址有三种类型:
- 单播地址:第一个字节最低位为0,发给单个设备
- 多播地址:第一个字节最低位为1,发给一组设备
- 广播地址:全F,即
FF:FF:FF:FF:FF:FF,发给所有设备
小技巧:抓包时看到目的MAC是全F,那一定是广播帧。ARP请求就是典型的广播帧——「谁有192.168.1.1的MAC地址?请告诉我!」
3.3 以太网协议——不只是封装那么简单
以太网协议其实是一套规则,规定了怎么封装、怎么寻址、怎么检测错误。我个人觉得,理解以太网协议的关键在于理解它的「无连接」特性——发出去就不管了,不保证对方一定能收到。
常见的以太网类型字段:
0x0800:IPv4协议0x0806:ARP协议0x8100:VLAN标签(802.1Q)0x86DD:IPv6协议
我记得有一次排查网络不通的问题,抓包发现类型字段写的是 0x0800,但上层解析程序却按 0x8100 去解析,结果数据全乱了。嗯,这种低级错误在开发中其实挺常见的。
3.4 CSMA/CD机制——多人说话怎么不打架
CSMA/CD,全称是「载波监听多路访问/冲突检测」。说白了就是:说话前先听听有没有人在说,如果大家都在说,那就等一会儿再说。
它的工作流程是这样的:
- 先听后说:设备要发送数据前,先监听信道是否空闲
- 边说边听:发送数据的同时,继续监听信道
- 冲突检测:如果检测到冲突,立即停止发送
- 随机退避:等待一个随机时间后,重新尝试
我曾经在实验室用集线器搭过一个网络,三台电脑同时发大文件,结果网络直接瘫痪了。为什么?因为集线器是共享带宽的,所有设备都在同一个冲突域里。后来换成交换机,问题就解决了。
注意:现在的全双工以太网(交换机组网)已经不需要CSMA/CD了。因为每个端口独享带宽,不存在冲突问题。但半双工模式下(比如早期的10Mbps以太网),CSMA/CD仍然是核心机制。
这里有个关键参数——冲突窗口。以太网规定,一个帧的最小长度是64字节,就是为了保证在发送完之前,如果发生冲突,发送端能检测到。你想想看,如果帧太短,发完了冲突信号才传回来,那就检测不到了。
3.5 交换机工作原理——智能转发不是梦
交换机比集线器聪明多了。它会学习、会记忆、会精确转发。我习惯把交换机的工作分成三步:
3.5.1 MAC地址学习
交换机内部维护一张MAC地址表。当某个端口收到数据帧时,它会记录源MAC地址和端口的对应关系。比如,端口1收到一个源MAC为 00:11:22:33:44:55 的帧,交换机就知道:这个MAC在端口1上。
3.5.2 帧转发决策
收到一个帧后,交换机会查MAC地址表:
- 如果目的MAC在表中,就只转发到对应端口(单播转发)
- 如果目的MAC不在表中,就广播到所有端口(除了接收端口)
- 如果目的MAC是广播地址,也广播到所有端口
3.5.3 环路避免
这个我得多说两句。如果网络中有环路,广播帧会在交换机之间无限循环,造成广播风暴。解决办法是STP(生成树协议),它会逻辑上阻断某些端口,打破环路。
实战经验:有一次客户反映网络时通时断,我登录交换机一看,MAC地址表在疯狂抖动——同一个MAC地址在不同端口之间跳来跳去。这就是典型的环路问题。启用STP后,网络立刻稳定了。
交换机的转发方式主要有三种:
| 转发方式 | 延迟 | 错误检测 | 适用场景 |
|---|---|---|---|
| 直通转发 | 低 | 无 | 对延迟敏感的环境 |
| 存储转发 | 高 | 完整CRC校验 | 对可靠性要求高的环境 |
| 无碎片转发 | 中 | 检查前64字节 | 兼顾速度和可靠性 |
我个人习惯在生产环境中用存储转发。虽然延迟大一点,但能过滤掉错误帧,省得后面排查问题头疼。
数据链路层的内容就这些。帧结构是基础,MAC地址是标识,以太网协议是规则,CSMA/CD是冲突处理机制,交换机是核心设备。把这五块吃透了,数据链路层就算入门了。