今天,当我尝试www.google.com
从路由器和电脑进行跟踪路由时,我发现了一种奇怪的行为。
路由器的跟踪路由
traceroute to www.google.com (173.194.38.176), 30 hops max, 40 byte packets
1 10.74.128.182 (10.74.128.182) 69.669 ms 10.74.128.178 (10.74.128.178) 36.885 ms 10.74.128.182 (10.74.128.182) 38.042 ms
2 10.74.128.181 (10.74.128.181) 36.468 ms 37.848 ms 35.048 ms
3 10.64.7.74 (10.64.7.74) 75.262 ms 10.64.7.86 (10.64.7.86) 44.339 ms 40.346 ms
4 kph-148-48.tm.net.my (203.106.148.48) 40.021 ms 48.847 ms 39.153 ms
5 10.64.7.90 (10.64.7.90) 41.705 ms 42.232 ms 40.001 ms
6 10.55.34.234 (10.55.34.234) 48.969 ms 48.335 ms 49.216 ms
7 * * 72.14.203.186 (72.14.203.186) 47.921 ms
8 209.85.242.240 (209.85.242.240) 61.557 ms 61.469 ms 47.117 ms
9 209.85.242.232 (209.85.242.232) 59.473 ms 61.54 ms 55.777 ms
10 72.14.233.105 (72.14.233.105) 64.806 ms 61.513 ms 59.459 ms
11 sin04s02-in-f16.1e100.net (173.194.38.176) 61.45 ms 56.76 ms 55.513 ms
PC 的跟踪路由
Tracing route to www.google.com [173.194.38.179] over a maximum of 30 hops:
1 1 ms <1 ms 1 ms router.asus.com [192.168.1.1]
2 118 ms 81 ms 118 ms 10.74.128.178
3 38 ms 37 ms 39 ms 10.74.128.177
4 45 ms 50 ms 72 ms 10.64.7.86
5 43 ms 41 ms 41 ms kph-148-48.tm.net.my [203.106.148.48]
6 * * * Request timed out.
7 * * * Request timed out.
8 * * * Request timed out.
And onwards like that…
Trace complete.
为什么有两个不同的地址(
10.74.128.182
和10.74.128.178
)?这是否意味着数据包在不同时间被路由到 2 个不同的路由器?如果是这样,为什么tracert
我的 PC(Windows 7)上的命令没有显示它?在路由器的跟踪路由中,第一和第二个跟踪的 IP(
10.74.128.178
和10.74.128.181
)都在同一个网络地址中,因为它是 A 类 IP,并按前 8 位(即 10)进行分类。因此,我只是想知道一个数据包如何发送到同一个网络中的两个路由器?为什么
tracert
我电脑上的命令显示空结果*
而kph-148-48.tm.net.my [203.106.148.48]
路由器tracert
命令却捕获了完整的跟踪?在路由器的跟踪路由中,第 4 行是公共地址(
203.106.148.481
),接下来的 2 个跳数是私有地址(10.64.7.90
和10.55.34.234
)。之后它又变回了属于 google 的公共地址(72.14.203.186
)。我以为私有地址在互联网上应该是不可路由的?当我尝试 ping 这两个私有地址时,我确实收到了回复。所以我只是想知道我的电脑如何能够访问公共地址后面的私有网络的 IP。
答案1
Traceroute 的工作原理是发送 IP 数据包,其 IP TTL(生存时间)值依次增加:1、2、3……每次跳跃都会减少 TTL。当 TTL 达到 0 时,数据包不会被路由,并且会向源发送 ICMP 超时消息,这就是运行 traceroute 的系统确定路由的方式。
这似乎是在许多 Linux 安装中发现的 traceroute 版本。此 traceroute 命令为每个 TTL 值发送三个数据包。因此,您看到的是两个数据包发送到 ,
10.74.128.182
一个发送到10.74.128.178
。由于这是路由器之后的第一个跳转,因此它可能是路由器的网关地址。 HSRP 或类似协议可能正在发挥作用:可能有两个设备使用浮动 IP 地址进行负载平衡。 例如:您使用网关地址 10.0.0.1,但在后台,它实际上指向
10.0.0.2
并10.0.0.3
共享负载。 这实际上是可能使用 HSRP。有类路由实际上不再使用。10.0.0.0/8 范围只是您的 ISP 正在使用的 RFC1918 IP 地址。不同版本的 traceroute 会发送不同的数据包。您在路由器上使用的 Linux 版本默认发送 UDP 数据包;您 PC 上的 Windows 版本发送 ping。看起来 ping 在跳数 5 和 6 之间被阻止了,但这只是猜测。在您的 PC 上尝试不同的 traceroute 实用程序,我敢打赌您会得到不同的结果。
您说得对。RFC1918 地址在公共互联网上不可路由。所以我的答案是,即使您在跳数 4 处看到公共 IP 地址,您也尚未离开 ISP。如果已经离开,则您不应该能够获得具有私有源地址的 TTL 过期消息。跳数 3 和 5 中的类似 IP 寻址也表明了这一点:它们都使用地址
10.64.7.0/24
(可能不是巧合)。可以这样说:IP 地址几乎是任意的,在自己的网络中,您的 ISP 可以自由地拥有具有公共和私有接口的路由器。跳数 3 和 4 就是这种情况。数据包在离开 ISP 网络后也有可能通过没有公共 IP 地址的路由器;在这种情况下,您不应该收到跟踪路由回复。