当你尝试访问一个 IP 地址时,系统会首先检查该目标 IP 地址是否在本地网络(同一个子网)内。具体的流程如下:
1. 检查目标 IP 地址是否在本地网络
- 子网检查: 计算机会使用本地的 IP 地址和子网掩码来判断目标 IP 是否在同一个子网内。
- 在同一个子网内: 如果目标 IP 地址与本机在同一个子网(即本地网络)内,系统将认为该 IP 地址可以通过二层网络(即直接通过以太网)访问。
- 不在同一个子网内: 如果目标 IP 地址不在同一个子网内,系统会决定通过默认网关或路由表中的其他路由项来发送数据,这涉及到三层网络(L3)的路由。
2. ARP(地址解析协议)查询
- 在本地网络内(同一子网):
- 如果目标 IP 地址在同一个子网内,系统会检查本地 ARP 缓存,查看是否已经有对应的 MAC 地址。
- 如果 ARP 缓存中没有该目标 IP 地址的 MAC 地址,系统将发送一个 ARP 请求,广播到本地网络,以请求目标 IP 地址的设备回复其 MAC 地址。
- 收到目标设备的 ARP 响应后,系统会将该 MAC 地址和 IP 地址的映射缓存到本地 ARP 表中,然后使用这个 MAC 地址来封装二层帧并发送数据。
- 不在本地网络内(跨子网):
- 如果目标 IP 地址不在同一个子网内,系统会查找路由表,决定通过哪个网关(通常是默认网关)来转发数据包。
- 系统会首先检查 ARP 缓存中是否有该网关 IP 地址的 MAC 地址。如果没有,会发送 ARP 请求以获取网关的 MAC 地址。
- 获取到网关的 MAC 地址后,系统将数据包的目标 MAC 地址设为网关的 MAC 地址,然后将数据发送到网关。网关会继续处理该数据包并转发到目标网络。
3. 路由查找
- 查找路由表: 在确定目标 IP 不在本地子网后,系统会查找路由表,确定下一跳(next hop)地址和接口。这一步是三层网络的操作。
- ARP 解析网关: 路由表中指定的下一跳(通常是网关)的 IP 地址,然后再次通过 ARP 协议获取这个网关的 MAC 地址。
4. 总结:
- 同一子网: 如果目标 IP 在同一个子网内,系统会直接通过 ARP 协议获取目标 IP 的 MAC 地址,然后在二层进行通信。
- 不同子网: 如果目标 IP 不在同一子网内,系统首先查找路由表,确定通过哪个网关发送数据包,然后使用 ARP 协议获取网关的 MAC 地址,并将数据包发送到该网关。
所以,先通过路由找到下一跳地址 和 使用 ARP 找到 MAC 地址 是一个递进的过程。对于不同子网的目标,路由查找先于 ARP,而对于同一子网的目标,直接进行 ARP 查询。