路由器LAN口IP为: 192.168.0.1
WAN口假设为: a.b.c.d
主机上设置默认网关为: 192.168.0.1
假设执行:
ping a.b.c.d -t 1
(发送TTL为1的报文) 会收TTL exceeded的ICMP报文吗? 如果会 是a.b.c.d 发来的还是192.168.0.1发来的?
谢谢大家
主机的IP: 192.168.0.103
路由:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 600 0 0 wlp4s0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp4s0
traceroute 外网的时候 一切正常, 前两跳都是一样的, 比如 traceroute 8.8.8.8 -n
,
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 192.168.0.1 5.202 ms 5.166 ms 5.144 ms
2 172.23.0.1 17.751 ms 18.034 ms 18.047 ms
traceroute -n 172.23.0.1
也一切正常
traceroute to 172.23.0.1 (172.23.0.1), 30 hops max, 60 byte packets
1 192.168.0.1 1.927 ms 1.886 ms 1.858 ms
2 172.23.0.1 16.365 ms 16.348 ms 16.330 ms
但是当 traceroute -n 172.23.18.237
, 发生了很奇怪的事..
traceroute to 172.23.18.237 (172.23.18.237), 30 hops max, 60 byte packets
1 172.23.18.237 2.990 ms 2.971 ms 2.968 ms
2 172.23.18.237 2.395 ms 2.418 ms 2.418 ms
发现 172.23.18.237
出现了两遍
然后我就想, 为什么第一跳不是网关192.168.0.1
回复我TTL超时而是172.23.18.237
, 而且既然到了172.23.18.237
为什么还要回个TTL exceeded
然后我就尝试设TTL为1来ping 一下 ping 172.23.18.237 -t 1
PING 172.23.18.237 (172.23.18.237) 56(84) bytes of data.
From 172.23.18.237 icmp_seq=1 Time to live exceeded
From 172.23.18.237 icmp_seq=2 Time to live exceeded
From 172.23.18.237 icmp_seq=3 Time to live exceeded
^C
--- 172.23.18.237 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2002ms
没想到竟然真是172.23.18.237
给我回的ICMP (明明TTL是1, 为什么不是192.168.0.1
?!)
TTL为2 ping 172.23.18.237 -t 2
可以正常ping通
PING 172.23.18.237 (172.23.18.237) 56(84) bytes of data.
64 bytes from 172.23.18.237: icmp_seq=1 ttl=64 time=13.1 ms
64 bytes from 172.23.18.237: icmp_seq=2 ttl=64 time=10.9 ms
我有两个疑惑..
192.168.0.1
, 而是 172.23.18.237
?172.23.18.237
, TTL为1时, 为什么 172.23.18.237
还要给我返回 TTL exceeded
(不是已经到了目的IP了吗)你的ping包处理顺序:
感谢解答 我开始也怀疑过,
可是在TTL 为1 时Ping 公网的时候(例如百度) 他会在192.168.0.1发送ICMP报文, 因为192.168.0.1转发的时候将TTL - 1, 然后发现是0 于是发送ICMP
PING baidu.com (183.232.231.172) 56(84) bytes of data.
From 192.168.0.1 icmp_seq=1 Time to live exceeded
From 192.168.0.1 icmp_seq=2 Time to live exceeded
From 192.168.0.1 icmp_seq=3 Time to live exceeded
这个也应该类似的是 192.168.0.1来发送吧 好奇怪...
@KimBing_Ng:
我上面说的可能不对,在192.168.0.1对TTL-1后,如果是0,192.168.0.1应该就不会再转发下一跳了。
ping 172.23.18.237 -t 1
的问题,你查一下你电脑是不是多个网卡,ping 172.23.18.237 -t 1
的时候走的应该不是192.168.0.1这个网关吧? tcpdump或者wireshark确认一下ping 172.23.18.237 -t 1
走的是那个网关。
@blackheart: wireshark 抓包, 从MAC地址来看, 确实是走向192.168.0.1
这是我主机的转发表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 600 0 0 wlp4s0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp4s0
太奇怪了 不知道是怎么回事
另外 172.23.18.237
应该是我路由器的另一个口的IP (这个IP我是从TPLink的管理页面找到的)
猜测一下可能是什么原因导致这个现象的呢... 实在想不明白了
@KimBing_Ng:
首先,是先-1,然后再判断是转发还是返回https://en.wikipedia.org/wiki/ICMP_Time_Exceeded
For example, every device (such as an intermediate router) forwarding an IP datagram first decrements the time to live (TTL) field in the IP header by one. If the resulting TTL is 0, the packet is discarded and an ICMP time exceeded in transit message is sent to the datagram's source address.
你图中给的示例确实看起来很奇怪(我用ttl=1来ping我自己的路由器的外部ip是可以的)。
@blackheart: 感谢测试! 我也搞不懂 算了