traceroute 主要用途
traceroute 利用 ICMP 差错报文,主要用来确定这几件事:
- 确定通信双方路径上经过的路由器设备
- 确定 UDP 包是否成功达到目的地
- 发现路径 MTU
(1) 确定通信双方路径上经过的路由器设备 。利用 IP 包的 TTL 字段和超时类型的 ICMP 报文来实现。首先, traceroute 向目的地发送 IP 包,刚开始的时候,将 TTL 设置为 1,当经过第一个路由器时,TTL -1 = 0 引发超时错误,第一个路由器回复 ICMP 超时报文,源主机就可以知道路径第一个路由器的信息,随后 TTL 被设置为 2、3、4, …,直到到达目的地,这样,沿途每个路由器都会向源主机回复 ICMP 超时报文, traceroute 就可以拿到所有的路由器信息了。
不过这里要 注意 ,并不是所有路由器都会返回 ICMP 报文,因为出于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器都默认配置为不返回任何 ICMP 报文,管理员也会主动配置,所以这时使用 traceroute 就不一定能拿到所有路由器信息了。
(2) 确定包是否成功达到目的地 。使用上面的方法能拿到路由器信息,但并不能确定发的包是否到达目的地。traceroute 通过设置所发 UDP 包的端口号来解决了这个问题,因为 UDP 包的可用端口号范围 <3000,只要在发送 UDP 包的时候填入一个 >3000 的端口号,当包到达了目的地,但是由于端口不匹配,就会返回一个端口不可达的 ICMP 报文,这样源主机就可以确定包确实到了目的地了。
(3) 发现路径 MTU 。利用了 “需要分片但设置了不分片位” 类型的 ICMP 报文,如果某个源主机在发送一个 IP 包之前,对该 IP 包中的首部字段 DF 位设为 1,也就是“分片禁止位=1”,表示该包在传输的过程中不允许分片,如果中间某个路由器允许传输的最大路径 MTU 小于该包大小,就需要分片才能传输,但是由于设置了不分片位,路由器会将该包丢弃,并向源主机发送一个携带 MTU 信息的 ICMP 包,提醒源主机下次发包的大小不应超过该 MTU 的值。traceroute 就可以利用这种类型报文来逐一地确认传输路径上各个路由器之间的 MTU 值。