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,全称是「载波监听多路访问/冲突检测」。说白了就是:说话前先听听有没有人在说,如果大家都在说,那就等一会儿再说。

它的工作流程是这样的:

  1. 先听后说:设备要发送数据前,先监听信道是否空闲
  2. 边说边听:发送数据的同时,继续监听信道
  3. 冲突检测:如果检测到冲突,立即停止发送
  4. 随机退避:等待一个随机时间后,重新尝试

我曾经在实验室用集线器搭过一个网络,三台电脑同时发大文件,结果网络直接瘫痪了。为什么?因为集线器是共享带宽的,所有设备都在同一个冲突域里。后来换成交换机,问题就解决了。

注意:现在的全双工以太网(交换机组网)已经不需要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 交换机工作原理 前导码 MAC地址 类型/长度 FCS校验 单播/多播/广播 OUI厂商代码 EtherType 无连接特性 先听后说 冲突检测 随机退避 MAC地址学习 帧转发决策 环路避免(STP)

数据链路层的内容就这些。帧结构是基础,MAC地址是标识,以太网协议是规则,CSMA/CD是冲突处理机制,交换机是核心设备。把这五块吃透了,数据链路层就算入门了。

可可精品资料库