[转]Traceroute网络排障实用指南(2)
五、优先级与限速
5.1 Traceroute延时判断影响因素
Traceroute延时包括三点:
探测包到达一个特定路由器的时间
路由器生成IPMI TTL Exceed的时间
ICMP TTL Exceed返回到SRC的时间
第一个和第三个时间都是受实际网络情况影响的,而第二个时间不是。能够对网络问题的判断起到帮助作用的仅仅只有第一个和第三个时间,第二个时间往往起到误导的作用。
5.2 路由器工作原理
路由器有转发(data-plane)和接收(control-plane)的功能。
路由器转发包有两种模式:
Fast Path:硬件实现转发源包(几乎所有的网络的数据包)
Slow Path:软件实现处理“异常”包(IP Options, ICMP generation <--Traceroute发生在这里)
路由器能够接收直接发送到路由器上绑定的IP的包,接收的包可以是BGP、IGP、SNMP、CLI访问(telnet/ssh)、ping等;但是,路由器的CPU性能是比较差的。一个320-640+Gbps背板的路由器,却只有一个单核600MHz MIPS CPU,通常CPU用来做其他事而不是做Traceroute,因此ICMP Generation在路由器看来优先级较低,大多数情况下更是有速度限制和降级的处理。
1. 降级
在一些常见的路由器平台上,Slow path中的转发与接收是公用资源,同时没有使用最好的软件调度器。因此一些控制性的数据处理比如BGP churn、CLI等会消耗CPU资源,使得ICMP TTL Exceed包的产生延迟。
2. 限速
大部分路由器会限制他们的ICMP包产生,不同厂商会有不同的并且不可设置的限速值,这大大影响了Traceroute的效果,特别是在很多用户同时使用MTR时。
例子
Foundry MLX/XMR:Hard-coded limit of 400pps per interface.
Force10 E-series:Hard-coded limit of 200pps or 600pps per interface.
5.3 排除假延时
那么有办法排除第二个时间对整个延时的影响吗?答案是有的。最重要的一个规则:如果在某一跳中发生问题,那么所有后续跳的延时将会持续或增长。
下面例子中第二跳并没有问题
|
|
在Traceroute过程中出现的延时突高并不是什么问题,造成这种现象主要有两种原因:
通常是路由器的限速与优先级问题;
最坏情况是路由器回包过程中走的路径不同导致的(非对称转发路径)。
六、非对称的转发路径
网络中的路由是没法保证对称的转发路径,即往返的路径完全相同。而Traceroute显示的只是去的方向的路径,但仍然要注意延时是往返的耗时。对于Traceroute来说,返回的路径是完全不可见的,返回的每一跳可能跟去的时候完全不一样。排查问题的时候可以进行反向的Traceroute,看返回的路径上是否出现问题,当然,这样也不能保证路径是一样的。
6.1 非对称转发路径与AS边界
非对称路径通常是在AS边界开始的。为什么?那是因为AS边界通常是AS管理策略改变的地方。
|
|
上面例子中有什么问题?
在GBLX和Sprint的边界出现拥塞;
可能是由于正向或反向路径出现拥塞。
由于两个AS出口策略不一致造成的拥塞是很常见的。
6.2 多路径互联
非对称的路径可出现在每一跳,特别是有多条路径到达的节点。

第一跳(紫色):折回点为Washington DC
第二跳(红色):折回点为Chicago IL
第三跳(绿色):折回点为San Jose CA
可以看到第三跳不是原路返回的,如果Chicago IL返回的路径上出现拥塞,那么第三跳上将不会出现拥塞情况,故在Traceroute时可能会看到第二跳延时高于第三跳。
如果出现以上情况时,该如何去排查问题?
假设如下的情况,你有多条路径可到达Sprint,但Traceroute显示You->Global Crossing->Sprint,并且问题出现在第三跳的Sprint。

如何证明问题不是出现在GX这边的路径?
使用之前提到的/30掩码方法,使用Global Crossing的/30掩码找到对端IP,并作为SRC进行Traceroute,那么就能保证返回路径为Sprint->Global Crossing;
同样的方法Traceroute另外一跳路径;
两边的延时对比后,就知道哪条路径出现问题。
当然/30掩码方法不一定能够准确找到对端IP,这完全取决于路由的配置。
为什么Traceroute设置源IP后能够保证第一跳的返回路径?
当Traceroute的源IP为你IP空间的IP时(比如是loopback),回包的时候可回到任一接口。但如果在对端路由器配置了/30掩码的IP在IGP时,那么就会强制回包至指定IP的接口。
七、等价路由
7.1 等价路由

