第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 端口被手动关闭

七、思考

  1. 同一 VLAN 内两台 PC 通信,需要配置网关吗?为什么?
  2. 第一次 Ping 和第二次 Ping 的过程有什么不同?
  3. 为什么 ARP 表(15~45 秒老化)比 MAC 地址表(300 秒老化)老化快得多?
  4. 如果交换机端口配置成了不同的 Access VLAN,两台 PC 还能通信吗?为什么?
  5. 假设交换机 MAC 表为:AAAA→G0/0/1, BBBB→G0/0/2,这时 PC-A 给 PC-B 发帧,交换机还会泛洪到其他端口吗?

下篇预告:第8篇《跨VLAN通信为什么要三层接口》——理解不同VLAN间通信为什么需要三层接口的参与。