TCP/IP协议:Traceroute

506 阅读3分钟

简介

traceroute是一个网络工具,用监测源主机到目的主机间所经过的所有路由节点详情。通过这个工具可以查看源主机到各个分节点路由器的时间,可排查源主机到目的主机间哪个节点出现了延迟或者阻塞。

原理

traceroute是利用ICMP报文来监测每一个节点的路径。

IP数据报首部有一个TTL值,用来指示一个数据报在传输工程中最多可以经过的节点数。初始值为源主机设置,一般默认为64。每经过一个节点,TTL值就会自动减1,直到某一个节点收到TTL为0但该节点又不是目的IP时,该节点路由器就会发送一个ICMP超时数据报到源主机,报告所发送的数据报超时。

traceroute就是利用ICMP的这一特性,刚开始发送一个TTL为1的UDP数据包到目的主机,这样经过第一个路由器节点时TTL减为0了,第一个路由器节点就会发送一个ICMP数据包返回源主机,而这个ICMP报文的源地址就是路由器的地址,traceroute就能通过这条ICMP报文获取到第一个路由器地址。紧接着继续发送第二个UDP数据报,将TTL设置为2,同样的道理也获取到了第二个路由器节点地址。依此类推,TTL不断加1,直到UDP数据报到达目的主机。这样就能得到每一个经过的路由器节点了。

但这里有一个问题,如果数据报刚好到达目的主机,这时候虽然TTL被减为0但也不会发送ICMP数据报了,因为数据报已经到达目的地址了。这时就不能确定是否继续发送TTL加1的数据报或数据报是否已到达目的。所以traceroute工具用了一个巧妙的方法,就是发送的UDP数据包目的端口设置了一个不可能的值,这样当到达目的主机后,由于找不到目的端口就会由源主机响应回一个端口不可达的ICMP报文。这样源主机只要判断收到的ICMP报文是端口不可达报文时就会停止继续发送UDP监测数据了,这样结合之前的超时ICMP报文就能获得完整的链路列表了。

应用

xxx@MacBook-Air ~ % traceroute www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 36.152.44.95
traceroute to www.a.shifen.com (36.152.44.95), 64 hops max, 52 byte packets
 1  192.168.1.1 (192.168.1.1)  10.387 ms  3.317 ms  3.016 ms
 2  * * *
 3  * * *
 ...

这个例子中通过traceroute百度官网来测试输出情况,第一行中1表示TTL的值,接着是经过的路由器地址192.168.1.1,这个地址刚好是我这个主机的局域网网关地址,接着是三个时间值,表示该数据报发送了三次,每次的数据报往返时间值,即数据报从源主机发送到源主机收到ICMP响应的时间间隔。默认情况下,每个TTL值的数据报traceroute都会发送三次,第一次10ms,比后面的3ms大,这是因为第一次会有ARP请求。TTL为2和3时,输出三个星号,traceroute用一个星号表示发送的一个数据报在5秒内没有收到ICMP响应的情况。有些路由器不支持发送ICMP超时响应,就会出现这种情况,但traceroute依然会不断尝试直到尝试64次后结束(64 hops max)。