交换机VLAN划分与二层转发验证:广播域隔离与抓包排查

发布时间:2026/10/27 3:23:13
交换机VLAN划分与二层转发验证:广播域隔离与抓包排查

计算机网络第四次实验这个题目,落到不同课表上,内容可能完全不一样:有的班做的是交换机 VLAN 划分,有的班做 IP 数据报分片分析,有的班直接上静态路由。但不管外壳怎么换,第四次实验几乎都卡在同一个位置——从“单网段能 ping 通”跨到“多网段、多广播域怎么组织”。我这些年带过几轮实验、也帮人排查过不少“明明配了却不通”的现场,发现绝大多数问题不是命令记错,而是对二层转发和广播域边界没形成直觉。这篇就把最常见的那个版本——交换机 VLAN 划分与二层转发行为验证——从目标拆解、原理梳理、动手实现到排查踩坑,完整讲一遍。刚接触网络实验的同学可以照着做,已经做过一遍但报告写不深的,也能从中找到几个能往下挖的点。

1. 先把实验目标拆清楚,别急着敲命令

1.1 从“能通”到“讲清为什么通”

大部分同学拿到拓扑图的第一反应是赶紧配 IP、赶紧 ping,ping 通了截图交差。这个流程没错,但对第四次实验来说,只做到“通”是亏的。前三次实验通常围绕单网段通信、基本命令、抓包入门,第四次开始接触“隔离”这个概念——你要证明的不是两台机器能说话,而是某些机器之间不能说话,而且不能说话的原因是可控的。

所以动手前我建议先把目标写成三句话:第一,同一 VLAN 内的主机能互通;第二,不同 VLAN 的主机在二层不通,即使物理上连在同一台交换机;第三,跨交换机的同 VLAN 主机能通,且这条链路上跑的是带标签的帧。这三句话对应的验证手段完全不同,第一句用 ping,第二句要用 ping 失败加 ARP 表观察,第三句必须抓包看 802.1Q 标签。把这三条写在纸上,配完一条划掉一条,比漫无目的地试要快得多。

还有一个容易被忽略的目标:解释广播域的变化。VLAN 最核心的价值不是“分组”,而是把一个大广播域切成若干小的。这一点在实验里必须用证据体现,否则报告里写“VLAN 用于隔离”就是空话。证据是什么?最直接的是抓 ARP 请求——同一 VLAN 内的 ARP 广播能被对方收到,跨 VLAN 的收不到。

1.2 拓扑与地址规划:算清楚再动手

我给一个通用性最强的拓扑:两台交换机 SW1、SW2 用一条链路互联,SW1 下挂 PC-A、PC-B,SW2 下挂 PC-C、PC-D。规划 VLAN 10 放 A 和 C,VLAN 20 放 B 和 D。这样设计的好处是能一次性验证“同 VLAN 跨设备通”和“异 VLAN 同设备不通”两个方向,覆盖面最全。

地址规划建议直接用私有段,别用公网段,避免和模拟器内置网段撞车:

VLAN网段掩码网关(如需)主机示例
VLAN 1010.10.10.0/24255.255.255.010.10.10.254A=10.10.10.1,C=10.10.10.3
VLAN 2010.10.20.0/24255.255.255.010.10.20.254B=10.10.20.2,D=10.10.20.4

这里有个计算过程值得写进报告:/24 的掩码是 255.255.255.0,主机位 8 位,理论地址数 256,扣除网络号 10.10.10.0 和广播地址 10.10.10.255,可用主机 254 个。这个数字本身不重要,重要的是养成“先算可用范围再分配”的习惯。VLAN ID 选 10 和 20 而不是 1 和 2,是刻意避开默认 VLAN 1,因为很多设备默认所有端口都在 VLAN 1 里,用默认值容易让你分不清“配成功了”和“本来就在里面”。

关于 VLAN ID 的取值范围也顺手记一下:802.1Q 的 VID 字段是 12 位,理论范围 0–4095,其中 0 和 4095 保留,1 通常作为默认 VLAN,所以实际可用是 2–4094。这个数字在报告里出现一次,能说明你确实翻过标准而不是抄的配置。

1.3 工具选型:模拟器、软件交换机还是真机

