跳到主内容

LYRA

Lyra 正在加载

交换机笔记(一)

网络技术鬼鬼

这篇笔记从以太网的起源讲起,记录帧格式、CSMA/CD、冲突域这些底层概念,最后落到交换机最核心的工作方式:学习、转发、过滤、泛洪。CSMA/CD 和集线器在今天的网络里已经见不到了,但它们是理解“交换机为什么长成这样”的最好入口,所以内容保留,过时的地方我都单独做了标注。

一、以太网简史

1973 年,施乐帕洛阿尔托研究中心(Xerox PARC)的 Robert Metcalfe 和 David Boggs 发明了以太网,实验速率 2.94 Mbps。Metcalfe 用“以太(Ether)“命名,借的是 19 世纪物理学里那个假想的光传播介质——电磁波的”以太“当时刚被迈克尔逊-莫雷实验证伪不久,这个名字带着一点恶作剧的味道。

1980 年,DEC、Intel、Xerox 三家公司联合发布了 DIX 标准,1982 年的 V2.0 版就是后来所说的 Ethernet II。1983 年,IEEE 以其为基础制定了 IEEE 802.3 标准(10BASE5,粗同轴电缆),以太网从此成为开放标准。之后的演进主线是速率不断提升:

时间 标准 名称 速率
1983 802.3 10BASE5 10 Mbps
1990 802.3i 10BASE-T(双绞线) 10 Mbps
1995 802.3u 100BASE-TX(快速以太网) 100 Mbps
1998 802.3z 1000BASE-SX/LX(千兆光纤) 1 Gbps
1999 802.3ab 1000BASE-T(千兆双绞线) 1 Gbps
2002 802.3ae 万兆以太网 10 Gbps
2010 802.3ba 40G / 100G 以太网 40 / 100 Gbps

IEEE 会定期把零散增补合并进一个合订本,目前的合订本是 802.3-2018。两个时间点值得记住:1995 年快速以太网是交换式网络开始普及的分水岭;2002 年的万兆标准干脆删掉了半双工模式,CSMA/CD 在标准里就此退场。

注(2026 年补充):现行合订本已更新为 802.3-2022,速率档位也继续扩展到了 800G(802.3df)。

二、以太网帧格式

日常抓包看到的几乎都是 Ethernet II 帧,结构如下:

| 前导码 7B | SFD 1B | 目的MAC 6B | 源MAC 6B | Type 2B | 数据 46~1500B | FCS 4B |
  • 前导码 + SFD:共 8 字节,用于接收方时钟同步和帧定界,不算在帧长里。前导码是 7 字节交替的 1010,SFD(帧起始定界符)是 1 字节的 10101011。
  • 目的 MAC / 源 MAC:各 6 字节。
  • Type:2 字节,标识上层协议,如 0x0800 是 IPv4,0x0806 是 ARP,0x86DD 是 IPv6。
  • 数据:46 到 1500 字节。不足 46 字节要填充(Padding),1500 字节就是常说的 MTU
  • FCS:4 字节 CRC-32 校验,接收方校验失败直接丢弃,数据链路层不负责重传。

帧长最小 64 字节(从目的 MAC 算到 FCS),最大 1518 字节。最小帧长不是随便定的,它和 CSMA/CD 的冲突检测机制强相关,后面讲。如果帧里打了 802.1Q 的 VLAN Tag(下一篇细讲),帧长多出 4 字节,最大变成 1522 字节。

Type 字段与 802.3 的 Length 字段共用同一个位置:IEEE 802.3 原始格式把这个字段定义为“长度”。区分的办法是数值——小于等于 1500(0x05DC)按长度解释,大于等于 1536(0x0600)按类型解释,中间那段没有定义。如今 Ethernet II 格式一统天下,纯 802.3 格式基本只在 STP BPDU 这类二层协议报文里还能看到。

Ethernet II 帧格式

MAC 地址

MAC 地址 48 位,前 24 位是 OUI(组织唯一标识符,IEEE 分配给厂商),后 24 位由厂商自行分配。第一个字节的最低位是 I/G 位:0 表示单播,1 表示组播;次低位是 U/L 位:0 表示全球统一管理,1 表示本地分配(虚拟机随机生成的 MAC 就是这类,常见 02 开头)。

  • 广播地址:FF:FF:FF:FF:FF:FF
  • 常见组播:IPv4 组播 MAC 以 01-00-5E 开头,STP 的 BPDU 发往 01-80-C2-00-00-00

