一句话
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 缓存,缓存里没有才广播询问。