工具这块我建议至少用两种做对照,因为单一工具的盲区很大。图形化网络模拟器上手快、拓扑拖一拖就有,但它的抓包往往是“模拟出来的”,标签位置、时序都可能和真实环境有偏差;真交换机最真实,但很多教学环境不给配,而且改配置要反复保存重启,效率低。

我个人的组合是:图形化模拟器负责搭拓扑和验证连通性,Linux 软件交换机负责验证标签行为。Linux 上做二层交换完全不需要额外硬件,内核自带的 bridge 模块就是一台软件交换机,配合 VLAN 子接口能完整复现 Access 口和 Trunk 口的行为,而且 tcpdump 抓到的是真实的帧,链路层头部一字不差。涉及具体命令的部分我会在第三节给出,全部是通用写法,不依赖任何厂商语法。

提示:如果你只有一台电脑,最省事的做法是用虚拟机或容器起三到四个网络命名空间当主机,宿主机当交换机。命令量不大,但能完整复现整个实验,比在模拟器里点鼠标更能理解发生了什么。

2. 核心原理拆解:帧在交换机里到底经历了什么

2.1 MAC 地址表、泛洪与学习:交换机的三步走

一台交换机收到帧之后只做三件事:学源 MAC、查目的 MAC、决定转发还是泛洪。这三步听起来简单,但实验里几乎所有“抓不到包”“时通时不通”的问题都能从这里找到解释。

学源 MAC 的意思是:帧从哪个口进来,就把“源 MAC—入端口”这组关系写进 MAC 地址表。查目的 MAC 的意思是:拿目的地址去表里翻,翻到了叫已知单播,从对应端口转发出去;翻不到叫未知单播,从除入端口外的所有同 VLAN 端口泛洪出去。这个“同 VLAN”是关键词,也是很多人漏掉的地方——泛洪不是全交换机泛洪,而是在同一个广播域内泛洪。

这套机制带来的一个常见现象是:主机刚开机时通信会“慢半拍”。原因是表里没记录,第一帧要泛洪,等对方回帧,交换机才学到对方的位置,第二帧开始才是单播。所以做实验时如果第一次 ping 出现一两个丢包或延迟偏高,不要急着判定配置错了,先再 ping 一次看看。表项也不是永久的,主流设备的动态表项老化时间默认在 300 秒左右,超过这个时间没有流量刷新就会删掉,重新回到泛洪状态。这个细节写进报告,比只贴一张 ping 通截图有说服力。

2.2 Access 口与 Trunk 口:标签到底加在哪里

这是第四次实验最容易讲混的一块。我用一句话概括:Access 口是“去标签”的口,Trunk 口是“带标签”的口。

具体流程是这样的:PC-A 发出一个普通以太网帧,帧头里没有 VLAN 信息,因为它根本不知道 VLAN 的存在。这个帧进入交换机 SW1 的 Access 口时,交换机在内部给它打上“这个口属于 VLAN 10”的标记,然后按 VLAN 10 的范围去转发。如果出口还是 Access 口(比如发给 PC-B),交换机在发出前把标记去掉,PC-B 收到的还是一个干净的普通帧。整个过程对主机完全透明,这正是 VLAN 设计的巧妙之处——隔离做在网络侧,终端零改造。

只有一种情况标签会被保留在线上:帧从一个 Trunk 口出去。Trunk 口承载多个 VLAN,如果不带标签,对端就不知道这帧属于哪个 VLAN,所以必须在帧头插入 4 个字节的 802.1Q 标签。这 4 个字节的构成值得记牢:

字段长度说明
TPID2 字节固定值 0x8100,标识“这是 802.1Q 标签帧”
PCP3 bit优先级,实验里一般不设
DEI1 bit丢弃 eligible 指示,实验里不关心
VID12 bitVLAN ID,就是前面说的 2–4094

标签插在源 MAC 之后、类型字段之前。所以一帧标准以太网帧是:目的 MAC(6) + 源 MAC(6) + 类型(2) + 数据(46–1500) + FCS(4) = 64–1518 字节。打上标签后变成 64–1522 字节。这多出来的 4 字节在算 MTU 时不参与,因为 MTU 约束的是 IP 层载荷,标签属于链路层封装,交换机加上、交换机去掉,两端的 IP 层完全无感。

