1 | ╔══════════════════════════════════════════╗ |
交换机视角
描述的是交换机如何转发数据帧(主要根据 MAC 地址):
- 只处理带有目标 MAC 地址的数据帧;
- 查找 MAC 地址表(MAC→端口);
- 找到就从对应端口转发;
- 找不到就广播给所有端口(学习 MAC 表)
交换机负责在一个局域网内部,基于 MAC 地址,把帧“从 A 发到 B”
1 | ┌───────────────┐ |
主机视角
描述的是主机(如你的电脑)如何确定数据的发送方式:
主机知道自己和目标的 IP 地址;
一台主机知道目标 IP 地址,通常是因为用户告诉了它(通过域名、IP输入),或者它自己去查了(DNS/协议发现)
判断是否在同一个子网(通过子网掩码);
1 | 192.168.1.10 & 255.255.255.0 = 192.168.1.0 |
- 在同一子网:用 ARP 协议获取对方 MAC 地址,直接发送;
ARP 是一个用于将 IP 地址解析为 MAC 地址的协议。
在以太网通信中,尽管应用层用的是 IP 地址,但真正在数据链路层上传输的是 MAC 地址帧。因此,主机在发送数据时,需要知道目标设备的 MAC 地址 才能发送帧。
1 | Who has 192.168.1.3? Tell 192.168.1.1 |
你访问的所有外部网站,其实都走的是“先发给你家路由器的 MAC 地址”,然后由路由器转发出局。
不在同一子网:用 ARP 获取默认网关的 MAC 地址,把数据发给网关
主机存有默认网关(通常是路由器)的 IP 地址
路由器视角
描述的是路由器根据 IP 地址来决定下一跳:
- 处理目标 IP 地址的数据包;
- 查找路由表(IP→下一跳);
- 查到就从指定接口发出;
- 查不到就回送一个不可达 ICMP 报文。
你主机 IP 是:192.168.1.10
目标 IP 是:10.0.0.3
你发不出去 → 把包交给默认网关(比如:192.168.1.1
)
路由器会查它的路由表:
1 | Destination Next Hop Interface |
发现 10.0.0.0/24
这个目标网段要通过 eth1
口发出去,下一跳是 192.168.2.2
,于是它就把你的包从 eth1
发出。
整体流程回顾:主机 → 路由器 → 目标主机
你是主机A(192.168.1.10),想访问主机B(10.0.0.3),它不在你的子网:
主机端:
- 你发现 10.0.0.3 不在同一子网;
- 你查到默认网关是 192.168.1.1;
- 你发 ARP 问:“谁是 192.168.1.1?” → 得到 MAC 地址;
- 把数据包(目标 IP 是 10.0.0.3)发送给 网关的 MAC。
路由器端:
- 路由器收到包后查看 IP 层的目标地址 → 是
10.0.0.3
; - 查自己的路由表:这个 IP 要走
eth1
接口; - 看看这条路径的 下一跳(next hop) 是谁,比如
10.0.0.1
; - 然后发 ARP 请求:“谁是 10.0.0.1?”;
- 得到回应:10.0.0.1 对应 MAC 为
AA:BB:CC:DD:EE:FF
; - 构造帧,目的 MAC 就是这个,然后从
eth1
发出。
场景假设:
你电脑(主机A,IP: 192.168.1.10
)要访问远程主机B(IP: 10.0.0.3
),它不在你的子网。现在一步步讲这个数据包是怎么走出去的,三者怎么配合。
✅ 第一阶段:主机如何发送数据?
🧠 主机要解决:
- 目标 IP 是谁?
- 我和它是否在同一个子网?
- 我要把包发给谁?目标设备还是路由器?
✅ 主机操作:
- 判断目标 IP
10.0.0.3
不在同一子网(比如掩码/24
); - 查到默认网关是
192.168.1.1
; - 查 ARP 表:有没有
192.168.1.1
对应的 MAC 地址?- 没有 → 发 ARP 请求:
Who has 192.168.1.1?
- 收到回应 → 得到 MAC 地址;
- 没有 → 发 ARP 请求:
- 构造数据帧:
- IP 层目的地 IP =
10.0.0.3
- 帧目标 MAC =
192.168.1.1
的 MAC
- IP 层目的地 IP =
- 把帧发出去给交换机
✅ 第二阶段:交换机如何中继数据?
🧠 交换机只看 MAC 地址(不看 IP)
- 收到帧,看到目标 MAC 是
AA-BB-CC-DD-EE-FF
(路由器的 MAC); - 查 MAC 地址表,发现这个 MAC 在端口 2;
- 把帧从端口 2 转发给路由器;
- 不修改任何内容,纯转发,像“局域网邮递员”。
✅ 第三阶段:路由器如何转发数据?
🧠 路由器要解决:
- 目标 IP 是哪里?我该从哪个接口发出去?
- 目标主机在哪个子网?是否直接可达?
✅ 路由器操作:
- 查看 IP 头,目标是
10.0.0.3
; - 查自己的路由表,发现:
10.0.0.0/24
可达,通过eth1
接口;- 下一跳是
10.0.0.1
- 查 ARP 表:
10.0.0.1
对应 MAC 有吗?- 没有 → 发 ARP 请求:
Who has 10.0.0.1?
- 得到回应后,记录 MAC 地址;
- 没有 → 发 ARP 请求:
- 构造新的以太网帧:
- 源 MAC = 路由器接口 MAC
- 目标 MAC =
10.0.0.1
的 MAC - IP 层仍然是目标 IP =
10.0.0.3
- 把帧从
eth1
发出去
1 | ┌──────────────┐ |