全部博文(1015)
分类: 系统运维
2012-11-23 13:27:42
ping-r和tracert获取的路由信息不一致
只有部分是windows服务器ip才回显,不知道原因。
C:\Users\xx>ping -r 9 10.1.1.15
正在 Ping 10.1.1.15 具有 32 字节的数据:
来自 10.1.1.15 的回复: 字节=32 时间=50ms TTL=125
路由: 10.253.10.130 ->
10.1.2.243 ->
10.1.1.253 ->
10.1.1.15 ->
10.1.2.248 ->
10.253.10.129 ->
10.10.172.254
来自 10.1.1.15 的回复: 字节=32 时间=54ms TTL=125
路由: 10.253.10.130 ->
10.1.2.243 ->
10.1.1.253 ->
10.1.1.15 ->
10.1.2.248 ->
10.253.10.129 ->
10.10.172.254
来自 10.1.1.15 的回复: 字节=32 时间=55ms TTL=125
路由: 10.253.10.130 ->
10.1.2.243 ->
10.1.1.253 ->
10.1.1.15 ->
10.1.2.248 ->
10.253.10.129 ->
10.10.172.254
来自 10.1.1.15 的回复: 字节=32 时间=54ms TTL=125
路由: 10.253.10.130 ->
10.1.2.243 ->
10.1.1.253 ->
10.1.1.15 ->
10.1.2.248 ->
10.253.10.129 ->
10.10.172.254
10.1.1.15 的 Ping 统计信息:
为什么ping -r与tracert获取的路由信息不一样。而有回答是tracert采用了最短路径优先路由协议(OSPF)所导致,看来技术到理解也不是那么简单的事情,写点浅显的技术解释文章给大家,算给大家上点基本常识课,遇见问题如何去找答案。
首先记住:OSPF只是路由之间的选路协议,对于主机而言,是完全没办法 干涉和获取的,他只能忠实的被动有路由去转发,他们在包到达目标路径上执行的策略都是一致的,虽然可能由于某些路由改变了路径导致其路径不一致,但是如果 tracert的包是由OSPF选路确定的路径,那么ping的包也一样。
闲话少说,我们还是分析具体问题:做个实验抓取ping -r和tracert命令执行产生的包来分析吧: 这是
ping -r 9
产生的结果: 218.17.93.143 ->61.144.201.66 ->61.144.236.211 ->61.140.1.18 -> 202.105.1.246 ->202.105.1.177 ->61.140.8.5 ->61.145.112.248 -> 61.145.113.124
看一下发出的请求包: 在发出的ICMP包中的IP头中使用了0x07 0x27的源地址路由选项,说明ICMP的路由是根据返回包的记录的源地址选项来实现路由记录的,从返回的包中的路由记录中可以看出和显示的路由信息完全 一致。但是我们知道,通过源路由选项我们得出的结果是从返回我们主机的包,其记录的路由实际上是到我们的路由,而不是我们的主机到的路由,这就有差别了。
而tracert则是通过递增ttl来实现的路由检测,那么他是一个标准的由我们的主机到的路由,
结果 是:192.168.0.1->218.17.93.254->61.144.201.65->61.144.236.209->61.140.1.17->202.105.1.245->202.105.1.178->61.140.8.6->61.145.113.253->61.145.113.90
对比以下有什么不同呢?因为使用TTL方式会记录本地代理服务器的地址,而这台机器是关掉了源路由选项处理的功能的,所以要却掉这个地址对比如下: 218.17.93.143 ->61.144.201.66 ->61.144.236.211 ->61.140.1.18 -> 202.105.1.246 ->202.105.1.177 ->61.140.8.5 ->61.145.112.248 -> 61.145.113.124 218.17.93.254->61.144.201.65->61.144.236.209->61.140.1.17->202.105.1.245->202.105.1.178->61.140.8.6->61.145.113.253->61.145.113.90
因为一个是回路,一个是去路,因此可能选择的路由路径是不一致的,即使是一致的,也会产生不同的结果。为什么呢?
因为路由都是多接口的,从一个接口收到包以后,转发到另一个接口上,由于 ping方式获取的是包返回的路由,所以记录的都是这个路由的返回时候收到包的接口,而ttl递增方式则是记录的发送包的时候收到的路由接口地址。假设来 去都使用了一样的路由路径,路由1到路由2,则演示如下: TTL递增方式的路由是: 主机1A《-》路由1接受接口〈-〉路由1发送接口〈-〉路由2接受接口〈-〉路由2发送接口〈-〉目标 记录的是:路由1接受接口,路由2接受接口 ping -r方式则是记录了 路由1发送接口,路由2发送接口(以我们发送ICMP的时候的眼光看待) 所以ping -r和tracert得出的结果是不一样的,并且无论如何你都无法使得他们得出一样的结果,无论路由器之间采用了什么算法。 另外如果某些路由关闭了源路由选项支持的功能,也会使得ping -r方式获得的路由信息不全。