注意:有些同学在抓包时看到“长度 1518”就以为超了,其实 1518 是不带标签时的上限,带标签的合法上限是 1522,再往上有巨帧(通常 9000 左右),那是另一个话题,本实验用不到。

2.3 广播域和冲突域:别把两个概念混着说

冲突域是早期共享介质时代的产物,现在的交换机每个端口就是一个独立冲突域,全双工链路上基本不会发生冲突,所以这个词在交换式网络里存在感很低。广播域才是 VLAN 真正切分的东西。

一个广播帧(目的 MAC 是 FF:FF:FF:FF:FF:FF)会在同一广播域内被所有端口转发。ARP 请求就是典型的广播帧:PC-A 想知道 10.10.10.3 的 MAC,会发一个“谁是 10.10.10.3”的广播。如果 A 和 C 在同一个 VLAN,这个广播能到达 C,C 回复单播 ARP 应答,双方建立映射;如果不在同一 VLAN,广播被隔离,A 永远等不到回应,ping 就会报“目标主机不可达”或者长时间超时。

这里有个很实用的判断技巧:ping 不通时先看 ARP 表。如果 ARP 表里对方 IP 对应的 MAC 是“incomplete”或者干脆没有条目,说明问题出在二层,广播没送到;如果 ARP 表里有完整条目但 ping 还失败,那问题更可能在三层(IP 不在同网段、防火墙拦截等)。这一招能砍掉一半的排查时间。

3. 实操过程:从零把拓扑跑起来

3.1 建拓扑与主机侧准备

主机侧配置是最没技术含量但最容易出错的一步。Windows 上开命令行,用ipconfig /all确认地址、掩码、网关三项都写进去了,特别注意别把掩码写成 255.255.0.0,那会让 10.10.10.x 和 10.10.20.x 变成同网段,整个实验的隔离验证直接失效。Linux 上更简单:

sudo ip addr add 10.10.10.1/24 dev eth0 sudo ip link set eth0 up ip addr show eth0

配完立刻用ip route看一眼,确认没有残留的默认路由把你导向别的网段。有些虚拟机默认带一条 0.0.0.0/0 的出口路由,做实验时会让“本该不通”的流量从别的地方绕出去,导致你以为隔离成功其实只是走了另一条路。做法是把无关网卡先 down 掉,只留实验用的那张。

主机侧还要做一件事:清 ARP 缓存。系统里的 ARP 缓存可能残留在上一次实验的记录,导致你以为通了其实是旧条目在起作用。Windows 用arp -d *(需要管理员权限),Linux 用sudo ip neigh flush all,模拟器里的主机则通常在命令行里也有对应的清缓存命令。做完这一步再开始验证,结论才干净。

3.2 划分 VLAN 并把端口划进去

交换机侧的逻辑分两步:先建 VLAN,再把端口划进去。这两步必须都做,只建 VLAN 不划端口,端口还待在默认 VLAN 里,配置等于没生效。这是新手最常见的“配了但没用”的原因。

如果用 Linux 软件交换机,思路是把每个物理口做成“只属于某个 VLAN”的接入链路。做法是先在物理口上创建 VLAN 子接口,再把这个子接口挂到网桥上,同时不要让物理口本身进桥:

# 建网桥 sudo ip link add name br0 type bridge sudo ip link set br0 up # 把 eth1 划入 VLAN 10(eth1 接主机 A) sudo ip link add link eth1 name eth1.10 type vlan id 10 sudo ip link set eth1.10 up sudo ip link set eth1.10 master br0 # 把 eth2 划入 VLAN 20(eth2 接主机 B) sudo ip link add link eth2 name eth2.20 type vlan id 20 sudo ip link set eth2.20 up sudo ip link set eth2.20 master br0

这里的关键理解是:物理口 eth1 本身没有被分配地址、也没有进桥,只有它的 VLAN 子接口进了桥。所以主机 A 发出来的无标签帧,进入 eth1 后被内核按 PVID 规则打上 VLAN 10 的标记,然后再进桥转发。这个动作和物理交换机的 Access 口行为完全一致。

图形化模拟器的操作等价:进全局配置模式创建 VLAN 10 和 VLAN 20,然后进接口模式把对应端口设成 access 类型并指定 VLAN。不同厂商命令措辞不同,但语义都是“建 VLAN → 端口设为接入模式 → 绑定 VLAN”这三件事,认准语义就不会被语法绕晕。

