<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->
traceroute 是一个非常好用的用于跟踪路由包的工具,最基本的用法是 traceroute xxx.xxx.xxx.xxx
这条命令会输出从本机到指定ip 地址所经过的所有路由节点的ip ,以及一些时间等额外信息。
tranceroute 的实现原理,主要是依赖了ICMP(Internet Control Message Protocol) 协议,该协议 主要用于在网络中传递控制信息,包括一些出错信息等。协议定义了一些标准错误类型,其中有一项为:
ICMP_TIME_EXCEEDED, 该类型包含两个子类型:
ICMP_EXC_TTL 超过TTL
ICMP_EXC_FRAGTIME 超过片段重组时间
ICMP_EXC_TTL 是traceroute 实现的根本基础,原理如下:
假设A 主机使用traceroute 来跟踪至E 主机的路由途径,则A 会发送携带ICMP_ECHO (这是ping 命令的实现基础),且TTL 为1 的IP 包
显然,路由B 在收到该包时,由于TTL =1 ,则拒绝转发该包,并发送ICMP_EXC_TTL 代码给源地址。当A 收到该反馈后,会继续发送ICMP
包,并递增TTL ,使其加1 ,这样,则会找到路由表中的下一个路由跃点。以此方法,则可以获得全部的路由节点。
当然,这种方法返回的路径并不一定是完全正确,主要是因为复杂网络中的一些不可控因素或者动态路由的原因,使得结果不一定100 %
和实际情况吻合。
traceroute 工作原理(互联网)
Traceroute 程序的设计是利用ICMP 及IP header 的TTL (Time To Live )栏位(field )。首先,traceroute 送出一个TTL 是1 的IP datagram (其实,每次送出的为3 个40 字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router )收到这个datagram 时,它将TTL 减1 。此时,TTL 变为0 了,所以该路由器会将此datagram 丢掉,并送回一个「ICMP time exceeded 」消息(包括发IP 包的源地址,IP 包的所有内容及路由器的IP 地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL 是2 的datagram ,发现第2 个路由器...... traceroute 每次将送出的datagram 的TTL 加1 来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram 到达目的地后,该主机并不会送回ICMP time exceeded 消息,因为它已是目的地了,那么traceroute 如何得知目的地到达了呢?
Traceroute 在送出UDP datagrams 到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable 」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server 端也是没有所谓的Daemon 程式。
Traceroute 提取发 ICMP TTL 到期消息设备的IP 地址并作域名解析。每次 ,Traceroute 都打印出一系列数据, 包括所经过的路由设备的域名及 IP 地址, 三个包每次来回所花时间。
Traceroute 有一个固定的时间等待响应(ICMP TTL 到期消息) 。如果这个时间过了,它将打印出一系列的* 号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP ,TTL 到期消息的响应。然后,Traceroute 给TTL 记数器加1 ,继续进行。