如果我从家庭网络 ping 192.168.0.X,那么它会尝试在我的网络内查找该地址,而不是外部 WAN IP。但是我可以 ping 74.125.224.163,它会 ping google.com。
我可以将我的内部网络设置为 74.125.224.X,然后如果我尝试 ping 的话,它会再次只在我的网络内查看,但我想(我没有尝试更改它)我仍然可以通过同一个 IP 地址与 Google 的服务器进行通信。
这是在什么层面上分离的?数据包如何知道 IP 地址的目的地是前往 WAN 而不是 LAN?
答案1
数据包什么都不知道——它们只携带目标地址;行进的路径由路由表保存在你的计算机中,你的路由器以及互联网中的其他路由器。
当数据包从您的计算机发送时...
操作系统首先检查目标地址是否已分配给计算机中的任何网络接口。如果是,操作系统将自行使用该地址 - 数据包不会发送到计算机之外的任何地方。
否则,它会在路由表中查找与目标地址匹配的所有路由。可能会有多个路由 - 操作系统会选择具有最长匹配“前缀”的路由。
如果没有与目标地址匹配的路由,则数据包将被丢弃。
例如,如果您自己的地址是192.168.1.1
...
您的计算机的路由表可能如下所示:
10.11.12.0/24
ppp0
可以通过界面直接访问192.168.1.0/24
eth0
可以通过界面直接访问10.42.0.0/16
可以通过10.11.12.50
0.0.0.0/0
可以通过192.168.1.254
后面的数字
/
表示要比较多少位;参见CIDR 表示法。例如,如果是/16
,则两个地址的前 16 位(从最左边的位开始)必须相等。如果是/0
,则不进行比较,因此路由将匹配任何地址 - 这是“默认路由”。实际路由表也有指标——例如,如果您通过以太网和 WiFi 将笔记本电脑连接到 LAN,那么它将有两条相同的路由到同一网络,但以太网路由的指标会较低,因为它比 WiFi 更快。为简单起见,我在这里省略了指标。
如果你 ping
192.168.1.5
,操作系统将会:- 寻找路线
192.168.1.5
- 寻找路线
192.168.1.0/24
和0.0.0.0/0
- 选择路线
192.168.1.0/24
,因为它有较长的前缀(24 > 0) - 看到路由指向
eth0
接口 eth0
通过电缆发送数据包
数据包将通过以太网(或 WiFi,或...)直接到达目标计算机。
- 寻找路线
如果你 ping
74.125.224.163
,操作系统将会:- 寻找路线
74.125.224.163
- 查找路线
0.0.0.0/0
- 看到路线有网关
192.168.1.254
- 寻找
192.168.1.254
通往可直接到达(无需经过第二个网关) - 查找路线
192.168.1.0/24
- 看到路由指向
eth0
接口 eth0
通过电缆发送数据包
数据包将通过以太网(或 WiFi,或...)到达
192.168.1.254
(您的家庭路由器),然后使用其自己的路由表重复相同的过程并将数据包发送到下一跳(您的 ISP 的路由器)。- 寻找路线
(因此,如果您与 Google 拥有相同的网络,您将无法再访问 Google,因为总是会首先选择到您自己网络的路由。)
答案2
不会,您的计算机不会首先尝试在您的家庭网络内查找该地址。它会查看路由表。
该表包含以下事项的规则
- 该 IP 是否与显式 IP 匹配(使用 route add -net 添加)。然后通过此接口将其发送出去
- IP 是否属于列出的网络范围,然后通过特定接口将其发送出去。
- 如果全部失败,则通过指定的接口将其发送到默认网关。
表中没有特定的“内部”网络与“外部”网络。
然而,具有单个 NICm 交换机和路由器的典型设置通常会按如下方式填充这些表格:
- 如果它是我自己的(本地主机 127.x 范围或自己的 IP),那么通过环回设备将其“发送出去”。
- 如果它是用于本地网络(它知道,因为您设置了具有 IP 地址和网络掩码的 NIC),则通过本地以太网将其发送出去。
- 如果不匹配,则将其发送到默认网关(即本地网络上的路由器)。
计算机并不关心数据包如何到达目的地。它所知道和需要知道的只是本地该做什么,其余的事情交给委托人去做。
这可能和你的问题很相似,但数据包并不知道该如何传输。本地计算机使用本地路由表来决定如何处理数据包。
现在,如果您将内部网络设置为 74.125.224.X 并尝试 ping(使用更新的路由表),网络堆栈将识别出您正在尝试 ping 自己的 IP。您将从自己的计算机获得 ping 的答案。由于您不是 Google,您可以忘记谷歌搜索通过搜索引擎寻找答案。它永远不会到达真正的谷歌计算机。
与它们通信将是不可能的,因为它们的数据包永远不会离开你的计算机。相反,它们将通过环回路由回来。
如果您禁用环回或明确告诉您的计算机将这些数据包推送到默认路由器和互联网,那么您将得不到答复。所有其他计算机仍将其数据包转发到真实的谷歌的计算机,而不是您的网络。
答案3
您的计算机有一个子网掩码以及 IP 地址。您的网络软件使用子网掩码来确定 IP 地址是位于您的本地子网(因此可以直接联系)还是位于另一个网络(因此必须通过您的默认网关联系)。
如果您更改 IP 地址,使 Google 服务器与您的计算机位于同一子网(由子网掩码定义),则您惯于能够与 Google 服务器通信。