交换机VLAN划分与二层转发验证:广播域隔离与抓包排查 计算机网络第四次实验这个题目落到不同课表上内容可能完全不一样有的班做的是交换机 VLAN 划分有的班做 IP 数据报分片分析有的班直接上静态路由。但不管外壳怎么换第四次实验几乎都卡在同一个位置——从“单网段能 ping 通”跨到“多网段、多广播域怎么组织”。我这些年带过几轮实验、也帮人排查过不少“明明配了却不通”的现场发现绝大多数问题不是命令记错而是对二层转发和广播域边界没形成直觉。这篇就把最常见的那个版本——交换机 VLAN 划分与二层转发行为验证——从目标拆解、原理梳理、动手实现到排查踩坑完整讲一遍。刚接触网络实验的同学可以照着做已经做过一遍但报告写不深的也能从中找到几个能往下挖的点。1. 先把实验目标拆清楚别急着敲命令1.1 从“能通”到“讲清为什么通”大部分同学拿到拓扑图的第一反应是赶紧配 IP、赶紧 pingping 通了截图交差。这个流程没错但对第四次实验来说只做到“通”是亏的。前三次实验通常围绕单网段通信、基本命令、抓包入门第四次开始接触“隔离”这个概念——你要证明的不是两台机器能说话而是某些机器之间不能说话而且不能说话的原因是可控的。所以动手前我建议先把目标写成三句话第一同一 VLAN 内的主机能互通第二不同 VLAN 的主机在二层不通即使物理上连在同一台交换机第三跨交换机的同 VLAN 主机能通且这条链路上跑的是带标签的帧。这三句话对应的验证手段完全不同第一句用 ping第二句要用 ping 失败加 ARP 表观察第三句必须抓包看 802.1Q 标签。把这三条写在纸上配完一条划掉一条比漫无目的地试要快得多。还有一个容易被忽略的目标解释广播域的变化。VLAN 最核心的价值不是“分组”而是把一个大广播域切成若干小的。这一点在实验里必须用证据体现否则报告里写“VLAN 用于隔离”就是空话。证据是什么最直接的是抓 ARP 请求——同一 VLAN 内的 ARP 广播能被对方收到跨 VLAN 的收不到。1.2 拓扑与地址规划算清楚再动手我给一个通用性最强的拓扑两台交换机 SW1、SW2 用一条链路互联SW1 下挂 PC-A、PC-BSW2 下挂 PC-C、PC-D。规划 VLAN 10 放 A 和 CVLAN 20 放 B 和 D。这样设计的好处是能一次性验证“同 VLAN 跨设备通”和“异 VLAN 同设备不通”两个方向覆盖面最全。地址规划建议直接用私有段别用公网段避免和模拟器内置网段撞车VLAN网段掩码网关如需主机示例VLAN 1010.10.10.0/24255.255.255.010.10.10.254A10.10.10.1C10.10.10.3VLAN 2010.10.20.0/24255.255.255.010.10.20.254B10.10.20.2D10.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这个广播能到达 CC 回复单播 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 10eth1 接主机 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 20eth2 接主机 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 20vlan_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 CB 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 对应正确端口和 VLAN8ARP 表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 − 20IP 头− 8ICMP 头 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 得 152212 位 VID 得 4096减掉保留的两个得 4094。MAC 表老化 300 秒这个数字各家设备略有差异记住“五分钟量级”就够了真要精确值去查设备手册。至于端口模式我的记法是“Access 一对一Trunk 一对多”。Access 口只属于一个 VLAN、进出不带标签Trunk 口属于多个 VLAN、出口带标签、入口看不带标签的帧就按 PVID 归类。把这个对应关系记死配置时就不会在“这个口该设成什么模式”上犹豫。最后再分享一个我自己踩过的小坑早期做这个实验时我习惯配完就 pingping 通就收工结果有一次两台机器明明在不同 VLAN 却 ping 通了查了半天才发现其中一台机器上还留着上一轮实验的静态 ARP 条目直接命中缓存绕过了广播。从那以后我养成了一个习惯——每次验证前先清 ARP 缓存每次下结论前先看一眼抓包。这两个动作各花不到十秒但能省掉大量“明明配对了为什么不通”和“明明配错了为什么通了”的自我怀疑。