三、共享式以太网与 CSMA/CD

1. 集线器:一个“假装是星形的总线”

最早的以太网是真总线——所有主机挂在一根同轴电缆上。后来布线改成星形,中心设备是集线器(Hub)。Hub 是物理层设备,不识别任何帧:它从一个端口收到比特流,整形放大后从其余所有端口转发出去。布线变成了星形,逻辑上还是那根总线,任何时刻只允许一台主机发送,两台同时发就会冲突。

一个 Hub 的所有端口处于同一个冲突域。冲突域越大,主机越多,冲突越频繁,有效带宽越低。

过时结论:「5-4-3 规则」——老教材要求共享式以太网最多 5 个网段、4 个中继器(Hub)、其中 3 个网段可以挂主机。这条规则是为了保证冲突信号能在一个 slot time 内传遍全网。交换式网络里每个端口独立成域,5-4-3 规则已经彻底失效,但它是理解“冲突检测为什么限制网络规模”的经典例子。

2. CSMA/CD 的工作过程

共享介质上的发送规则是 CSMA/CD(Carrier Sense Multiple Access with Collision Detection,载波监听多路访问/冲突检测)

  1. 先听后说:想发送先监听信道,信道空闲并且持续空闲 96 比特时间(帧间隙 IFG)才能发。
  2. 边发边听:发送的同时继续监听,一旦发现自己发出去的和线上读到的不一致,说明发生了冲突。
  3. 冲突处理:立即停止发送数据,改发 32 比特的拥塞信号(Jam),确保所有站点都感知到这次冲突。
  4. 退避重传:随机等待一段时间后再试。等待时间用截断二进制指数退避算法计算。

退避算法:第 n 次冲突后,从 0 到 2ᵏ−1 之间随机取一个整数 r(k 取 n 和 10 的较小值),等待 r 个 slot time。slot time 是 512 比特时间,10 Mbps 下为 51.2 μs。同一帧冲突 16 次仍发不出去,网卡放弃并向上层报错。

最小帧长 64 字节正是 slot time 的产物:发送方只有在还没发完的时候才能检测到冲突,所以必须保证“发完一帧的时间 ≥ 冲突信号从最远端往返的时间”。802.3 把最大网络直径的往返时延定进 512 比特时间,帧长也就不能短于 512 比特。

过时结论:「CSMA/CD 是以太网的核心机制」。在共享式以太网时代这是对的;今天的交换式以太网全是点对点全双工链路,物理上不存在冲突,CSMA/CD 已经实质退役。千兆标准(802.3z)曾为了兼容半双工把 slot time 扩展到 4096 比特时间,还引入了载波扩展和帧突发机制——这些只活在纸上,实际千兆部署没人用半双工。2002 年万兆标准起,半双工模式直接从标准里删除了。

四、从网桥到交换机

**网桥(Bridge)**是最早的二层设备,IEEE 802.1D 定义。它通常只有两个端口,能把一个冲突域切成两个:A 侧主机互发流量不会跑到 B 侧去。网桥工作在数据链路层,能看懂帧,按 MAC 地址决定转发还是不转发。

交换机(Switch)可以理解为多端口、硬件加速的网桥。早期网桥用软件查表,慢;交换机用 ASIC 芯片转发,可以做到所有端口同时满速收发(线速)。关键变化有两个:

  • 每个端口是一个独立的冲突域。端口下如果只挂一台主机(微分段),冲突彻底消失,全双工成为可能。
  • 默认情况下所有端口在同一个广播域。交换机能隔离冲突,但隔离不了广播——这是下一篇 VLAN 要解决的问题。

集线器与交换机的冲突域对比

五、交换机如何学习和转发

交换机的全部工作围绕一张 MAC 地址表展开,表项的核心内容是“MAC 地址 → 端口”的映射(实际还有 VLAN,下一篇讲)。对每一个收到的帧,交换机做两件事:先看源地址学习,再查目的地址决定动作

1. 学习

收到帧后,交换机读取源 MAC 地址,把“源 MAC 在入端口上”这条记录写进表里。已存在的表项会刷新计时器。