基于流的哈希算法能够保证同一个TCP/UDP数据流通过相同的路径。而UDP/TCP Traceroute的探测包的目标端口是递增的,在路由器看来可能不是同一个数据流,这可能造成探测包会走不同的平行路径。
以上图来说,Traceroute的结果可能与实际完全不同,正常应该是A -> B1 -> C1 -> D或A -> B2 -> C2 -> D,但结果可能是A -> B1 -> C2 -> D,这跟拓扑完全不一样。
例如:
|
|
这对于正常的数据流流来说是有好处的,基于流的哈希算法能够避免了数据包的重组,但对于Traceroute来说就有点问题了。
7.2 等价不等长路由

这种情况会令Traceroute看上去令人觉得跳来跳去,这使得排查问题难上加难。
以上图来说,正常应该是A -> B1 -> C 或 A -> B2 -> X -> C,这样测出来已经令人迷惑了,究竟是三跳还是四跳?
但实际情况可能更加糟糕,可能是 A -> B1 -> X -> C,这完全与拓扑不相符;同时也可能是 A -> B1 -> C -> C,看到了吗,出现“回路”了。对于上面一条路来说,TTL=3时是C,对于下面一条路来说,TTL=4时是C,两个探测包刚好走了两条不同的路,所以正好出现了这样的“回路”。
7.3 单路径Traceroute
那么有办法能够让Traceroute固定走一条路吗?有的。
利用Traceroute强大的参数设置,固定目标端口不变,就能够Traceroute出同一条路径了(Traceroute 2.0.14版本,-U可固定目标端口不变,-p指定目标端口)。但是需要注意Traceroute出来的路径不一定是实际数据包走的路径。可以通过目标IP加1或减1进行多次Traceroute来完成多路径的Traceroute。网络中区分数据流的策略很多,三层网络通常是根据源IP、目标IP来区分一个数据流,因此固定目标端口,更改目标IP能够让探测包走不同的路径,从而让Traceroute更加准确。

上图是我从实际环境截获的包。gz-ganglia2向gz-ganglia1进行Traceroute,在gz-ganglia1上截包,从上图能够看到固定端口为55555,且收到多个TTL大于1的UDP包,这跟Traceroute的原理有关,Traceroute每跳默认发3个包,超时时间为5s,每三个包TTL增加1,直至收到ICMP Dest Unreachable包后停止发包,故在收到ICMP Dest Unreachable包之间,Traceroute还是认为没有到达目标,仍然继续发包,故目标主机可以收到TTL大于1的包。若Traceroute一直没有收到ICMP Dest Unreachable包则默认会一直发到TTL=30停止发送。
八、多协议标签交换(MPLS)与Traceroute
8.1 MPLS ICMP隧道
很多大型网络都有运用MPLS,有些路由器只根据MPLS的标签进行转发而没有IP路由表,当ICMP包产生时问题就出现了,这些路由器要怎么去转发这些ICMP包?其中一种解决方案是MPLS ICMP隧道。
当一个ICMP包产生并打上标签时,路由器会根据标签交换路径(LSP)转发表将ICMP包转发至下一跳,这会导致Traceroute的结果看起来非常奇怪,你会看到中间很多跳的延时会跟某一跳的延时是一样的,如下例。
|
|
为什么会这样?

根据Traceroute原理ICMP TTL Exceed包应该是由每一跳的路由直接返回给SRC。
但是,在MPLS ICMP隧道中,ICMP包会一直走到MPLS的出口才会返回给SRC,这就造成在MPLS上的所有跳的延时都是几乎一样的。