3.3 配 Trunk 并验证标签

两台交换机之间的互联口必须在两端都配成 Trunk,而且允许通过的 VLAN 列表要包含 10 和 20。这里有个经典坑:两端都配了 Trunk,但一端允许列表里漏了 VLAN 20,结果 VLAN 10 通、VLAN 20 不通,现象看着像“某个网段坏了”,实际是链路过滤问题。

Linux 上的等价做法是把互联口做成 Trunk,也就是保留带标签的帧直接透传:

# eth3 是互联口,做成 Trunk sudo ip link set eth3 up sudo ip link set eth3 master br0 # 打开 VLAN 过滤,让带标签的帧能进桥 sudo ip link set dev br0 type bridge vlan_filtering 1 sudo bridge vlan add dev eth3 vid 10 sudo bridge vlan add dev eth3 vid 20

vlan_filtering 1这一句是核心,它让网桥按 802.1Q 标签来转发,不再把带标签的帧当普通帧乱扔。打开之后可以用下面的命令确认每个端口的 VLAN 归属:

bridge vlan show

输出里能看到 eth1.10 对应 vid 10、eth3 同时允许 vid 10 和 20,这就是一份“配置对照表”,比在图形界面里翻菜单确认靠谱得多。

参数上还有一个经常被问到的东西:Trunk 口的 PVID(端口默认 VLAN)。当 Trunk 口收到一个不带标签的帧时,交换机会把它归到 PVID 对应的 VLAN 里。默认 PVID 通常是 1,所以如果有人把主机直接插在 Trunk 口上,主机发出的无标签帧会全部落到 VLAN 1,而不是你以为的 VLAN 10。这个行为在实验里可以用来做对照案例,但正常拓扑里要让主机接 Access 口。

3.4 抓包验证:亲眼看到那 4 个字节

配置通不通可以用 ping 判断,但“是不是真的走了 VLAN”只能靠抓包。抓包位置选两个:一个是主机侧,一个是 Trunk 链路上。

主机侧抓包应该看到没有标签的普通帧。在主机上执行:

sudo tcpdump -i eth0 -e -n arp

-e参数会打印链路层头部内容。如果输出里出现了vlan 10字样,说明标签没被正确剥离,问题出在交换机的出口配置上,不是主机的问题。

Trunk 链路上抓包应该看到带标签的帧。在充当交换机的机器上抓互联口:

sudo tcpdump -i eth3 -e -n vlan

正常输出类似这样:源 MAC、目的 MAC 之后紧跟vlan 10,然后是 ARP 或 IP 的类型字段。看到这个,你的实验就有了最硬的证据——不是“我猜它带了标签”,而是“抓到了标签”。

想让抓包结果更有说服力,可以在 Trunk 上同时跑两个 VLAN 的流量:A ping C,B ping D,然后tcpdump输出的记录里会交替出现vlan 10和vlan 20。这一张截图能同时证明三件事:Trunk 承载多 VLAN、标签正确、两个广播域在同一根线上共存而互不干扰。

提示:抓包时先起抓包命令再发起 ping,顺序反了容易漏掉 ARP 阶段。另外记得在发 ping 前清一次 ARP 缓存,否则可能直接命中缓存走单播,抓不到广播帧。

3.5 一份能直接抄的验证清单

做完配置不要凭感觉说“好了”,按清单一条条过:

序号验证项操作预期结果
1同 VLAN 同交换机A ping B 同 VLAN 场景通
2异 VLAN 同交换机A ping B 跨 VLAN不通,ARP 无应答
3同 VLAN 跨交换机A ping C通
4异 VLAN 跨交换机A ping D不通
5主机侧抓包tcpdump -e无 vlan 字段
6Trunk 侧抓包tcpdump -e vlan有 vlan 字段且 ID 正确
7MAC 表bridge fdb show 或设备命令每个 MAC 对应正确端口和 VLAN
8ARP 表arp -a / ip neigh同 VLAN 有完整条目,异 VLAN 为空

第 7 项特别值得看。表里每个 MAC 后面都会标注它属于哪个端口、哪个 VLAN。如果发现同一个 VLAN 的 MAC 出现在了错误的端口上,或者不同 VLAN 的 MAC 混在了一起,那基本能确定是端口划分出了问题。

