tracert一个常用的网络诊断工具,用于追踪在访问目的地址的时候会经过哪些中间路由,并将这些中间路由记录下来。
tracert/traceroute的实现原理,有两种方法:1、基于ICMP报文实现 2、基于UDP报文实现的
windows不指定参数默认是基于icmp实现的(-d选项的添加时为了避免DNS查找造成的额外时间消耗)
请求包:
回包:
实现原理
tracert发出TTL值为1的ICMP数据包,当到达路径上第一个路由器时,路由器会将TTL减1,此时TTL值为0,该路由器将此数据包丢弃,并向源地址返回一个ICMP超时报文,当主机收到该数据包,获得了这个路径上的第一个路由器的地址;tracert再发送另一个TTL为2的数据包,第一个路由器会将此数据包转发给第二个路由器,当TTL=0,第二个路由器返回一个超时通知,tracert得到第二个路由器地址..
Tracert每次发出数据报时便会将TTL加1,发现下一个路由器
这个动作一直重复,直到到达目的地或者确定目标主机不可到达为止
每次检测都同时发送3个数据包,因此打印出来三个时间。
linux不指定参数默认是基于udp实现的(添加-I选项,这时候会通过ICMP协议跟踪)
安装:yum install traceroute
发包
回包
原理区别:
利用UDP+ICMP不可达消息,发送一个UDP报文,TTL值为1,目的UDP端口号是大于30000的一个数,因为在大多数情况下,大于30000的UDP是任何一个应用程序不可能使用的端口号。
补充:
TTL(time-to-live存活时间):
某个IP数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。(这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样。)有了TTL机制后,即使存在路由环路,ip报文的运动时间是有限的(TTL是ip报文中的一个字段 最大值255 每经过一个路由器数值减1;有防止环路的作用)
不同的操作系统默认下TTL是不同的。默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。(ping 本机地址可以看出TTL初始值)
禁用主机被tracert方式:1、禁用icmp 2、禁用udp 30000以上端口访问