交换机 Switch
第 4 章讲完了数据在网络上怎么流动,现在轮到回答一个更基础的问题:路上那些替我们转发的设备,到底是怎么工作的。这一节的主角是交换机——它是局域网的心脏,终结了集线器时代"一人说话、全员收听"的混乱。交换机靠一张自己学会的 MAC 地址表,只把数据帧送给该收到的人。这一节用"收发室 + 快递分拣"把 MAC 地址表、自学习、泛洪、全双工、环路、VLAN 全部讲透。
想象一个没有内网、全靠喊的办公室。
老张要给隔壁桌的小李递一份文件。老办法是站起来朝整个办公室喊一嗓子:"小李,接一下!"全办公室二十多个人都听见了,但只有小李有反应——其他人都被白白打断了一次。这就是集线器时代:数据一进来,全员收听,谁该要谁自己判断。
后来公司在大厅装了一个收发室。老张把文件交给收发室,收发室的小本子上记着"小李坐 3 号桌",于是只走到 3 号桌把文件递给他——其他人该干嘛干嘛,没人被打断。
这个"收发室"就是交换机(Switch)。它干的事一句话:看着收件人是谁,只把文件送给该收到的那个人。这一节要讲的,就是这本"小本子"怎么来的、记了什么、记错了怎么办——以及为什么"多加几根线"和"把一间屋隔成几间",会引出生成树(STP)和 VLAN 这两座大山。
先把这一节的术语翻译成人话
这一节和 IP 那节一样"术语密集",但好消息是:交换机涉及的每个概念,几乎都能在生活里找到一个一一对应的东西。先过一遍这张表,读完全文再回来重读一次,效果最好。
| 术语 | 换成大白话 | 生活里对应的东西 |
|---|---|---|
| 交换机(Switch,二层设备,靠 MAC 转发) | 说白了就是"认得人的收发室" | 收发室:知道每件文件该递给谁 |
| 集线器(Hub,物理层设备,原样广播) | 说白了就是"只喊不认人的大喇叭" | 对着办公室喊一嗓子,全员听见 |
| 数据帧(Frame,链路层的数据包) | 说白了就是"带信封的快递" | 快递:面单 + 纸箱 + 内容(回指 § 1.5) |
| MAC 地址(48 位,网卡的出厂身份证号) | 说白了就是"每张网卡的固定名字" | 身份证号(回指 § 1.3) |
| MAC 地址表(也叫 CAM 表) | 说白了就是"收发室的小本子" | 本子上记着"小李 → 3 号桌" |
| 自学习(Self-learning,表自己长出来) | 说白了就是"见过一次就记住" | 小区门房见过你一次,就记住你住哪栋 |
| 泛洪(Flooding,所有口都转发) | 说白了就是"不知道给谁,只好挨家挨户问" | 新快递员第一次送件,挨户敲门确认 |
| 老化(Aging,表条目过期清除) | 说白了就是"太久没出现,就忘掉" | 门房的登记本定期清理,住户搬走了就划掉 |
| 全双工(Full-duplex,同时收和发) | 说白了就是"能一边说一边听" | 打电话:两边可以同时说话 |
| 半双工(Half-duplex,同一时刻只能一边说) | 说白了就是"你一句我一句" | 对讲机:说话要按住,说完松开才能听 |
| 冲突域(Collision Domain,说话会撞车的范围) | 说白了就是"同时说话会打架的区域" | 一个会议室里两人同时发言就听不清 |
| 广播域(Broadcast Domain,能收到同一广播的范围) | 说白了就是"大喇叭能盖到的范围" | 学校广播站:只覆盖本校操场 |
| VLAN(虚拟局域网,IEEE 802.1Q) | 说白了就是"一台交换机当几台用" | 一栋楼隔成几间互不相通的办公室 |
| 生成树(STP,IEEE 802.1D) | 说白了就是"自动砍掉多余的线路,只留一条主路" | 多条水管只开一条,其余当备用阀门 |
| 广播风暴(Broadcast Storm) | 说白了就是"广播无限循环,把网堵死" | 两面镜子对放,光影无限反射 |
这一节可以用一句话串起来:交换机是"认得人的收发室",靠一张自己学会的 MAC 地址表精确转发;认不得的时候就泛洪(挨家挨户问);为了不出乱子,它还要定时忘(老化)、自动砍路(生成树)、把一间屋隔成几间(VLAN)。其余全是细节。
集线器时代:一人说话,全员收听
要理解交换机解决了什么,得先看看它之前的世界。最早的以太网(以太网标准是 IEEE 802.3,1980 年代由 IEEE 标准化)用一根同轴电缆把所有电脑串在一起——本质上就是一条公共的线。后来电缆换成了更方便的集线器(Hub),但本质没变:所有设备仍然共享同一条"总线",信号一到,全员都听。
集线器是个纯粹的物理层设备(这在 § 2.1 讲过):它从任何一个口收到电信号,就原样复制到其他所有口,完全不看内容、不认地址。打个比方,它就像会议室里的传话员——不管你让传话给谁,他都朝整个房间喊一遍。
这种"全员收听"带来三个问题,一个比一个麻烦:
- 带宽被所有人瓜分一台 10Mbps 的集线器接 5 台电脑,任意时刻只有一台能发数据,大家轮流用这 10M。换成大白话:一条马路 5 辆车共用,一辆走的时候其他四辆只能等。
- 两人同时说话就"撞车"如果两台电脑同时把信号发到公共线上,信号会互相干扰、全部作废。以太网为此发明了一套规矩叫 CSMA/CD(载波监听多路访问 / 冲突检测)——说白了就是"先听有没有人说话,没人说才开口;万一撞了,大家都退后,各自随机等一会儿再重说"。这像极了开会抢话:撞了,两人都闭嘴,心里默数几个数再试。撞车本身浪费带宽,人越多越严重。
- 同一时刻只能一方说话共享一条线意味着半双工——好比对讲机:说话要按住按钮,说完松开才能听对方。你不可能一边按着按钮一边听对方说。
这三个问题合起来,就定义了"冲突域"这个词:集线器所有端口在同一个冲突域里——任何两台机器同时发数据就会撞车,全网络都受影响。设备越多,每人分到的带宽越少、撞车越频繁,网络就越慢。
1990 年代,随着芯片便宜下来,一种能"认出该给谁"的设备开始普及——这就是交换机。它一出来,集线器几乎被扫进历史垃圾桶:今天你基本买不到新的集线器了,但理解它的"笨",恰好是理解交换机"聪明在哪"的起点。
交换机凭什么聪明:一张自己学会的 MAC 地址表
交换机(Switch)是二层设备——工作在数据链路层(§ 2.1 讲过,二层的数据单元叫帧,寻址靠 MAC 地址)。它不像集线器那样"闭着眼睛喊",而是先看一眼帧头,认认收件人,再决定把帧送到哪个口。
它认人的依据是 MAC 地址:48 位、写在每张网卡里的"身份证号"。在往下走之前,先把 MAC 地址的三种"身份"认全(§ 1.3 讲过 OUI 厂商前缀和广播地址,这里补上分类的依据):
| MAC 地址类型 | 怎么认出来 | 帧发给谁 | 交换机怎么处理 |
|---|---|---|---|
| 单播(Unicast) | 第 1 字节的最低位是 0——说白了就是第一个十六进制字符是偶数(如 a4:5e:60:… 的 a4) | 发给某一个具体网卡 | 查表:认得出就精确转发,认不出就泛洪 |
| 组播(Multicast) | 第 1 字节的最低位是 1(如 IPv4 组播常用的 01:00:5e:… 开头) | 发给"订阅了某个组"的一群网卡 | 按组播表转发,没人订阅就不发 |
| 广播(Broadcast) | 全部是 1:ff:ff:ff:ff:ff:ff | 发给本网段所有网卡 | 永远泛洪——这是规矩 |
每个以太网帧的头部都写着源 MAC(谁发的)和目的 MAC(发给谁)。交换机要做的全部工作,就是围绕这两个字段展开。那它怎么知道"哪个 MAC 在哪个口"?答案是——它不知道,它学。
这台设备内部维护着一张 MAC 地址表(也叫 CAM 表,Content-Addressable Memory,"内容寻址存储器"——本质上是查表快得离谱的专用硬件,这名字后面还会再提),里面一行一行记着"某个 MAC 地址 ↔ 从哪个口能到达它",每条记录还带着一个时间戳。这张表完全不用人配置,是交换机自己从流动的帧里学出来的,这叫自学习(Self-learning)。
自学习的规则只有一条,简单到不像真的:每收到一个帧,先看它的源 MAC 和进来的口,把"这个 MAC 从这个口能到达"记进表里。只要网络里有设备在说话,表就会自己越记越全。
【交换机自学习:一个例子走一遍】
假设交换机有 4 个口:P1 P2 P3 P4
一开始 MAC 表是空的:
┌──────────────────────┬──────┬──────┐
│ MAC 地址 │ 端口 │ 计时 │
├──────────────────────┼──────┼──────┤
│ (空) │ │ │
└──────────────────────┴──────┴──────┘
现在 PC-A(MAC 是 AA:AA:AA:AA:AA:AA)从 P1 口
发来一个帧,目的写的是 PC-C(CC:CC:CC:CC:CC:CC):
交换机做的第一件事:学习源 MAC
→ 在表里记一笔:AA:AA:AA:AA:AA:AA → P1
→ "这台机器我见过了,它在 1 号口。"
┌──────────────────────┬──────┬──────┐
│ MAC 地址 │ 端口 │ 计时 │
├──────────────────────┼──────┼──────┤
│ AA:AA:AA:AA:AA:AA │ P1 │ 开始 │
└──────────────────────┴──────┴──────┘
然后查目的 MAC:CC:CC:CC:CC:CC:CC 在表里吗?
→ 不在 → 不知道往哪送 → 只能泛洪(下一节讲)
★ 请记住这个顺序:先学源、再查目的。
这是交换机对每一个帧都要做的两个动作。
为什么"从哪进来就能学到哪"?因为以太网是"有来必有回"的世界:PC-A 和 PC-B 说话,PC-B 总会回话;回话的帧从它那个口进来,交换机就把它也记下了。两台设备只要互通过一次,交换机就同时认识它们俩了。数据流动得越热闹,这张表长得越快——这就是"自学习"三个字的全部含义。打个比方,它就像图书馆管理员不用背下所有书的位置,只要每次把还回来的书放在它原来的位置、顺手看一眼前台登记的编号,时间一长,整馆的书在哪儿他心里门儿清。
这里还有一个反直觉的事实值得记住:交换机对终端设备是"透明"的。电脑、手机根本感觉不到交换机的存在——你配置网络时填的是自己的 IP、掩码、网关(§ 3.5 讲过),没有一栏是"交换机是谁"。换成大白话,收发室不会要求你记住它的编号,你只管把文件交给它,它自己认得路。交换机干得好不好,终端完全无感知——这是它最了不起的地方,也是它最容易被忽略的原因。
泛洪:第一次见到陌生地址,为什么只能挨家挨户问
上面那个例子停在关键处:交换机查表,发现 CC:CC:CC:CC:CC:CC 不在表里。它不知道这个地址在哪个口。这时候怎么办?
答案是:除了进来的那个口,往其他所有口都复制一份发出去。这个动作有个专门的名字,叫 泛洪(Flooding)。说白了,就是"我不知道你住哪栋,只能挨家挨户敲门问"。
如果你只记住这一节的一个类比,请记住这个。
想象一个新来的快递员,第一次派件,单子上写着"幸福小区 3 号楼,收件人:王先生"。问题来了:他知道是 3 号楼,但不知道王先生住哪个单元、哪一层、哪一户。
他只能怎么办?把车停在 3 号楼楼下,挨家挨户按门铃问:"王先生在吗?"——这一问,整栋楼的人都被打扰了,但没办法:不挨家问,就永远找不到王先生。
关键来了:这一趟"挨家问"是有价值的。王先生收了件,会回一句"我就是",或者下次他要寄件时,快递员顺路记住了"王先生住 301"。从这以后,再派王先生的件,快递员直接上楼敲 301,整栋楼再也不会被打扰。
交换机一模一样:第一次发给陌生 MAC 的帧,它泛洪——所有口都发一份,让"帧"自己去找主人;收到的人一看目的 MAC 不是自己,就把它扔掉(这是每台电脑自己的过滤动作);真正的收件人收到后必然回话,回话的帧一进来,交换机就把它的 MAC 学会了。
所以泛洪不是偷懒,更不是设计缺陷——它是在"不知道答案"时唯一一种保证不会漏掉收件人的做法。代价是打扰一次所有人,收益是从此精确转发。这笔账,网络设计者觉得划算。
这里必须把"泛洪"和集线器的"广播"分清楚,这是初学者最容易混的地方:
| 集线器 | 交换机的泛洪 | |
|---|---|---|
| 什么时候"全员收到" | 永远——每个信号都复制到所有口 | 只在表里查不到目的 MAC 时——查得到就精确转发 |
| 认不认地址 | 完全不认,连看都不看 | 认;泛洪只是"查不到"时的应急 |
| 会不会"学会" | 永远不会,永远是睁眼瞎 | 会,泛洪换来对方的回话,下次就不用泛洪了 |
| 用生活话说 | 每次都朝全楼喊 | 第一次挨家问,问完记住了,以后直接敲门 |
泛洪还有一个值得注意的范围问题:它只在本地局域网内"挨家问",绝不出路由器。因为路由器的职责是连接不同网络,它不会把一个局域网里的"挨家问"传到别的网络去——这跟 § 3.5 讲的广播地址"路由器不转发"是同一个道理。
最后说明一下本站的互动实验室:目前没有专门模拟"MAC 表学习"的组件(网络篇现有的组件分别覆盖 IP 子网、TCP 握手、时延账本、HTTP 状态码这些主题,跟本节不重合),所以本节不强行加组件,就用上面这张分步图解代替动手实验——你只要自己照着画一遍"先学源、再查目的"的顺序,逻辑就通了。
四种转发决策:转发、泛洪、丢弃,一次说清
现在把交换机的决策逻辑完整收一遍。收到一个帧,查完表之后,它只会做下面四种事情之一——没有第五种。把这四种记全,交换机的行为你就掌握了八成。
| 情形 | 交换机做什么 | 换成大白话 | 生活里对应 |
|---|---|---|---|
| 目的 MAC 在表里,且对应端口不是入端口 | 精确转发:只从那个端口发出去 | "我知道他在 3 号桌,直接递过去" | 收发室认人,只送到该送的人 |
| 目的 MAC 在表里,但对应端口就是入端口 | 丢弃:这个帧不需要再发出去 | "收件人和发件人在同一侧,不用我再传" | 同屋两人传纸条,不需要收发室 |
| 目的 MAC 不在表里(未知单播) | 泛洪:除入端口外所有口各发一份 | "我不认识他,挨家挨户问一遍" | 新快递员第一次派件 |
目的 MAC 是广播地址 ff:ff:ff:ff:ff:ff 或组播地址 | 永远泛洪:这是规矩,不是查不到 | "这本来就是喊所有人的,全部广播" | 学校广播站通知:本来就该全体听见 |
前两行的区分是最容易被忽略的细节。很多人以为交换机只有"转发"和"泛洪"两种动作,忘了还有"丢弃"。当目的 MAC 和源 MAC 在同一个端口时,帧压根不需要交换机掺和——这种情况常见于"两台设备中间还夹着一个集线器或另一台交换机"的接法。丢弃不是出错,是它判断"没必要我插手"。
最后一行"广播帧永远泛洪"要单独说透:广播地址 ff:ff:ff:ff:ff:ff(§ 1.3 提过)的意思是"本网段所有机器"。发给它的帧本来就要让所有人收到,所以交换机不管表里有没有记录,一律泛洪。这就像大喇叭的通知——喇叭不会先查"哪些人报名想听",它直接全放。很多协议就是靠广播工作的,比如 ARP 问"谁是这个 IP?"、DHCP 问"有没有人给我发地址?"(这两个协议 § 3.6 会细讲)——它们都指望交换机把广播帧传到每一个角落。
把四种决策摆在一起看,你会发现交换机的全部智慧其实就一句话:"认得的精确送,不认得的问一圈,本该群发的就群发,没必要出手的就不出手。"你甚至可以把它当成交警在十字路口的四种手势来记——放行、拦住、让所有人注意、示意不用走,动作不同,但都是基于同一个"看明白再决定"的原则。
MAC 表会老:为什么不能永远记着
前面那张表里,每一条记录都带着"计时"——这一节解释为什么。
假如 MAC 表只进不出,会怎样?设备会关机、会拔线、会搬位置、会换网卡,甚至会有机器报废。如果表永远记着"某某在 P3 口",可那台机器早就搬走了,交换机就会一直把帧往错误的口送,而且永远不会自己发现。
所以交换机给每条记录加了一个保质期:从记录写入那一刻开始计时,只要这段时间内又收到这个 MAC 的帧,就把计时重置;如果一直没再出现,到期就删除这条记录。这个机制叫 MAC 表老化(Aging)。
老化时间是多久?常见默认值是几分钟的量级——300 秒(5 分钟)是很常见的默认值。注意两个词:"常见默认值"和"可配置"——不同厂商、不同型号可能不一样,管理员也可以手工调。所以别把它当成铁律背下来,记住"几分钟"这个量级就够了。
老化之后会发生什么?很简单:这条记录没了,再收到发往那个 MAC 的帧,交换机又"不认识"了,于是重新泛洪一次——对方一回话,又学会了。整个过程在用户层面完全无感,因为学习只需要一次来回。
打个比方,这就像小区门房的访客名册:住户常年出入,名字一直在本子上;可要是哪户搬走了、半年没人进出,门房就会把这一行划掉——免得哪天来个送快递的,他还照着旧本子把人往空屋里引。而"清理"用的是流水式的规矩:谁最近出现过,谁就留着;太久没出现的,自动划掉。
老化还有一层现实意义:防止表无限膨胀。一台大交换机可能接了成百上千台设备,如果历史记录全都不删,表会越撑越大,查表越来越慢。老化的另一个名字,其实就是"内存管理"。这也解释了为什么网络一断、设备一重启,表就"失忆"了——因为它本来就没打算记那么久。
全双工与无冲突:交换机比集线器快在哪
前面解决了"认得人",这一节解决"为什么快"。集线器时代有两个老大难:冲突和半双工。交换机把它们一起解决了。
先看冲突。冲突域(Collision Domain),说白了就是"同时说话会打架的范围"。集线器所有端口在同一个冲突域里——任何两台机器同时发数据就会撞车。交换机则不同:每个端口都是独立的冲突域——两个口上的设备同时各自发数据,各走各的,根本不打架。
因为不会再撞车,CSMA/CD 那套"先听后说、撞了重来"的规矩也就可以扔掉了。交换机的端口用全双工(Full-duplex)模式工作:同时收、同时发,互不干扰。换成大白话,集线器是对讲机——同一时刻只能一边说话;交换机是打电话——两边可以同时说、同时听。全双工以太网的标准是 IEEE 802.3x(1997 年,属于 IEEE 802.3 以太网家族),它干脆禁用了共享线路时代的碰撞检测。
为什么"能同时收发"能带来近乎翻倍的吞吐?想一下就明白:半双工时,一条线要么在发、要么在收;全双工时,发和收走两条独立的通道,各走各的,谁也不等谁。
再把带宽这笔账算清楚——这就是"换了交换机感觉网变快了"的根本原因:
【同一台 10M 的老设备,接 5 台电脑】
集线器(共享 10M):
任何时刻只有一台能发 → 5 台轮流用 10M
→ 平均每台只有 2M,而且发送前还要先听、
可能撞车重来,实际更慢
交换机(每口 10M,全双工):
每台电脑独占自己那个口的 10M,还能同时收发
→ 每台都是 10M,互不干扰
★ 换成大白话:
集线器 = 一条窄巷,5 辆车轮流进出
交换机 = 每家门口都通一条双向高速,
同时进出,谁也不挡谁
内部是怎么做到"同时互不干扰"的?交换机的核心是一个类似电话总机的交叉连接矩阵:它可以把 P1 和 P3 接通、同时把 P2 和 P4 接通——好几对"对话"在同一时刻并行进行,彼此完全听不见。集线器做不到这一点,因为它的本质就是一根被掰成多根的大喇叭线,任何时刻只能有一种声音。
这个特性让交换机可以做到"线速转发"——进来的帧只要能查完表,立刻原样出去,几乎不排队。而集线器天生是"一进一出全体听",根本没有"并行"这回事。一句话总结这节的差别:集线器像一条共用的窄桥,再多人也得分批过;交换机像给每家都修了一座独木桥,谁想走就走,互不干扰。
最后补一个常见疑问:既然全双工这么好,为什么还有半双工模式存在?因为要兼容老设备——某些老网卡或特定场合下只能半双工。今天的交换机和电脑网卡基本都默认全双工,你基本不用管它。
二层 vs 三层:交换机认 MAC,不懂 IP
前面一直在说"帧头、MAC 地址"——注意,从头到尾没提过 IP。这不是疏忽,是交换机的本职:交换机是二层设备,它只拆开以太网帧看一眼 MAC,根本不去看更里面的 IP 地址。
打个比方,交换机就像邮局分拣员只看信封上的收件人姓名属于哪个分拣口(MAC),至于信里写了什么、寄信人想表达什么(IP 之上的一切),他既不知道也不关心。而路由器是三层设备,它看的是信封上的"城市 / 邮编"(IP 地址),决定把信送上哪条跨城线路。
这两者的分工你在 § 1.3 已经见过一次了:IP 定"终点在哪",MAC 定"下一站交给谁"。在局域网内部,MAC 就够用了——同一个小区的邻居串门,不需要惊动"跨城分拣中心"。只有数据要出小区(跨 IP 网段),才轮到路由器出场。
| 交换机(二层) | 路由器(三层) | |
|---|---|---|
| 看哪一层的信息 | 只看以太网帧头(MAC 地址) | 看 IP 头(IP 地址) |
| 查什么表 | MAC 地址表(CAM 表) | 路由表 |
| 表怎么来的 | 自动学习(自学习 + 老化) | 静态配置 + 动态路由协议学习(§ 3.5 讲过) |
| 会改包吗 | 基本不改(VLAN 场景会加标签) | 改:TTL 减 1、重算校验、换掉 MAC 头(§ 1.3 讲过) |
| 管辖范围 | 一个局域网(广播域内) | 连接不同网络之间 |
这张表的骨架在 § 2.1 已经出现过一次,这里把它讲透。判断一台设备是"交换机思维"还是"路由器思维",就看它查的是 MAC 表还是路由表。三层交换机的存在也值得提一句:现在的交换机大多支持"三层"功能——能在配置了 IP 接口之后,像路由器一样转发跨网段流量。但它的本职、它的默认行为、它百分之九十九的工作时间,仍然是二层转发。路由器的完整故事——它怎么选路、怎么连接不同网络——是下一节 § 5.2 的主角,这里只预告这一句,不展开。
环路:多接一根线,为什么是灾难
网络管理员最怕的两样东西,一是环路,二是广播风暴——而它们往往是同一件事。
先问:为什么有人会在两台交换机之间接两根线?为了冗余——怕一根线断了断网,多接一根当备份。愿望是好的,但交换机不知道这是"备份",它只会按规矩办事,于是灾难来了。
回想前面的决策表:广播帧永远泛洪。只要网络里出现一个广播帧(ARP、DHCP 每天都在产生),它就会在环路上无限循环:
【两台交换机接了两根线(环)】
┌─────────┐
┌───────┤ 交换机A ├────────┐
│ └─────────┘ │
│ 线1 ↑ ↓ 线2 │
│ ┌─────────┐ │
└───────┤ 交换机B ├────────┘
└─────────┘
一个广播帧从 A 的口 1 进来:
① A 泛洪 → 从口 2 和口 3 出去
② 口 3 那份沿"线 2"到 B → B 又泛洪 →
从 B 的口 2(线 1)发回 A
③ A 收到后:这是广播帧,必须泛洪 → 又发出去……
于是这个帧在环里一圈一圈永远转
★ 结果:环路里的带宽被这个"幽灵帧"占满,
交换机的 CPU 被反复复制转发打满,
整个网络瘫痪——这叫【广播风暴】。
★ 为什么没人踩刹车?
因为帧(二层)没有 IP 层那种"跳数限制"(TTL)。
回指 § 1.5:IP 包有 TTL 防止在路由器之间打转;
但以太网帧的头部里根本没有这个字段 ——
所以二层环路必须靠协议来管,下一节就是。
广播风暴有多可怕?它不是"慢一点",是整片网络完全不能用——所有带宽被无效帧占满,所有交换机忙着复制转发,正常的数据根本挤不进去。就像两条相对的走廊里各挂一面镜子:光在里面无限反射,谁站在走廊里都会被晃瞎。更麻烦的是,广播风暴一旦起来,不会自己停下来——只要环还在,帧就一直转,除非有人拔线。
更隐蔽的是,环路还会让单播帧也出问题:同一个帧的多个副本从不同路线到达同一台机器,会导致这台机器的 MAC 表在两条记录之间反复横跳(今天学成 P1、明天学成 P3),转发决策变得一团乱。这有个专门的名字叫 MAC 地址抖动。说白了,收发室的小本子上"小李"这一行今天记 3 号桌、明天记 5 号桌,收发员自己都糊涂了。
注意一个反直觉的事实:环路往往是"好心"造成的。没有人会故意接一个环,都是为了可靠性多加了一根线。问题不在"多一根线",在"多出来这根线没有协议去管它"。而管它的协议,就是下一节的生成树。
生成树 STP:自动砍掉多余的路
STP(Spanning Tree Protocol,生成树协议),标准是 IEEE 802.1D(1990 年标准化,算法由 Radia Perlman 于 1985 年设计)。它的目标一句话:物理上可以有冗余的线,但逻辑上只允许一条路活着。
先理解"生成树"这三个字。"树"在计算机里是一种结构:没有环、每一层都只有一个"父节点"。STP 做的事,就是在一张有环的物理网里,选出一棵没有环的逻辑树——多余的那些连接,让交换机把它们的端口阻塞(Blocking):平时不转发任何帧,只当"备胎"静静听着;一旦主路断了,马上启用。
那"砍"哪条、留哪条?STP 有一套完全自动的选举过程,核心三步:
- 第一步:选"根桥"(Root Bridge)所有交换机互相商量,选出一个"老大"。打个比方,就像一家公司只能有一个总经理——树的根只有一个,不然又成环了。根桥通常就是优先级数字最小、或者 MAC 地址最小的那台。
- 第二步:每台交换机算"到根桥的最短距离"通过一条条链路的"代价"(cost)相加,算出自己到根桥哪条路最近。
- 第三步:不是最短路径的端口,就阻塞最后保证:从任何一台交换机出发,到根桥只有一条活路;整张网从根桥往下展开成严格的树形——环没了。
交换机之间是怎么"商量"的?它们互相发送一种叫 BPDU(Bridge Protocol Data Unit,桥协议数据单元)的消息,说白了就是"报数":每台交换机定期向邻居喊:"我是谁、我离根桥几步、我优先级多少",邻居听完更新自己的判断。这个过程完全是自动的,管理员要做的只是插线——这也是 STP 至今仍在用的最大原因。
STP 有一个著名的缺点:慢。传统 STP 从"网络拓扑变了"到"重新收敛出一棵新树",要等几十秒量级的时间(因为 BPDU 的计时器很长)。几十秒听着不长,但对一个正在运行的网络来说,意味着"断网半分钟"。于是有了改进版:
| 协议 | 标准 | 改进 | 换成大白话 |
|---|---|---|---|
| STP | IEEE 802.1D | 基础版,能防环,收敛慢 | 保安发现状况后,要先挨个打电话请示一圈 |
| RSTP(快速生成树) | IEEE 802.1w | 收敛提速到秒级 | 保安直接按预案处置,不用层层请示 |
| MSTP(多生成树) | IEEE 802.1s | 按 VLAN 分别跑树 | 每间办公室各有各的主路规划 |
今天的新网络几乎都用 RSTP(802.1w)起步,传统 STP 更多是历史名词——但"冗余 + 自动防环"这个思路,是一切现代数据中心网络设计的地基。至于具体交换机厂商怎么实现、默认参数多少,各厂不同,这里不展开——你只需要记住:物理上多接线保证不死机,协议上自动砍环保证不瘫痪,这两件事可以同时做到。
最后澄清一个常见误解:STP 不是"检测到环路再修复",而是"从开机起就假设有环,永远只放行一棵树"。它不靠事后补救,靠事前约束——这正是它与"发现风暴再断电"那种救火式方案的本质区别。
再补一个术语:"收敛"(Convergence)。说白了就是"大家重新商量出统一意见需要多久"——从拓扑变化那一刻起,到所有交换机都认可同一棵树为止,这段等待时间就叫收敛时间。收敛期间网络是断的,所以收敛越快,断网越短。这也是为什么 RSTP 把传统 STP 的"漫长等待"压缩到秒级之后,几乎成了新网络的默认选择。
VLAN:一个交换机当多个用
再回到广播域。前面说过:交换机不隔离广播域——一台交换机上所有设备,都能收到同一个广播帧。这在网络不大的时候无所谓,网络一大就成问题。
问题一:吵。200 台设备在一个广播域里,谁喊一嗓子所有人都要听;广播越多,大家的 CPU 越忙。问题二:不安全。财务部的电脑和访客的设备在同一台交换机上——广播人人听得到,ARP 一问,地址全暴露;更要命的是,同广播域的机器天然能直接互相访问(回指 § 3.5:同一网络内通信不经过路由器)。
最直接的办法:买两台交换机,物理隔离。但贵、占地方、线还多。于是聪明人想:能不能把一台交换机"从逻辑上切成两台"?能——这就是 VLAN(Virtual Local Area Network,虚拟局域网),标准是 IEEE 802.1Q。
VLAN 的原理一句话:给每个帧贴上"我属于哪个虚拟网"的标签,交换机按标签决定哪些帧能互相看见。同一台物理交换机上,贴上"财务部"标签的帧只发给贴同款标签的端口,跟"运维部"的帧互不往来——就像一栋楼被隔成两间互不相通的办公室。
IEEE 802.1Q 的具体做法:在以太网帧头里插入一个 4 字节的 VLAN 标签(其中 12 位是 VLAN ID,范围 1–4094)。插了标签的帧,交换机就认得它的归属。
【加了 802.1Q 标签的以太网帧】
原来的帧: [目的MAC][源MAC][类型][数据][校验]
加标签后: [目的MAC][源MAC][VLAN标签(4B)][类型][数据][校验]
│
└─ 12 位 VLAN ID:这帧属于哪个虚拟网
标签里还有优先级位(QoS 用)
★ 换成大白话:
原来的信封上只有收件人;
802.1Q 是再贴一张"楼层贴纸"——
收件人决定"给谁",贴纸决定"这封信只能在几楼转"。
VLAN 带来的好处,用一张表就能说清:
| 需求 | 没有 VLAN | 有 VLAN |
|---|---|---|
| 财务部和运维部要隔开 | 只能再买一台交换机,物理分家 | 同一台设备上划两个 VLAN,逻辑分家 |
| 广播会不会吵到所有人 | 一个广播全楼都听 | 广播只在同 VLAN 内传播,其他 VLAN 听不见 |
| 两个部门要通信 | 直接能通信(但也不安全) | 必须经过三层设备(路由器 / 三层交换机)审批放行 |
特别注意最后一行:VLAN 把"不能直接通信"也一起隔离了。不同 VLAN 之间默认是不能通信的——想通信,必须经过路由器或三层交换机这种"三层关卡"。这反而成了安全设计:你要跨部门访问,就得过一道明面上的检查。打个比方,写字楼里一层租给 A 公司、一层租给 B 公司——电梯门禁就是那台三层设备:平时各在各层,要串门必须刷卡登记。
到今天,VLAN 已经是所有正经企业网络的标配:访客 WiFi 一个 VLAN、办公电脑一个 VLAN、打印机一个 VLAN、服务器一个 VLAN——每一层之间的访问都清清楚楚。你家路由器后台那个"访客网络"开关,本质上就是 VLAN 的民用版。
还有一个经常被问的问题:VLAN 是画在一台交换机上的,那两台交换机之间的 VLAN 怎么办?比如财务部有 20 台电脑,10 台接在交换机 A 上、10 台接在交换机 B 上,但财务部要的是一个"完整的一间屋"。答案还是 802.1Q:两台交换机之间的那根连接(叫 Trunk 口,中文常译"干线口")负责传递所有 VLAN 的帧——帧上带着标签,交换机 A 一看标签就知道这帧该进"财务部"的哪些口,交换机 B 同样认标签,于是两个物理交换机上的"财务部"被标签连成了一个逻辑整体。这就像两栋楼之间架了一条通道,门禁卡上写着"几号楼几层",两边的保安都认这张卡。
三兄弟对比表:集线器 / 交换机 / 路由器
学了这么多,是时候把三个最容易混的设备摆在一起。它们恰好代表"网络设备的三级进化":大喇叭(集线器)→ 收发室(交换机)→ 跨城分拣中心(路由器)。
| 集线器 Hub | 交换机 Switch | 路由器 Router | |
|---|---|---|---|
| 工作在哪一层 | 第一层 · 物理层 | 第二层 · 数据链路层 | 第三层 · 网络层 |
| 看什么信息 | 什么都不看,原样复制电信号 | 看以太网帧头(MAC 地址) | 看 IP 头(IP 地址) |
| 靠什么表 | 没有表 | MAC 地址表(CAM 表) | 路由表 |
| 表怎么来的 | —— | 自学习 + 老化,全自动 | 静态配置 + 动态路由协议 |
| 会不会改包 | 不改 | 基本不改(VLAN 加标签) | 改(TTL、校验、换 MAC 头) |
| 冲突域 | 所有口共一个 | 每个口一个 | 每个口一个 |
| 广播域 | 不隔离 | 默认不隔离(VLAN 才隔离) | 隔离(默认不转发广播) |
| 一句话记法 | 大喇叭 | 收发室 | 跨城快递分拣中心 |
这张表值得反复回看,它是本节最重要的"总账"。记忆锚点就三个词:集线器是喇叭(见人就喊)、交换机是收发室(认人、认门牌)、路由器是分拣中心(认城市、跨城送)。
对照 § 2.1 那张简表你会注意到:这里多出了"冲突域 / 广播域"两行,它们就是本节前文的浓缩——集线器让所有人挤在一个屋里吵架,交换机给每人一间房,路由器干脆把不同的楼隔开。这也是为什么三兄弟的分工可以用一句话串起来:集线器解决"大家能连上",交换机解决"连上了还互不打扰",路由器解决"不同网络之间也能通"。
动手看看:你设备的 MAC 地址与局域网
这一节讲的所有东西,在你电脑上都能亲眼看到。三条命令,三十秒看完。
# 【Windows】查看所有网卡的 MAC 地址(物理地址)
> ipconfig /all
无线局域网适配器 WLAN:
物理地址. . . . . . . . . : A4-5E-60-3F-21-B7 ← 这就是 MAC
IPv4 地址. . . . . . . . . : 192.168.1.8
默认网关. . . . . . . . . : 192.168.1.1
# 【Windows】只看 MAC(更直接)
> getmac
物理地址 传输名称
=========== ==========
A4-5E-60-3F-21-B7 \Device\Tcpip_{...}
# 【Linux / macOS】用 ip 命令
$ ip link
eth0: ... link/ether a4:5e:60:3f:21:b7 brd ff:ff:ff:ff:ff:ff
↑ MAC 地址 ↑ 广播地址
★ 观察点一:开头三位 A4-5E-60 是厂商前缀(OUI),
去 IEEE 的 OUI 查询库一查,就知道这网卡是谁家造的
(§ 1.3 讲过 OUI 前缀)。
★ 观察点二:`link/ether` 那行末尾的 ff:ff:ff:ff:ff:ff,
就是本节反复说的广播地址——所有网卡都认它。
如果你能进路由器管理页面(一般是 192.168.1.1),找"DHCP 客户端列表"或"已连接设备",你会看到一张表:设备名、IP 地址、MAC 地址——这正是交换机 / 路由器内部那张"收发室登记本"的投影。把手机 WiFi 关掉再打开,过几分钟再刷新,你甚至能看到旧记录消失(老化)和新记录出现(重新学习)。
这一节讲的"MAC 表""自学习""老化",从此不再是抽象概念——你家的路由器每天都在上演同样的戏码,只是没人告诉你它背后有这本小本子。
现实场景:家里的"交换机"是路由器,公司机房里三层结构
最后落到你身边,因为两个几乎人人都会踩的认知坑,都跟交换机有关。
坑一:你以为你在用"交换机",其实用的是路由器。家用无线路由器背面通常有好几个网口,包装盒上也可能写着"4 口交换机"——但它其实是一个五合一设备:
| 盒子里装的东西 | 干什么 | 对应本节哪个概念 |
|---|---|---|
| 路由器(三层) | 拨号上网、连接运营商、NAT | § 5.2 的主角;NAT 在 § 1.3 / § 3.5 讲过 |
| 交换机(二层) | 那几个 LAN 口之间的转发 | 本节主角:电脑、电视、光猫之间传帧 |
| 无线 AP | 把 WiFi 信号发出去 | 无线接入点,§ 6.1 会讲 |
| DHCP 服务器 | 给设备发 IP 地址 | § 3.6 会细讲 |
| 防火墙(简易版) | 默认挡住外面进来的连接 | § 5.4 的主角 |
这个"五合一"正是家用设备的生存之道:一个盒子全搞定,省空间省电。但代价是概念容易混——你插在路由器 LAN 口上的几台设备之间的通信,走的就是本节讲的"二层转发";一旦要出家门上网,才轮到里面的"路由器"部分出手。
坑二:公司机房里的交换机,是分层的。一个中型公司的网络,交换机通常按"接入—汇聚—核心"三层来摆,这不是拍脑袋,是工程上趟出来的最优结构:
- 接入层(Access)直接接终端:员工的电脑、办公室的 AP、打印机。它离人最近,端口最多,价格最便宜。好比公寓楼每一层的走廊灯和门禁——只管本层。
- 汇聚层(Distribution / Aggregation)把一片接入层交换机收拢起来,做 VLAN 之间的路由、访问控制。好比每栋楼的单元门禁大堂——几个楼层的流量都汇到这儿。
- 核心层(Core)全网最粗的血管:把所有汇聚层连起来,负责高速转发。好比整个园区的中央大道——车流最大、最不能断。
为什么要分层?因为"能干的设备"和"便宜的设备"是两回事。把又贵又能干的设备放在流量汇聚的核心,把便宜耐用的放在离人最近的接入——该快的快、该省的省。这个"分层"思路和 OSI 分层(§ 2.1)、公司组织架构其实同源:每个层次只管好自己的职责。
顺带一提,你家里那个光猫(运营商给的光纤猫)本质上也是一个多合一设备:光信号和电信号之间的翻译官,加上一部分路由和交换功能。它和网关的故事,§ 5.3 会专门讲。
至此,交换机的故事讲完了。它解决的是"同一个局域网里,怎么把帧准确、高效、互不打扰地送到该送的人手里"。下一节的主角路由器,将接过"跨网络寻路"的重任——它认识 IP、会选路,是整个互联网能连成一片的另一半答案。
一句话总结:交换机是"认得人的收发室"——它是二层设备,靠一张自己学会的 MAC 地址表,把帧只送给该收到的人,终结了集线器"一人说话全员收听"的时代。
机制上记住五件事:
· 自学习:每收到一个帧,先学源 MAC(记入 MAC 表、关联端口),再查目的 MAC 做决策——表全自动生长,不用人配。
· 三种转发结果 + 一种规矩:查得到 → 精确转发;查不到(未知单播)→ 泛洪(挨家挨户问);目的端口就是入端口 → 丢弃;广播帧永远泛洪(这是规矩)。
· 老化:每条记录带计时,通常几分钟(300 秒是常见默认值,可配置),太久没出现就删除——设备搬走了,表不能还记着旧位置。
· 全双工、无冲突:每个端口独立冲突域,同时收发(IEEE 802.3x),不像集线器那样共享带宽、抢话撞车。
· 两个"第二件套":环路会引发广播风暴(二层帧没有 TTL,必须靠 STP(IEEE 802.1D)/ RSTP(IEEE 802.1w) 自动砍环);VLAN(IEEE 802.1Q)把一台交换机切成多个广播域。
标准要记对:本节涉及的以太网(IEEE 802.3)、全双工(802.3x)、STP(802.1D)、RSTP(802.1w)、VLAN(802.1Q)全是 IEEE 标准,不是 RFC——跟第 3 章那些 IP/TCP 的 RFC 编号是两套体系,别混在一起记。
下一步:交换机只会在"一个局域网"里认 MAC。数据一旦要跨网络(出小区),就得靠路由器——它看 IP、查路由表、知道往哪个方向送。这就是 § 5.2 的主角。