4. 常见问题与排查实录

4.1 同 VLAN 不通:按层往下砍

这是最高频的问题。我一般按“物理层→链路层→VLAN→地址”的顺序砍,每一步都有明确的判据,不要跳步猜。

现象可能原因快速判据处理方式
完全无流量网线/接口没起接口状态是否 up检查链路、启用接口
有流量但丢包双工不匹配、环路端口计数有无 CRC 错、广播风暴统一双工、排查环路
ARP 无应答不在同一 VLAN两端端口 VLAN 归属修正端口 VLAN 绑定
ARP 有应答但 ping 失败IP 不同网段或被拦截对比两端 IP 与掩码修正地址或路由
时通时不通MAC 表老化、地址冲突MAC 表有无重复 MAC排除重复地址

这里我想强调“地址冲突”这一条,它造成的现象极其迷惑:两台机器配了同一个 IP,交换机会学到同一个 MAC 出现在两个端口上,转发时来回抖,表现就是“一会儿通一会儿不通”。排查方法是看 MAC 表里有没有同一个 MAC 对应多个端口,有就基本确定了。

4.2 抓不到包、看不到标签的几个坑

第一个坑是抓包接口选错。带标签的帧只在 Trunk 口出现,你在主机网卡上抓当然看不到。第二个坑是网卡或驱动把标签剥掉了。部分网卡在做硬件加速时会主动处理 VLAN 标签,交给上层的时候标签已经没了,抓包看到的就是干净帧。这种情况不是配置错,是抓包位置的问题,换到交换机侧抓就能解决。第三个坑是混杂模式没开。默认网卡只接收目的地址是自己的帧,别人的广播和单播都收不到,抓包自然一片空白。用tcpdump时它一般会自动开混杂模式,但如果是在虚拟化环境里,需要确认虚拟交换机的安全策略允许混杂。

第四个坑比较隐蔽:抓包工具默认不解析 VLAN 字段。有些工具在没有配置 VLAN 过滤的时候,会把vlan 10显示成类型字段 0x8100 加一串看不懂的十六进制偏移。看到 0x8100 就该反应过来这是标签帧,只是显示没开。Linux 上tcpdump加vlan过滤表达式就能正确解析;图形工具则在首选项里打开 802.1Q 解析开关。

4.3 模拟器和真机的差异,别把结论带错

模拟器为了演示效果,往往会把一些行为理想化。我遇到过几个典型差异,写论文或者写报告时最好点出来:

一是时序。模拟器里 ping 的响应时间常常是 0ms 或固定值,而真机上有真实的往返延迟,第一次 ping 因为 ARP 会明显慢一些。二是泛洪行为。有些模拟器在未知单播时不做泛洪,直接丢弃,这会让你误判“MAC 表学习机制不生效”。三是标签处理。模拟器里主机网卡可能直接“看得懂”VLAN,而真实主机网卡对 VLAN 完全无感,只认不带标签的帧。

正因为有这些差异,我强烈建议至少在一个环节上用真实环境验证一次。哪怕只是用两台笔记本加一根网线,跑一次 Access 口和 Trunk 口的对照,你对这套机制的理解也会比在模拟器里点十遍扎实。

注意:实验报告里如果写了“模拟器环境下观察到 XX 现象”,最好补一句“在真实设备上该现象为 YY”,这种对比是加分项,老师一眼能看出你是真做过还是抄的。

4.4 报告写不深?三个能立刻补上的角度

第一个角度是抓包时序图。不要只贴一张 ping 通截图,把 ARP 请求、ARP 应答、ICMP 请求、ICMP 应答四条报文的时间戳列出来,说明谁先谁后、每条报文在哪个 VLAN 上跑。一张这样的表就能把“我理解流程”变成证据。

第二个角度是对照实验。把“不划 VLAN”和“划 VLAN”两种配置下的广播帧数量做个统计,用同样的 ping 操作,看抓到的广播报文数量差异。VLAN 的价值立刻就量化了:原来一次 ARP 全网络都能收到,现在只有同 VLAN 的几台能收到。

