请教如何用C语言实现tracert命令
请教一下高手如何用C语言实现tracert命令,并能在linux下用gcc编译实现。 问题点数:0、回复次数:2Top
1 楼fancyf(凡瑞)回复于 2005-04-02 20:36:32 得分 0
tracert的原理就是发送不同TTL的数据包到目标网址,当经过路由器TTL应该至少减一,TTL减为零时路由器会向发送源传递相应的数据包,就是根据这个数据包来取得这个路由器的IP。因此只要从1开始设定不同的TTL向目标发送数据包,接收发回来的数据包,直到到达目的地就可以了Top
2 楼szwpc(风色鸟)回复于 2005-04-03 21:08:00 得分 0
哈哈,具体怎么实现,我也不怎么懂。帮你顶一下吧。外加放点东西吧。
当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检验和checksum变化)。
每收到一个包,检查这个的TTL是否是0或1。如果是,表明这个包还没有到达目的地,而且剩余时间不多了,肯定是到不了目的地了。这样路由器就简单地丢弃这个包,并给源主机发送 ICMP通知,说这个包已经超时了。
ICMP的通知信息里包含当前路由器发送时所用的IP。
根据上述原理,就可以通过构造数据包,来间接检查到达一个主机时经过了哪些路由。
一开始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发通知说包超时,这样就可以记录下所经过的第一个路由器的IP。
然后TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个相同,丢包,发通知说包超时了,这样记录下第二个路由器IP。
由此可以一直进行下去,直到这个数据包到达目标主机,由此打印出所有经过的路由器。
在通信中,IP层只负责数据的路由与传输,并不处理数据包的内容。
例如ICMP,或TCP,UDP,这些协议是依赖IP层的传输功能来传送数据的。
在通信双方的主机中,收到这些协议的数据包后,一般在通信的对应主机上,会有程序来处理这些数据。
而直接的IP数据报是没有用处的。
因此traceroute程序发送一个UDP包来试探。
对路由器来说,UDP数据报只是IP数据报的一种,它并不关心UDP数据报的具体内容。
直到这个包到达目的端的主机,目的主机的内核会解析UDP数据报,并查找数据报中要求端口是否已经有进程在使用。
如果找到,则通知进程有数据到达。而如果找不到,则发送一个“目的端口不可达”的ICMP错误数据回到源主机。
这样就可以完全确定下来:trcertroute建立一个UDP数据包,不断修改TTL值并发送出去。
如果收到“超时错”,表示刚刚到达的是路由器,而如果收到的是“端口不可达”错误,表示刚刚到达的就是目的主机。这样路由跟踪完成,程序结束。
Top




