ping 命令内部如何工作

ping 命令内部如何工作

我有 Ubuntu 18.04 和附加的两个网络接口(eth0 和 wlan0)。因此,我实际上有两个 LAN(例如 LAN1 和 LAN2)。当我简单地发出 ping 命令(如 ping 后跟一些 IPv4/IPv6 地址)时,它在内部如何工作?我有以下问题。请帮助清除这些。

  • ping 如何找到到达该地址的路由?
  • ping 使用哪个接口到达目标地址? (LAN1 或 LAN2 或两者)
  • 两个接口是否按特定顺序相继尝试?
  • 当地址来自本地网络之一的主机时,它在内部如何工作? (局域网1或局域网2)
  • 当目标地址不属于本地网络(LAN1 或 LAN2)时,它如何工作。 ping 命令如何到达网关?它如何选择网关?有没有预先定义的顺序?

答案1

您的操作系统维护一个路由表,告诉它数据包应该去哪里。该表还用于记录数据包来自哪个地址。

然后,您可以编程source.sin_addr.s_addr=htol(INADDR_ANY);以表明之前bind()未指定源地址。 (默认情况下未指定,但如果您想bind()仅用于绑定源端口,则此行很有用。)

请注意,该-B选项使ping绑定套接字,然后可以修复第二个及后续源地址。可以-I绑定一个设置源地址的接口。

这或多或少地回答了前三点。

关于从 LAN1(假设为 10.0.1.5) ping 到 LAN2(10.0.2.5)的情况

10.0.1.5 使用其路由表指示可通过 10.0.1.1(网关)访问 10.0.2.0/24。它向该以太网地址发送一个 ping“从 10.0.1.5 到 10.0.2.5”。然后网关看到它,发现10.0.2.5可以通过LAN2直接到达并转发数据包。从 10.0.2.5 到 10.0.1.5 的答案遵循相同的模式。

第四点就比较棘手了。使用公共地址,它可以完美地工作,因为所有网关都会交换其路由,并且每个人都知道谁在哪里(通过哪个网关)。有时,路由表很简单:LAN1 可以通过接口 eth0 直接访问,其他所有内容都可以通过 LAN1 上的路由器 X 访问。但对于许多用途,我们使用本地地址:无法从 Internet 访问 10.0.0.5 地址。然后,当 10.0.0.5 发送 IP 数据包时,路由器将 from 地址更改为 Internet 路由器已知的公共地址,并记住交换机。当答案返回到公共地址时,路由器(已记住交换机)恢复实际地址(10.0.0.5)并且10.0.0.5可以得到其响应。

相关内容