网络跟踪命令 tracert 的使用

介绍

Tracert是路由跟踪程序,用于确定 IP 数据报访问目标所经过的路径

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\>tracert www.baidu.com

通过最多 30 个跃点跟踪
到 www.a.shifen.com [14.215.177.37] 的路由:

1 1 ms 1 ms 1 ms 192.168.2.1
2 * * 2 ms 49.106.38.59.broad.fs.gd.dynamic.163data.com.cn [59.38.106.49]
3 5 ms 5 ms * 202.105.158.50
4 * 11 ms 7 ms 113.96.4.50
5 * * * 请求超时。
6 6 ms 6 ms 6 ms 14.29.121.198
7 * * * 请求超时。
8 ^C

这里显示了从自己的电脑到百度的服务器,所经过的路径。
一共有5列,第一列是序号,第2,3,4列,是消息的响应时间(发了三次)。第5列,路由的ip。

会有一些中间路由,它不回应icmp消息,于是会出现*号与请求超时

对应抓包结果

Echo request

ICMP(网络控制报文)协议

ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。

虽然ICMP是包含在IP数据包中的,但是对ICMP消息通常会特殊处理,会和一般IP数据包的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个导致ICMP讯息被传送的IP数据包。

尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下

  • ICMP差错报文不会产生ICMP差错报文(出IMCP查询报文)(防止IMCP的无限产生和传送)
  • 目的地址是广播地址或多播地址的IP数据报。
  • 作为链路层广播的数据报。
  • 不是IP分片的第一片。
  • 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。

原理

Tracer接收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。

有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较 小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号>30000(真变态)的UDP报,所以到达目的主机的时候,目的 主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。

参考

https://zh.wikipedia.org/zh-cn/%E4%BA%92%E8%81%94%E7%BD%91%E6%8E%A7%E5%88%B6%E6%B6%88%E6%81%AF%E5%8D%8F%E8%AE%AE
https://tools.ietf.org/html/rfc792
http://hichuann.blog.51cto.com/1024435/1570325
https://jingyan.baidu.com/article/9c69d48f4df25713c8024e66.html
http://tech.techweb.com.cn/thread-1496-1-1.html
http://blog.csdn.net/inject2006/article/details/2139149