从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 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8538
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2997
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3642
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5228
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3005
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2767
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2850
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4385
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7026

扫码关注云+社区