第7篇:同一 VLAN 内两台 PC 如何通信
一、写在前面
前两篇文章我们学了 MAC 地址表和 ARP,现在把它们串起来——用一条完整的通信链路,看清楚同一 VLAN 内两台 PC 之间的一次 Ping,数据到底是怎么走的。
本文是一个融合实操案例,把之前学过的知识点在同一个场景下串联起来。
二、实验拓扑
VLAN 10
交换机(Switch) 非网管/二层 G0/0/1 G0/0/2 │ │ │ │ PC-A PC-B IP: 10.0.0.1 IP: 10.0.0.2 MAC: AAAA MAC: BBBB 子网掩码: /24 子网掩码: /24 GW: 无 GW: 无
前提: - 两台 PC 在同一 VLAN(10),或者说都在 Access VLAN 10 下 - PC-A 和 PC-B 不做特殊网关配置,因为同网段不需要网关 - 交换机是纯二层转发
三、完整通信过程
第 1 步:PC-A 判断目标是否在同一网段
PC-A 配了 IP 10.0.0.1 /24,要访问 PC-B 的 10.0.0.2:
PC-A 做 AND 运算:
10.0.0.2 AND 255.255.255.0 = 10.0.0.0 ← 网络号
10.0.0.1 AND 255.255.255.0 = 10.0.0.0 ← 一样!
结论:目标在同网段 → 直接通信,不需要网关。
第 2 步:查 ARP 缓存
PC-A 检查本地 ARP 缓存,看有没有 10.0.0.2 对应的 MAC:
C:\> arp -a
...没有 10.0.0.2 的条目...
→ 触发 ARP 广播请求。
第 3 步:ARP 广播请求
PC-A 发送一个二层广播帧(图中简化为关键字段):
目的MAC: FF-FF-FF-FF-FF-FF ← 广播 源MAC: AA-AA-AA-AA-AA-AA ← PC-A 帧类型: 0x0806 ← ARP ARP操作: Request 发送端IP: 10.0.0.1 发送端MAC: AAAA 目标IP: 10.0.0.2 目标MAC: 0000(未知)
第 4 步:交换机如何处理这个广播帧
交换机从 G0/0/1 口收到这个帧:
动作① — MAC 学习:
将 源MAC(AAAA) + 端口(G0/0/1) 写入 MAC 地址表
→ 表:AAAA → G0/0/1
动作② — 广播处理: 因为目的 MAC 是 FF-FF-FF-FF-FF-FF(广播),交换机泛洪到所有其他端口,包括 G0/0/2。
第 5 步:PC-B 收到 ARP 请求
PC-B 从 G0/0/2 收到广播帧:
① 检查帧类型:0x0806(ARP)→ 交给 ARP 模块处理
② 检查目标 IP:10.0.0.2 → 是自己!
③ 记录发送端信息到 ARP 缓存:
10.0.0.1 → AA-AA-AA-AA-AA-AA(PC-A 的 MAC)
④ 准备 ARP 应答
第 6 步:ARP 应答(单播回复)
PC-B 回复 ARP Reply:
目的MAC: AA-AA-AA-AA-AA-AA ← 单播回 PC-A 源MAC: BB-BB-BB-BB-BB-BB ← PC-B 帧类型: 0x0806 ← ARP ARP操作: Reply 发送端IP: 10.0.0.2 发送端MAC: BBBB 目标IP: 10.0.0.1 目标MAC: AAAA
第 7 步:交换机转发 ARP 应答
交换机从 G0/0/2 收到:
动作① — MAC 学习:
将 源MAC(BBBB) + 端口(G0/0/2) 写入 MAC 地址表
→ 表:AAAA → G0/0/1
BBBB → G0/0/2 ← 新增
动作② — 精确转发: 查 MAC 表找目标 AAAA → 从 G0/0/1 精确转发。
第 8 步:PC-A 收到 ARP 应答
PC-A 收到 ARP Reply,更新 ARP 缓存:
C:\> arp -a
10.0.0.2 bb-bb-bb-bb-bb-bb 动态
现在 PC-A 知道 PC-B 的 MAC 了!
第 9 步:Ping 的真正 ICMP 请求
PC-A 开始真正的 Ping(ICMP Echo Request):
目的MAC: BB-BB-BB-BB-BB-BB ← PC-B 源MAC: AA-AA-AA-AA-AA-AA ← PC-A 帧类型: 0x0800 ← IPv4 IP 源: 10.0.0.1 IP 目标: 10.0.0.2 ICMP: Echo Request (Type 8)
第 10 步:交换机转发 ICMP 请求
交换机查 MAC 表找 BBBB → G0/0/2 → 精确转发。
第 11 步:PC-B 回复 Ping
PC-B 收到 ICMP Echo Request,回复 Echo Reply:
目的MAC: AA-AA-AA-AA-AA-AA 源MAC: BB-BB-BB-BB-BB-BB 源IP: 10.0.0.2 → 目标IP: 10.0.0.1 ICMP: Echo Reply (Type 0)
第 12 步:大功告成
PC-A 收到 Echo Reply,屏幕上显示:
Reply from 10.0.0.2: bytes=32 time<1ms TTL=128
四、通信过程中的关键状态变化
| 时间点 | 交换机 MAC 表 | PC-A ARP 缓存 | PC-B ARP 缓存 |
|---|---|---|---|
| 初始 | 空 | 空 | 空 |
| PC-A 发 ARP 请求后 | AAAA → G0/0/1 | 空 | 10.0.0.1 → AAAA |
| PC-B 回复 ARP 后 | AAAA → G0/0/1, BBBB → G0/0/2 | 10.0.0.2 → BBBB | 10.0.0.1 → AAAA |
| 后续通信 | 同上(持续刷新 Aging) | 同上 | 同上 |
五、抓包看全过程
如果我们在 PC-A 上用 Wireshark 抓包,可以看到:
No. Time Source Destination Protocol Info
1 0.000 PC-A Broadcast ARP Who has 10.0.0.2? Tell 10.0.0.1
2 0.002 PC-B PC-A ARP 10.0.0.2 is at bb:bb:bb:bb:bb:bb
3 0.003 PC-A PC-B ICMP Echo (ping) request
4 0.005 PC-B PC-A ICMP Echo (ping) reply
5 1.003 PC-A PC-B ICMP Echo (ping) request
6 1.005 PC-B PC-A ICMP Echo (ping) reply
注:通常第二次及之后的 Ping 不需要再做 ARP,因为 ARP 缓存已命中。
六、如果 PC 接了二层交换机但跨端口 ping 不通?
排查步骤:
| 步骤 | 命令/操作 | 可能发现的问题 |
|---|---|---|
| 1. 检查 PC 的 IP | ipconfig | IP 配错、子网掩码配错 |
| 2. 检查物理连接 | 看端口灯 | 网线未插好 |
| 3. 查看交换机 MAC 表 | display mac-address | 没学到 MAC → 物理不通 |
| 4. 查看交换机 VLAN | display vlan 10 | 端口没加入 VLAN 10 |
| 5. 看端口类型 | display port vlan | Access VLAN 配错 |
| 6. 端口被 shutdown | display interface brief | 端口被手动关闭 |
七、思考
- 同一 VLAN 内两台 PC 通信,需要配置网关吗?为什么?
- 第一次 Ping 和第二次 Ping 的过程有什么不同?
- 为什么 ARP 表(15~45 秒老化)比 MAC 地址表(300 秒老化)老化快得多?
- 如果交换机端口配置成了不同的 Access VLAN,两台 PC 还能通信吗?为什么?
- 假设交换机 MAC 表为:AAAA→G0/0/1, BBBB→G0/0/2,这时 PC-A 给 PC-B 发帧,交换机还会泛洪到其他端口吗?
下篇预告:第8篇《跨VLAN通信为什么要三层接口》——理解不同VLAN间通信为什么需要三层接口的参与。