我想做一个跟踪路由的小东西
就像命令行下面的 tracert命令一样, 把经过的路由自动记录下来!!大概应该怎么做,请教高手!!

解决方案 »

  1.   

    这里需要用到ICMP协议,就是ping所用的那个协议该协议可以记录数据流经的路由,使用TTL来限制流经的路由数量
      

  2.   

    实现原理:用原始套接字构造ping包,让其生存值不断增加,直到可以到达目的IP,根据其返回,就可以获取通过的路由信息。注意:
    经过的路由是不断变化的,所以对于以下问题:
    “如果是在建立了一个 客户端和一个服务端的情况下,客户端和服务端进行通信,在这些通信的包里面怎么提取 期间的路由信息呢??”
    估计没有什么好的实现方法(我个人认为)。建议不要实现这个需求,没什么实际意义。
      

  3.   

    路由跟踪的原理就是,每次发送ttl值不同的数据,一般来说是每次增加1,路由器受到过期的数据报就会利用icmp返回给发送方一些控制数据。tracert就是根据这些icmp,取得中途路由器的地址
      

  4.   

    好啊,值得鼓励呵呵首先楼主要非常清楚icmp,以及raw socket楼主可以看看这个文章,正要是你想要的http://www.csdn.net/develop/read_article.asp?id=18069我还认识一个朋友是这方面的专家,我去给你请来呵呵
      

  5.   

    目的是为了获得沿途的路由器,方法很多1、利用IP选项中的路由记录,不过现在的网络已经比早年发明这个选项时的网络复杂多了,所以连接好多地方时,ip头已经没有足够大的空间存放途中所有路由地址信息了。2、发送ttl为n的icmp回显请求包,当沿途上第n个路由器收到这个包时,该包已经超时,路由器会返回一个icmp超时报文给源主机,源主机可根据这个报文获取这个路由器地址。如果把n从1开始递增,就可以获取沿途所有路由器地址了,直到最后到达目标主机时,目标主机返回icmp回显应答包。上面不少朋友提到的就是这种办法。3、同上面一种方法,也可以往外发ttl为n的udp包,也会收到沿途第n个路由器返回的icmp超时报文,从中获取路由器地址。不同的是当这个udp包到达目标主机时,如果目标主机的相关端口没有开的话,会返回icmp端口不可达报文。如果在windows平台上实现,如PiggyXP所说,需要了解icmp协议的部分类型和原始socket的使用。我最近也在写这个东西,可以探讨一下,:)
      

  6.   

    tracert 就是ping 然后 ttl -1
      

  7.   

    嗯,看一下<TCP/IP 卷一:协议>,里面解释的比较清楚,我分别利用UDP和ICMP协议实现过这个程序。想提醒的是,如果用UDP实现的话,在测试某些地址时,可能最终显示无法到达最终地址,但是如果用ICMP协议实现的话,是可以到达的。个人理解是,某些路由器可能因为安全原因屏蔽了UDP的数据包,:)
    可以多多讨论的说。
      

  8.   

    to anniewy(狸狸)
    同感,不过我们这里屏蔽的不是udp,而是icmp,当时可能是因为我们内网病毒闹得凶,网管配置了一下,结果从内网发给网关的icmp包全都被忽略了,仅仅只允许外面的icmp包进来,当时基于icmp的traceroute完全没有办法运作,因为icmp根本出不去!
    不过好在外面的icmp能够进来,所以采用udp没有问题。但是udp也存在一些限制,如果对方系统绑定了udp包中所指定的目标端口,那么对方系统是不会发送“端口不可达”的icmp报文的,因为此时udp包已经被转给绑定该端口的相关进程。
      

  9.   

    limin(我好笨我好困) 你的icmp的文章什么时候发表啊,大家都等着看呢^_^ 顺便进来学习,大家继续
      

  10.   

    to limin(我好笨我好困) :
       哦哦,还是有很多忽略的地方,:( 不过,现在用ICMP实现tracert的比较多。像Windows系统自带的、SolarWinds的那些都是用ICMP实现的,:)
      

  11.   

    to 搂主:原理很简单,就是上面各位所说的,我就不重复了,
    我有VC6 udp实现的源代码
    要的话可以联系我:[email protected]
      

  12.   

    多谢 yoyohon(yoyohon) 
     已经收到