第三个角度是容量和边界。VLAN ID 上限 4094,一个 Trunk 口理论上能承载全部 VLAN,但实际设备对同时激活的 VLAN 数量有限制;MAC 表容量也是有限的,表满了之后交换机会退化成泛洪模式,性能骤降。这些边界条件写进去,报告的专业度会上一个台阶。

5. 参数计算与扩展玩法

5.1 掩码、MTU 与分片的计算过程

实验里绕不开两个计算。第一个是掩码和网段:给 10.10.10.0/24,问可用主机数,就是 2 的 8 次方减 2 等于 254。如果要拆成两个 /25,那就是 10.10.10.0/25(可用 126 个,范围 .1–.126)和 10.10.10.128/25(范围 .129–.254)。会算这个,才能理解为什么“同一个 VLAN 里放不下两个网段”这种说法是错的——一个 VLAN 里当然可以放多个网段,只是它们之间需要三层设备才能互通。

第二个是 MTU 和分片。以太网标准 MTU 是 1500 字节,指的是 IP 层载荷上限。ICMP 报文头占 8 字节,所以不分片能通过的最大 ping 载荷是 1500 − 20(IP 头)− 8(ICMP 头)= 1472 字节。Linux 上验证:

ping -M do -s 1472 10.10.10.3 # 应该通 ping -M do -s 1473 10.10.10.3 # 应该提示需要分片

Windows 上对应的是ping -f -l 1472。这个测试很有价值,因为它能反推出链路 MTU 是否被中间设备改小了。有些环境为了承载额外封装会把 MTU 调到 1400 多,这时候 1472 就不通,得往下试。而 VLAN 标签虽然让帧长从 1518 变成 1522,但它不影响 IP 层的 MTU——标签是链路层的事,交换机加上、交换机去掉,两端的 IP 层感知不到。

5.2 把实验扩展成一个能讲的小型网络

基础拓扑跑通之后,我建议往两个方向扩,每个方向都能撑起报告的一整节。

方向一:加三层设备,让 VLAN 间互通。引入一个路由器或三层交换机,给 VLAN 10 和 VLAN 20 各配一个网关地址,主机把网关指向它。这时候原本不通的两个 VLAN 就能通了。关键观察点是:跨 VLAN 的流量在二层依然是被隔离的,只是被三层设备“接”起来了。抓包能看到 ARP 请求发给网关而不是发给对方主机,这是理解“网关”本质的最好素材。

方向二:多交换机 + 冗余链路。把两台交换机用两条线连起来,观察会发生什么。如果没有生成树协议,广播帧会在环路里无限循环,几秒钟就能把链路打满。这个现象叫广播风暴,亲眼见过一次就永远忘不掉。然后开启生成树,观察其中一个端口进入阻塞状态,环路被打破。这个扩展能把第四次实验和后续的生成树内容串起来。

这两个方向任选其一,实验的深度就完全不同了。前者讲的是“隔离怎么被打通”,后者讲的是“冗余为什么要付代价”,都是真实网络里天天要面对的权衡。

5.3 一点参数记忆上的偷懒办法

VLAN 相关的数字不多,我自己的记法是抓三个锚点:4094 是 VLAN 数量上限,1522 是带标签的帧长上限,4 是标签占的字节数。剩下都能推:1518 加 4 得 1522;12 位 VID 得 4096,减掉保留的两个得 4094。MAC 表老化 300 秒这个数字各家设备略有差异,记住“五分钟量级”就够了,真要精确值去查设备手册。

至于端口模式,我的记法是“Access 一对一,Trunk 一对多”。Access 口只属于一个 VLAN、进出不带标签;Trunk 口属于多个 VLAN、出口带标签、入口看不带标签的帧就按 PVID 归类。把这个对应关系记死,配置时就不会在“这个口该设成什么模式”上犹豫。

最后再分享一个我自己踩过的小坑:早期做这个实验时,我习惯配完就 ping,ping 通就收工,结果有一次两台机器明明在不同 VLAN 却 ping 通了,查了半天才发现其中一台机器上还留着上一轮实验的静态 ARP 条目,直接命中缓存绕过了广播。从那以后我养成了一个习惯——每次验证前先清 ARP 缓存,每次下结论前先看一眼抓包。这两个动作各花不到十秒,但能省掉大量“明明配对了为什么不通”和“明明配错了为什么通了”的自我怀疑。