traceroute, 也就是 trace route,跟踪路由。这个程序最早是Van Jacobson实现的。源码在网上可以找到,不过我还没有去找。主要的原理是IP路由过程中对数据包TTL(Time to Live,存活时间)的处理。当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检验和checksum变化)。每收到一个包,检查这个 的TTL是否是0或1。如果是,表明这个包还没有到达目的地,而且剩余时间不多了,肯定是到不了目的地了。这样路由器就简单地丢弃这个包,并给源主机发送 ICMP通知,说这个包已经超时了。ICMP的通知信息里包含当前路由器发送时所用的IP。
这样就可以通过构造数据包,来间接检查到 达一个主机时经过了哪些路由。一开始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发通知说包超时,这样就可以记录下 所经过的第一个路由器的IP。然后TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个相同,丢包,发通知说包超时了,这样记录下第二个路 由器IP,由此可以一直进行下去,直到这个数据包到达目标主机,由此打印出所有经过的路由器。
在通信中,IP层只负责数据的路由与传 输,并不处理数据包的内容。例如ICMP,或TCP,UDP,这些协议是依赖IP层的传输功能来传送数据的。在通信双方的主机中,收到这些协议的数据包 后,一般在通信的对应主机上,会有程序来处理这些数据。而直接的IP数据报是没有用处的(win2000的驱动层可以直接使用IP报而不需要加上其他协 议,但是一般是不会这样用的)。因此traceroute程序发送一个UDP包来试探。对路由器来说,UDP数据报只是IP数据报的一种,它并不关心 UDP数据报的具体内容。直到这个包到达目的端的主机会,目的主机的内核会解析UDP数据报,并查找数据报中要求端口是否已经有进程在使用。如果找到,则 通知进程有数据到达。而如果找不到,则发送一个”目的端口不可达”的ICMP错误数据回到源主机。
这样就可以完全确定下来。traceroute建立一个UDP数据包,不断修改TTL值并发送出去,如果收到”超时错”,表示刚刚到达的是路由器,而如果收到的是”端口不可达”错误,表示刚刚到达的就是目的主机。这样路由跟踪完成,程序结束。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177322.html原文链接:https://javaforall.net
