📡 第二章 彻底理解L2交换机
📄 一句话概括

网桥是中继器加了一样东西:认识 MAC 地址。 认识地址,就能决定「这一帧该从哪个口出去」,冲突域第一次被切开了。

📝 本节和前面几节的关系

上一节的中继器什么也不判断,这一节加上了判断能力。 网桥是交换机的前身——把网桥做成多端口、用硬件实现,就是交换机。

一、多了「看地址」这一件事

网桥有两个口(或多口),它做三件事:看源地址学表、看目的地址查表、查不到就泛洪。

学表:收到一帧,把「源 MAC + 从哪个口进来」记下来。 查表:目的 MAC 在表里、且出口不是入口,就从那个口转发。 泛洪:表里没有,或者目的是广播,就从除入口外所有口发出去。

表项有老化时间,一般 300 秒。不老化表会满,满了就学不进新地址,交换机只能退化成集线器。

二、冲突域被切开了

这是网桥最重要的贡献:每个口是一个独立的冲突域。左边在撞,右边照常通信。

但广播域没被切开:广播帧本来就要发到所有口,网桥照样泛洪。要切广播域得靠 VLAN 和路由器。

这一条到今天还在坑人:以为「加了交换机就隔离了广播」,其实没有。 一台交换机不加 VLAN,就是一个广播域。

三、网桥与交换机的区别

功能上没区别,区别在实现与端口数:

网桥:端口少(2 到 4 个),用软件查表,慢。1990 年代的东西。 交换机:端口多(8 到 48 个),用专用芯片查表,线速。

所以「交换机就是一个多端口网桥」这句话是对的。理解网桥就理解了交换机的全部逻辑——后面的 VLAN、生成树、端口安全,都是在网桥这套机制上长出来的。

四、动手 Demo:一台四口网桥怎么学表、怎么决定转发还是丢掉

这段喂八帧给一台四口网桥,逐帧打印「动作」与当时的 MAC 表。 看第 4 帧(命中转发)、第 7 帧(未知泛洪)、第 8 帧(命中转发)。

for i, (port, src, dst) in enumerate(frames, 1):
    mac[src] = port
    if dst not in mac:
        act = u"泛洪"
    elif mac[dst] == port:
        act = u"丢弃"
    else:
        act = u"转到 %d" % mac[dst]

实跑输出:

--------------------------------------------------------------------
一台网桥怎么学表、怎么决定转发还是丢掉
--------------------------------------------------------------------
**网桥比中继器多一样东西:它认识帧头里的 MAC 地址。**这就够了——认识地址,
就能决定「这一帧该从哪个口出去」,而不是无脑从所有口复制出去。

**它只做三件事**:看源地址学表、看目的地址查表、查不到就泛洪。老化靠一条定时器。

**跑一遍。**四个口,一串帧,看表怎么长出来:
  帧     入端口     源→目的     动作       表里现在有
  -------------------------------------------------------------------
  1      1          AA→BB       泛洪       AA@1
  2      2          BB→AA       转到 1     AA@1、BB@2
  3      1          AA→CC       泛洪       AA@1、BB@2
  4      3          CC→AA       转到 1     AA@1、BB@2、CC@3
  5      4          DD→BB       转到 2     AA@1、BB@2、CC@3、DD@4
  6      1          AA→DD       转到 4     AA@1、BB@2、CC@3、DD@4
  7      2          BB→ZZ       泛洪       AA@1、BB@2、CC@3、DD@4
  8      3          CC→BB       转到 2     AA@1、BB@2、CC@3、DD@4

**看第 4 帧**:CC 从 3 号口来,目的 AA 在 1 号口,网桥直接转到 1 号口,2、
4 号口上的设备根本收不到这一帧。**这就是「过滤」——中继器永远做不到。**

**看第 7 帧**:目的 ZZ 从没出现过,只能泛洪。泛洪是「不确定时的默认动作」,不是错误;
但如果 ZZ 一直不存在,这一帧就会一直泛洪下去,直到老化清掉它。

**老化时间一般是 300 秒**(5 分钟)。
表满了又不老化,新地址就学不进来,交换机只能退化成集线器——**这就是「MAC 地址数」这个规格的意义**。

第 4 帧最能说明问题:CC 从 3 号口来,目的 AA 在 1 号口,网桥直接转到 1 号口,2、 4 号口上的设备根本收不到。这就是「过滤」。中继器永远做不到这件事。

第 7 帧是泛洪:目的 ZZ 从没出现过,只能从所有口发出去。 泛洪不是错误,是「不确定时的默认动作」。 但一直泛洪就是问题——说明那个地址根本不存在,或者老化时间太长把无用记录留住了。

八帧下来表里长到 8 项,这就是学习的过程。 注意它只学源地址:目的地址永远不会被学进来——因为「我想发给谁」不代表「谁在那里」。

30 秒实验

  1. 在交换机上敲一条看 MAC 表的命令,数一下有多少项。
  2. 看表项里的「类型」一栏:动态、静态、还是系统保留。
  3. 找一条老化时间配置,看它是多少秒。

常见误区

  1. 以为网桥能隔离广播。广播照样泛洪。
  2. 以为表里会学目的地址。只学源地址。
  3. 以为老化时间越长越好。太长会占满表项,反而学不进新的。
自测三问(点开对答案) 1. 网桥做哪三件事? —— 看源地址学表、看目的地址转发或丢弃、查不到就泛洪。 2. 网桥与中继器的根本区别? —— 网桥认识 MAC 地址,能判断该从哪个口出去,因此能隔离冲突域。 3. 为什么网桥不能隔离广播域? —— 广播帧本来就要发给所有人,网桥的处理就是泛洪到所有口。

下一节:网桥做成多端口、只留一个「共享介质」,就是最早期的集线器。

相关笔记