一句话

IP 是”你要去哪”——你从一开始就知道。
MAC 是”这一步找谁拿”——每一跳临时问,问完就够用了。

IP 是你主动填的,MAC 是你无法提前知道的

你打开浏览器访问 8.8.8.8,你填的是 IP 地址。操作系统、应用程序、DNS 返回的都是 IP。整个互联网的寻址体系都建立在 IP 上,没有任何地方要求你知道对方的 MAC。

MAC 是网卡出厂时烧进去的硬件地址,全球唯一但对用户完全透明。你从来不会在浏览器里输入一个 MAC 地址。


即使在局域网内,你也无法提前知道 MAC

就算目标就在同一个局域网,你也不知道它的 MAC,原因很实际:

  • MAC 地址没有规律,AA:BB:CC:DD:EE:FF 看不出任何网络位置信息
  • 局域网里的设备随时加入、离开、换网卡,MAC 会变
  • 没有任何”MAC 地址簿”可以查,只能广播询问

所以唯一的办法就是广播问一句,这就是 ARP 存在的原因。


跨网络时 MAC 更没意义

如果目标 IP 不在本局域网,你压根不需要知道目标的 MAC,你只需要知道网关(路由器)的 MAC,把包交给它就行,剩下的路由器负责。

你想发包给 8.8.8.8

→ 查路由表:不在本网段,走默认网关 192.168.1.1

→ ARP 询问:192.168.1.1 的 MAC 是多少 ?

→ 封装帧,目标 MAC = 路由器的 MAC

→ 发出去,路由器接管后续

你只需要对网关做一次 ARP,目标的 MAC 你永远不需要知道,也永远不会知道。

查完路由表后,发现不在本网段后,走默认网关 这一步完全是电脑在做的

你的电脑                          路由器(192.168.1.1)
    │                                    │
    │── ARP 广播:"谁是 192.168.1.1?" ──►│  (交换机泛洪给所有人)
    │                                    │
    │◄── ARP 回复:"是我,MAC 是 xx:xx"  ──│
    │                                    │
  存入 ARP 缓存,封帧发出去

路由器在这里只是回答了一句话,它没有发起任何东西。整个询问流程是你的主机驱动的,时机也是主机自己判断的——发包前查 ARP 缓存,缓存里没有才广播询问。