九、结语
一个看似简单的Traceroute里面包含如此多的网络知识,有那么多的因素导致Traceroute无法正确嗅探出网络拓扑,那么是否真的没有办法?不是的,Paris Traceroute就是一种新式的Traceroute,它能够更加准确的嗅探出网络拓扑,为网络排障提供更加准确的依据。等我研究完了Paris traceroute再做分享。
参考文献:
A Practical Guide to (Correctly) Troubleshooting with Traceroute
Avoiding traceroute anomalies with Paris traceroute
RFC1812
百度百科
维基百科
[转]Traceroute网络排障实用指南(2)的更多相关文章
- [转]Traceroute网络排障实用指南(1)
注:本文是同事的大作,虽是翻译的一篇英文PPT,但内容实在精彩,小小的Traceroute竟包含如此大的信息量,真是让人感慨!内容不涉及公司机密,所以一直想转到自己的Blog上来,自己需要时可以再翻阅 ...
- [转帖]记一次KUBERNETES/DOCKER网络排障
记一次KUBERNETES/DOCKER网络排障 https://coolshell.cn/articles/18654.html 记得之前在一个公众号里面看过这个文章 讲的挺好的.. 物理机直接跑d ...
- 记一次KUBERNETES/DOCKER网络排障
https://coolshell.cn/articles/18654.html 总结在前面: 1.kill -9杀死docker进程,系统一定是要遍历所有的docker子进程来一个一个发退出信号的, ...
- A Practical Guide to Distributed Scrum - 分布式Scrum的实用指南 - 读书笔记
最近读了这本IBM出的<A Practical Guide to Distributed Scrum>(分布式Scrum的实用指南),书中的章节结构比较清楚,是针对Scrum项目进行,一个 ...
- 家用wifi信号覆盖增强扩展实用指南
家用wifi信号覆盖增强扩展实用指南 现在网上很多号称穿墙王的无线路由器,但是一般用起来效果都不理想,其实最主要的原因还是家里面一般每个房间不大,但是墙比较多.并且一般也没有一个所谓的中心点放置路由器 ...
- 搜寻Linux软件实用指南
搜寻Linux软件实用指南 对于初学者来说,仅仅安装好Linux系统还是不够的,还需要安装大量的应用软件.许多下载网站都提供了诸如装机必备软件的下载,分门别类提供经典的工具软件下载.本文主要针对初学 ...
- flannel vxlan工作基本原理及常见排障方法
写在前面 最近用kubeadm鼓捣了几个cluster集群测试用,网络用的flannel.因为这些机器都不是纯净的环境(以前部署过其他的k8s或者有一些特别的设置),所以部署起来遇到了很多问题.看了下 ...
- TensorFlow 卷积神经网络实用指南 | iBooker·ApacheCN
原文:Hands-On Convolutional Neural Networks with TensorFlow 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 不要担心自己的形象,只关心 ...
- 【思考】由安装zabbix至排障php一系列引发的思考
[思考]由安装zabbix至排障php一系列引发的思考 linux的知识点林立众多,很有可能你在排查一个故障的时候就得用到另一门技术的知识: 由于linux本身的应用依赖的库和其它环境环环相扣,但又没 ...
随机推荐
- Unity SendMessage方法
我们今天研究下SendMessage方法, 如果我们需要执行某一个组件的方法时候可以使用SendMessage gameObject.SendMessage("A"); 即可通知当 ...
- python urllib基础学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #使用python创建一个简单的WEB客户端 import urll ...
- qt model/view 架构基础介绍之QTreeWidget
# -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅 ...
- BOOST 线程完全攻略 - 结束语
modulethread扩展多线程破解通讯 全文介绍了3个boost::thread的扩展类,希望能给大家书写多线程代码带来便捷. thread -> controlled_module_ex ...
- Docker网络管理-外部访问容器
注意:这里使用的方法是端口映射,需要说明的是端口映射是在容器启动的时候才能完成端口映射的. 1,搭建1个web服务器,让外部机器访问. docker run -itd centos /bin/bash ...
- Visual Studio - 提升幸福感的N个快捷键
现代化IDE给程序猿提供了极大的方便,掌握一些优秀的开发工具,使我们写代码时有行云流水般的快感. VS作为宇宙最强没有之一的IDE,用起来也是好幸福.下面是我最常用的快捷键,已经印在手指上,每次好像不 ...
- 设置改变oracle字符集
修改过密码之后就能以dba的身份进行修改了,不是dba的话在执行修改命令的时候会提示你权限不足. 开始-->运行-->cmd,之后输入:"sqlplus sys/oracle ...
- VS2015预览版中的C#6.0 新功能(一)
VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...
- python 技巧 之 pyCharm快速添加第三方库和插件
学习python有几个月,安装第三方库都是通过 pip install 或者 easy_install.每次都要打开命令行感觉太麻烦.还好Pycharm提供了安装第三方库和安装插件的功能. 首先打开P ...
- OpenCV——人脸检测
OpenCV支持的目标检测的方法: 利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification) 1.加载级联分类器 CascadeClass ...