![一个 ISP 在一条路由中两次出现相同的 IP 是正常的吗?](https://linux22.com/image/1556637/%E4%B8%80%E4%B8%AA%20ISP%20%E5%9C%A8%E4%B8%80%E6%9D%A1%E8%B7%AF%E7%94%B1%E4%B8%AD%E4%B8%A4%E6%AC%A1%E5%87%BA%E7%8E%B0%E7%9B%B8%E5%90%8C%E7%9A%84%20IP%20%E6%98%AF%E6%AD%A3%E5%B8%B8%E7%9A%84%E5%90%97%EF%BC%9F.png)
如果我从家庭网络进行跟踪路由,我会在路由器后面连续两次看到相同的 IP:
1 1 ms 1 ms 1 ms router
2 17 ms 16 ms 16 ms 217.0.117.61
3 16 ms 16 ms 16 ms 217.0.117.61
4 17 ms 17 ms 17 ms 87.186.233.102
5 26 ms 24 ms 24 ms 217.239.39.2
6 24 ms 24 ms 25 ms ...
这是正常的吗?或者可能是 ISP 的错误配置?
答案1
如果这种情况发生一次或很少发生
所有 IP 数据包都有一个生存时间(生存时间) 字段。每个转发数据包的路由器都会将此字段减一。如果路由器将 TTL 减为 0,则会丢弃该数据包并生成ICMP TTL 已超出错误数据包并将其发送回发起者。
Traceroute 使用此功能发送具有连续增加的 TTL 的数据包。这允许 traceroute 构建源和目标之间的路径图。
就你的情况而言,从你的路由器到 217.0.117.61 可能有两条路径,其中一条比另一条长。因此,发生的情况是:
- 发送的 TTL=1 的数据包到达您的路由器,路由器作出了答复。
- 发送的数据包TTL=2
- 到达你的路由器,路由器将 TTL 减为 1 并发送它,
- 然后到达 217.0.117.61,它应答了。
- 发送的数据包TTL=3
- 到达你的路由器,路由器将 TTL 减为 2 并将其发送出去,
- 然后到达某个未知的路由器,该路由器将 TTL 减为 1 并将其发送出去,
- 然后到达 217.0.117.61,它应答了。
这就是你两次输入相同条目的原因。情况可能会更糟,每一个IP 列出了两次,但显然给出第一个 217.0.117.61 答案的路由器从未再次参与跟踪,因此所有后续数据包都通过了从未返回 IP 的未知路由器。
如果这种情况总是发生
那么这是因为你的 ISP 设置网络的方式。你列表中的 IP 属于德国电信公司,该公司拥有庞大的内部网络,其中有高性能的复杂节点,其中一个节点似乎应答了两次。
有几种可能的解释:
ISP 拥有一个可以响应路由跟踪请求的防火墙。企业防火墙本身就是一台专用计算机。如果经过编程,它可能会使用编程的 IP 地址(可能是它所保护的节点的 IP 地址)来响应路由跟踪请求。
企业路由器可以从其内部和外部接口进行应答。这种高速高吞吐量路由器实际上是一个以专用子路由器为组件的盒内网络。应答可能来自面向前和面向后的子路由器,并使用相同的 IP 进行应答。
答案2
由于这种情况一直在发生,我认为最有可能的原因是路由器固件中的一个错误,导致它无法在应该丢弃跟踪数据包时丢弃跟踪数据包(并发送“TTL 超出”报告),或者在应该发送之前发送跟踪数据包。以下是第一个问题的示例BSD 跟踪路由手册页:
A sample use and output might be:
[yak 71]% traceroute nis.nsf.net.
traceroute to nis.nsf.net (35.1.1.48), 30 hops max, 56 byte packet
1 helios.ee.lbl.gov (128.3.112.1) 19 ms 19 ms 0 ms
2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms
3 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms
4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 39 ms 40 ms 39 ms
[...]
Note that lines 2 & 3 are the same. This is due to a buggy kernel on the
2nd hop system - lbl-csam.arpa - that forwards packets with a zero ttl (a
bug in the distributed version of 4.3 BSD).
在这个例子中,第二个路由器有错误,第三个路由器最终被列为#2和#3。
另一方面,考虑一下如果第二个路由器有一个错误,导致它在 TTL 达到 1 而不是 0 时丢弃数据包,会发生什么:
- 发送的 TTL=1 跟踪数据包在第一个路由器处递减为 0,路由器会丢弃该数据包并报告 TTL 超出,因此该数据包显示为跳数 #1。一切顺利。
- 发送的 TTL=2 数据包在第一个路由器上递减为 1;然后第二个路由器将其递减为 0,并丢弃并报告它,因此它显示为跳数 #2。同样,这里一切正常。
- 以 TTL=3 发送的数据包在第一个路由器上递减为 2;然后第二个路由器将其递减为 1,并错误地丢弃和报告它,因此它显示为跳数 #3。
再次,第二个路由器有错误,但在这种情况下,第二个路由器被列出两次(在手册页的示例中,第三个路由器被列出两次)。