动态表项有老化时间,华为和思科设备默认都是 300 秒。300 秒内没再收到该主机发出的帧,表项删除。老化机制是必需的:主机会移动、会下线,表项不能永久有效。

2. 转发决策

再读目的 MAC 地址,查表:

查表结果 动作 说明
命中,出端口 ≠ 入端口 转发(Forward) 只从命中的那个端口发出去
命中,出端口 = 入端口 过滤(Filter/Discard) 帧自己绕回来了,丢弃即可
未命中 泛洪(Flood) 除入端口外所有端口各发一份
广播 / 未知组播 泛洪 同上

第三种情况叫未知单播泛洪:表里查不到这个目的 MAC,只能“广播式”地找。等目的主机回包,交换机就学到了它的位置,后续帧转为精确转发。广播帧(如 ARP 请求)永远泛洪。没有开启 IGMP Snooping 时,组播帧也按泛洪处理。

交换机 MAC 学习与转发决策

3. 两个和这张表有关的问题

  • MAC 表震荡:如果网络存在环路,同一个主机的帧会从不同端口反复进入交换机,同一个 MAC 的表项在几个端口之间来回跳。这是环路的典型症状,第三篇讲生成树时会再遇到。
  • MAC 泛洪攻击:攻击者伪造大量不同源 MAC 的帧把 MAC 表打满,交换机在表满之后对所有未知单播都只能泛洪,相当于退化成 Hub,嗅探变得容易。对应的防护是端口安全(限制单端口学习的 MAC 数量)。

六、三种帧转发方式

交换机转发帧有三种典型方式,区别在于“收到多少就开始发”:

方式 行为 特点
存储转发(Store-and-Forward) 收完整帧、校验 CRC 后再转发 延迟最大,但不传坏帧;支持不同速率端口间转发;当前主流
直通式(Cut-Through) 收到前 6 字节(目的 MAC)就查表转发 延迟最低(微秒级),但会把 CRC 错误的帧也发出去
碎片隔离(Fragment-Free) 收到前 64 字节再转发 折中方案;冲突碎片一定小于 64 字节,能被过滤掉

数据中心低时延场景(如金融交易网络)会特意选用支持直通转发的交换机;园区和通用场景默认存储转发。

七、全双工与自协商

交换式网络里,交换机和主机之间是点对点链路,发送和接收各走一对线,双方可以同时收发,这叫全双工。全双工链路上物理层不存在冲突,CSMA/CD 自动关闭。

速率和双工模式靠**自协商(Auto-Negotiation)**确定:链路两端交换各自的能力页,取双方都支持的最高组合。

一个经典故障是双工不匹配:一端手工锁定“全双工 100M”,另一端保持自协商。锁定端不参与协商,自协商端按规则退到半双工。链路能通,但半双工端认为有冲突很正常,全双工端从不检测冲突——结果是大量晚碰撞、CRC 错误,吞吐暴跌,时通时断。排查时值得先看端口计数器。

过时结论:「两端都手工锁定速率和双工最稳定」。这条经验出自 10/100M 时代,当时不同厂商的自协商实现互操作确实有坑。但 1000BASE-T 标准(802.3ab)把自协商写成了强制要求——千兆电口要靠协商确定主从时钟关系,锁死速率反而可能起不来或者埋下双工不匹配的隐患。现在的建议是保持自协商。

八、小结

  • 以太网从 1983 年的 802.3(10 Mbps)演进到今天的 400G,帧格式基本没变,这是它能统治局域网五十年的原因之一。
  • Ethernet II 帧:目的 MAC、源 MAC、Type、46~1500 字节数据、FCS;最小 64 字节来自 CSMA/CD 的 slot time 约束。
  • Hub 是物理层设备,整台 Hub 一个冲突域;交换机每个端口一个冲突域,默认所有端口一个广播域。
  • 交换机的核心动作是:按源 MAC 学习、按目的 MAC 转发或过滤、查不到就泛洪;动态表项默认老化 300 秒。
  • 全双工点对点链路没有冲突,CSMA/CD 只在半双工共享介质上有意义,而半双工已经从万兆起的标准里消失了。

版权许可

本文采用 CC BY-SA 4.0 协议授权

保留署名与相同方式共享即可转载、引用或再创作。转载时请注明出处并附上本文链接。

评论

留言系统基于 Disqus,发言前可查看 评论规则。部分网络环境可能无法正常加载。