traceroute
ICMP ttl递减
差错控制
1、主机可达
发送一个type = 8,code = 0的ICMP Request包,表示这是一个请求包,如果顺利的到达对应的主机,主机会发送一个type = 0,code = 0的ICMP Reply包。
如果发送方收到Reply包,就说明主机可达。
2、主机不可达
发送一个type = 8,code = 0的ICMP Request包,如果路由器中不存在到达目的IP的路由的时候,会返回一个type = 3,code = 1的ICMP包,表示主机不可达。
当发送方收到包后,发现type = 3, code = 1,说明主机不可达。
3、超时
当一个ICMP包中TTL等于0的时候,路由器会将其抛弃,然后给发送端发送一个ICMP包,对应的type = 11,code = 0。
给目标主机的不可达端口(30000+)发送UDP数据包,并且设置TTL
他从源主机到目的主机发送一连串的IP数据报p1-pn,并且数据报是无法交付的udp数据报。第一个数据报的TTL设置为1,这样当这个数据报转发到第一个路由器的时候,路由器收到后TTL减1,减完1之后发现TTL变为0,路由器会向源主机发送一个超时差错报告报文。
然后是第二个,第二个数据报的TTL设置为2,这样转发到第二个路由器的时候,TTL变为0,并会向源主机在发送一个超时差错报告报文,依次进行此操作。直到第n个数据报pn到达目的主机,但是由于数据报无法交付,因此目的主机会向源主机发送终点不可达差错报告报文。
通过这种方式,源主机就可以通过发送过来的超时差错报告报文和终点不可达差错报告报文来的得到经过的路由器以及往返时间等信息,达到路由跟踪的目的。
traceroute命令利用了“TTL超时”的报文。当使用traceroute命令时,发送使用UDP故意发送一
份TTL为1的IP数据包给目标主机,
处理,处理这根数据包的第一个路由器将TTL值减1,然后丢弃该数据包,并向发送返回一份
超时lCMP报文。这样trace命令就
得到了该路径中第一个路由器的地址,然后traceroute命令发送一份TTL值为2的数据包,第一
个路由器将数据包转发给第二个路
由器。而在第二个路由器上,数据包的TTL值被减为0,因此这个路由器将丢弃这个数据包并
向发送方返回ICMP超时信息,这
样就可以得到第二个路由器的地址。traceroute命令继续上述过程直至数据包到达目标主机。
traceroute命令如何判断数据包是否已经到达目标主机呢?实际上执行traceroute命令的设备发
送原始数据包时,它会选择一个几乎
不可能的值作为目标UDP端口号(大于30000),目标主机的任何一个应用程序都不可能使用该
端口。那么当该数据包到达目标主机
时,目标主机的UDP将产生一份代码为“端口不可达”的1CMP报文。而之前路由器返回的是“超
时”ICMP报文,这要traceroute
命令只要区分所接收到的CMP报文是“超时”还是“端口不可达”,就可以判断数据包是否已经到
达目的地了。