
第一种可能:NAT
当TTL= 3 时,ICMP到达第三跳,这时TTL通过三次减1操作,TTL变为0,需要报错,但这个第三跳路由器使用私有IP,恰好还有缺省路由(指向第二跳)、或有明细路由(也指向第二跳),于是回包到达第二跳,第二跳需要把第三跳的私有IP替换成自己的,于是就发生了题主看到的一幕。
这种可能性比较小,一般缺省路由会指向上游(第四跳),而不会指向下游(第二跳);拥有源主机公网明细路由的可能性也比较小(比缺省路由的可能性大)。
第二种可能:MPLS + NAT
第三跳为MPLS/P路由器,虽然没有源主机的路由,但知道第二跳、或第四跳PE路由器会有源主机的路由,于是使用原有的ICMP Echo 包的Label来发ICMP TTL Expired消息,到达第四跳PE,第四跳再调转方向发回到第二跳PE,第二跳做NAT操作,于是就发生了题主看到的一幕。
这种可能性更大。
第三种可能:第二跳TTL-2 操作
无论是TTL = 1,TTL=2,最后减2的结果都是0(TTL 为1时,减2也是0,不会为-1),好像包经过了两跳路由器。
这种可能性比较小,这个算BUG了。
