从Traceroute看网络问题

traceroute送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute再送出另一个TTL是2 的数据包,发现第2 个路由器......

traceroute每次将送出的数据包的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据包 抵达目的地。当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息,一旦到达目的地,由于traceroute通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。

一、Traceroute原理及问题

使用GNS3模拟器抓包分析,实验拓扑:

在路由器:R5上traceroute 192.168.3.10

通过Wireshark抓包分析:

看第9个数据包192.168.5.2使用UDP协议请求192.168.3.10大于30000不存在的端口,当src收到ICMP Dest Unreachable包时停止traceroute。

第10个包192.168.3.10回ICMP Dest Unreachable包

问题:为什么不是显示192.168.2.1 192.168.3.1?

解答:你无法从Traceroute中得知包返回的路径以及路由器使用的ICMP Return Interface和Egress Interface的IP 值得一提的是在RFC1812 4.3.2.4 ICMP Message Source Address中提到,ICMP包的源地址必须是传包出去的物理接口绑定的其中一个IP(Except where this document specifies otherwise, the IP source address in an ICMP message originated by the router MUST be one of the IP addresses associated with the physical interface over which the ICMP message is transmitted.)。

经过实验证实了这个问题。一个探测包确实会有可能从路由器的一个接口进,ICMP TTL Exceed包从另外一个接口出,并且源IP是进的接口IP,按照个人理解其原因是路由器会把进的接口产生的TTL超时包当作外来的包并遵循路由表进行路 由转发,转发过程不会改变包的源目IP。因此在外部看来这个ICMP包并不符合RFC文档的定义。

延时计算

1.在探测包发出时打上时间戳;

2.当收到ICMP响应时打上时间戳;

3.根据两个时间戳计算往返时间;

路由器不对包的时间做任何处理,只是单纯的转发数据; 延时计算的是包的往返时间,但Traceroute显
示的是去的路径上所经过的路由。

二、Traceroute中的DNS反向解析

Traceroute提供了比较多的信息,可以通过这些信息进行问题排查

从东京到美国绕欧洲过去,那就不太理想了。 从印度到美国要300ms,但从日本到美国并不需要300ms。

DNS中包含的接口信息:

很多网络都会尝试将接口信息放在DNS,需要注意的是: 接口信息通常是帮助他们排查自己网络的问题; 接口信息有可能不是最新的。虽然很多大型网络会自动产生DNS,但其余的不会; 可以帮助你识别接口的类型,通过接口类型甚由器的型号。

例如:xe-11-1-0.edge1.NewYork1.Level3.net

xe-11-1-0是Juniper 10GE端口,该设备至少有12个板卡槽;至少一台40G/板卡槽的路由器,因为它有一块10GE板卡在板卡槽1。

边界的变化:

4 te1-2-10g.ar3.DCA3.gblx.net (67.17.108.146)

5 sl-st21-ash-8-0-0.sprintlink.net (144.232.18.65)

路由的变化:

4 po2-20G.ar5.DCA3.gblx.net (67.16.133.90)

5 cogent-1.ar5.DCA3.gblx.net (64.212.107.90)

问题:想知道路由是否同时属于两个AS,使用/30掩码方法 两个路由器之间一般是点到点,为了省IP配置/30。

三、延时

串行延时产生原因:一个数据包被移动到网络上的时候是一个不可分的单元;在一个数据包传输完毕之前另外一个数据包无法发送。

队列延时

在高速网络中该延时非常小:

1500 bytes over a 56k link (56Kbps) = 214.2ms delay

1500 bytes over a T1 (1.536Mbps) = 7.8ms delay

1500 bytes over a FastE (100Mbps) = 0.12ms delay

1500 bytes over a GigE (1Gbps) = 0.012ms delay

利用率

1G的接口跑到500Mbps我们会说利用率是50%,但实际上,一个接口只能进行转发数据(100%利用)或者不能转发数据(0%利用),故所谓的50%利用率实际上是指1s内有0.5s用来了传输数据。

排队

当一个接口在被使用,下一个包必须排队等待被发送。通常来说,一个接口90%使用率等于将要转发的包90%都在排队。当一个接口达到饱和时,排队时间将迅速增加,当一个接口过饱和时,一个包排队可能要耗费几百甚至几千毫秒,排队延时通常与拥塞程度相关联。

在美国本土传播耗时220ms,延时不正常。

四、路由跟踪

Traceroute每一跳延时计算:

  1. 探测包到达一个特定路由器的时间
  2. 路由器生成IPMI TTL Exceed的时间

3.ICMP TTL Exceed返回到SRC的时间

第一个和第三个时间都是受实际网络情况影响的,而第二个时间不是。能够对网络问题的判断起到帮助作用的仅仅只有第一个和第三个时间,第二个时间生成涉及到路由器的CPU,第二个时间往往起到误导的作用。 其中经过的路由器是不会对时间戳做任何处理。

如何排查假延时?

最重要的一个规则:如果在某一跳中发生问题,那么所有后续跳的延时将会持续或增长。

影响耗时的因素 ?

1.通常是路由器的限速与优先级问题;

2.最坏情况是路由器回包过程中走的路径不同导致的(非对称转发路径)

第一跳(紫色):折回点为Washington DC

第二跳(红色):折回点为Chicago IL

第三跳(绿色):折回点为San Jose CA

可以看到第三跳不是原路返回的,如果Chicago IL返回的路径上出现拥塞,那么第三跳上将不会出现拥塞情况,故在Traceroute时可能会看到第二跳延时高于第三跳。

如何排查?

等价等长路由

等价不等长路由

Loop产生原因:路由器错误传递,将TTL=0的包传到下一跳; NAT路由器,会将源IP地址重写,导致NAT后面的跳数看上去都是NAT那个IP。

如何避免?

利用Traceroute强大的参数设置,固定目标端口不变,就能够Traceroute出同一条路径了(Traceroute 2.0.14版本,-U可固定目标端口不变,-p指定目标端口)。但是需要注意Traceroute出来的路径不一定是实际数据包走的路径。可以通过目标 IP加1或减1进行多次Traceroute来完成多路径的Traceroute。网络中区分数据流的策略很多,三层网络通常是根据源IP、目标IP来区 分一个数据流,因此固定目标端口,更改目标IP能够让探测包走不同的路径,从而让Traceroute更加准确。

MPLS ICMP隧道 :很多大型网络都有运用MPLS,有些路由器只根据MPLS的标签进行转发而没有IP路由表,当ICMP包产生时问题就出现了,这些路由器要怎么去转发这些ICMP包?其中一种解决方案是MPLS ICMP隧道。 当一个ICMP包产生并打上标签时,路由器会根据标签交换路径(LSP)转发表将ICMP包转发至下一跳,这会导致Traceroute的结果看起来非常奇怪,你会看到中间很多跳的延时会跟某一跳的延时是一样的

根据Traceroute原理ICMP TTL Exceed包应该是由每一跳的路由直接返回给SRC。 但是,在MPLS ICMP隧道中,ICMP包会一直走到MPLS的出口才会返回给SRC,这就造成在MPLS上的所有跳的延时都是几乎一样的。 其实这里还会引申出一个问题,那就是跳数缺漏。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

译文 | Android 开发中利用异步来优化运行速度和性能

我们知道,在Android框架中提供了很多异步处理的工具类。然而,他们中大部分实现是通过提供单一的后台线程来处理任务队列的。如果我们需要更多的后台线程的时候该怎...

3777
来自专栏林德熙的博客

win10 UWP 访问网页 设置代理WebView

Windows10 UWP 要访问 csdn博客,可以使用Windows.Web.Http.HttpClient,下面尝试访问一下我的博客 http://blo...

1831
来自专栏Golang语言社区

Golang实现ping

ICMP部分的结构 报头 ICMP报头从IP报头的第160位开始,即第20个字节开始(除非使用了IP报头的可选部分)。 Bits 160-167 168-175...

9186
来自专栏非典型技术宅

Swift实践:使用CoreData完成上班签到小工具1. CoreData Stack的作用2.创建 CoreData Stack3. 一对多的关系4. 完成Demo,了解使用CoreData St

1213
来自专栏SDNLAB

OpenFlow网络中的路由服务

这里,所谓OpenFlow网络指的是相互连接的一组OpenFlow交换机的集合,并且这些交换机全部置于一个OpenFlow Controller或一个OpenF...

4178
来自专栏张善友的专栏

易学易用的Windows PowerShell

Windows PowerShell 是微软为 Windows 环境所开发的 shell 及脚本语言技术,这项全新的技术提供了丰富的控制与自动化的系统管理能力;...

2136
来自专栏SDNLAB

Netvirt之流表分析(一):Netvirt介绍

1. 架构 最近在看ODL的netvirt项目,netvirt是一个完整的网络虚拟机化解决方案,几乎可以实现neutron的所有功能,包括FWaaS,VPNaa...

3587
来自专栏腾讯技术工程官方号的专栏

科普:QUIC 协议原理分析

本文将主要介绍 QUIC 协议产生的背景和核心特性。

4.2K11
来自专栏landv

烽火2640路由器命令行手册-11-IP语音配置命令

(1)       用户输入的ID若在dialpeer表中已存在,且模式匹配,则进入dialpeer配置模式对相应dialpeer进行配置修改;

1443
来自专栏魏琼东

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

     AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平...

1100

扫码关注云+社区

领取腾讯云代金券