免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
概述
当客户端访问目标服务器出现ping丢包或ping不通时,可以通过tracert
或mtr
等工具进行链路测试来判断问题根源。本文主要介绍如何通过工具进行链路测试和分析。
详细信息
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
- 如果您在阿里云平台授权或者提交过登录*、*等安全信息,建议您及时修改。
使用ping命令丢包或者网络不通时,可参见以下操作步骤进行链路测试并进行处理,想了解链路测试中所使用工具的更多介绍请参见更多信息。
链路测试步骤
通常情况下,链路测试步骤如下:
步骤一:获取本地网络对应的公网IP
在客户端本地网络内访问淘宝IP地址库,获取本地网络对应的公网IP地址。
步骤二:正向链路测试(ping和mtr)
从客户端向目标服务器做以下测试:
- 从客户端向目标服务器域名或IP做持续的ping测试,建议至少ping 100个数据包,记录测试结果。
- 根据客户端操作系统的不同,使用WinMTR或mtr,设置测试目的地址为目标服务器域名或IP,然后进行链路测试,记录测试结果。
步骤三:反向链路测试(ping和mtr)
进入目标服务器系统内部做以下测试:
- 从目标服务器向步骤一获取的客户端IP做持续的ping测试,建议至少ping 100个数据包,记录测试结果。
- 根据目标服务器操作系统的不同,使用WinMTR或mtr,设置测试目的地址为客户端的IP地址,然后进行链路测试,记录测试结果。
步骤四:测试结果分析
参见测试结果的简要分析,对测试结果进行分析。确认异常节点后,访问如下链接或其他可以查询IP归属地的网站,获取该异常节点的归属运营商信息。如果是客户端本地网络相关节点出现异常,则需要对本地网络进行相应排查分析。如果是运营商相关节点出现异常,则需要向运营商反馈问题。查询结果类似如下。
测试结果的简要分析
由于mtr(WinMTR)有更高的准确性,本文以其测试结果为例,参见以下要点进行分析。此处分析时以如下示例图为基础。
要点一:网络区域
正常情况下,从客户端到目标服务器的整个链路中会包含以下网络区域:
说明:您可以通过IP地址库确认IP地址所属网络情况。
- 客户端本地网络:即本地局域网和本地网络提供商网络。如上图中的区域A。如果该区域出现异常,并且是客户端本地网络中的节点出现异常,则需要对本地网络进行相应的排查分析。如果是本地网络提供商网络出现异常,则需要向当地运营商反馈问题。
- 运营商网络:如上图中的区域B。如果该区域出现异常,可以根据异常节点的IP查询其所属的运营商,直接向对应运营商进行反馈,或者通过阿里云技术支持,向运营商进行反馈。
- 目标服务器本地网络:即目标服务器所属提供商的网络。如上图中的区域C。如果该区域出现异常,需要向目标服务器所属的网络运营商反馈问题。
要点二:链路负载均衡
如上图中的区域D。如果中间链路某些部分启用了链路负载均衡,则mtr只会对首尾节点进行编号和探测统计。中间节点只会显示相应的IP或域名信息。
要点三:结合Avg(平均值)和StDev(标准偏差)综合判断
由于链路抖动或其它因素的影响,节点的Best和Worst值可能相差很大。Avg统计了自链路测试以来所有探测的平均值,所以能更好的反应出相应节点的网络质量。而StDev越高,则说明数据包在相应节点的延时值越不相同,即越离散。所以标准偏差值可用于协助判断Avg是否真实反应了相应节点的网络质量。例如,如果标准偏差很大,说明数据包的延迟是不确定的。可能某些数据包延迟很小,例如25ms,而另一些延迟却很大,例如350ms,但最终得到的平均延迟反而可能是正常的。所以,此时Avg并不能很好的反应出实际的网络质量情况。
综上所属,建议的分析标准如下:
- 如果StDev很高,则同步观察相应节点的Best和Worst,来判断相应节点是否存在异常。
- 如果StDev不高,则通过Avg来判断相应节点是否存在异常。
注意:上述StDev高或者不高,并没有具体的时间范围标准。而需要根据同一节点其它列的延迟值大小来进行相对评估。比如,如果Avg为30ms,那么,当StDev为25ms,则认为是很高的偏差。而如果Avg为325ms,StDev为25ms,反而认为是不高的偏差。
要点四:Loss%(丢包率)的判断
任一节点的Loss%(丢包率)如果不为零,则说明这一跳网络可能存在问题。导致相应节点丢包的原因通常有以下两种:
- 运营商基于安全或性能需求,限制了节点的ICMP发送速率,导致丢包。
- 节点确实存在异常,导致丢包。
结合异常节点及其后续节点的丢包情况,并参见以下内容,判定丢包原因。
- 如果随后节点均没有丢包,则通常表示异常节点丢包是由于运营商策略限制所致。可以忽略相关丢包。如上图中的第2跳所示。
- 如果随后节点也出现丢包,则通常说明异常节点确实存在网络异常,导致丢包。如上图中的第5跳所示。
另外,上述两种情况可能同时发生,即相应节点既存在策略限速,又存在网络异常。对于这种情况,如果异常节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳的丢包率为准。如上图所示,在第 5、6、7跳均出现了丢包。所以,最终丢包情况,以第7跳的40%作为参考。
要点五:关于延迟
关于延迟,有以下两种场景:
场景一:延迟跳变
如果在某一跳之后延迟明显陡增,则通常判断该节点存在网络异常。如上图所示,从第5跳之后的后续节点延迟明显陡增,则推断是第5跳节点出现了网络异常。不过,高延迟并不一定完全意味着相应节点存在异常。如上图所示,第5跳之后,虽然后续节点延迟明显陡增,但测试数据最终仍然正常到达了目的主机。所以,延迟大也有可能是在数据回包链路中引发的。所以,需要结合反向链路测试一并分析。
场景二:ICMP限速导致延迟增加
ICMP策略限速也可能会导致相应节点的延迟陡增,但后续节点通常会恢复正常。如上图所示,第3跳有100%的丢包率,同时延迟也明显陡增。但随后节点的延迟马上恢复了正常。所以判断该节点的延迟陡增及丢包是由于策略限速所致。
测试完成后的解决方法
- 当出现ping丢包或ping不通时,首先请参考云服务器ECS网络故障诊断,排查是否为网络故障。
- 如果确认是因系统中病毒导致使用ping命令测试ECS实例的IP地址间歇性丢包,则可参考使用ping命令测试ECS实例的IP地址间歇性丢包进行处理。
- 如果是因删除ECS实例的默认安全组规则导致无法ping通ECS实例,可参考删除ECS实例的默认安全组规则导致无法ping通ECS实例进行处理。
- 如果在Linux系统内核没有禁PING的情况下,是因系统内部防火墙策略设置导致ECS服务器PING不通。可参考Linux系统的ECS中没有禁PING却PING不通的解决方法。
常见的链路异常场景
常见的链路异常场景及测试报告如下:
场景一:目标主机网络配置不当
示例数据如下。
[root@mycentos6 ~]# mtr --no-dns www.google.com
My traceroute [v0.75]
mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016
Keys: Help Display mode Packets Ping*r>Host Loss% Snt Last Avg Best Wrst StDev
1. ???
2. ???
3. 1XX.X.X.X 0.0% 10 521.3 90.1 2.7 521.3 211.3
4. 11X.X.X.X 0.0% 10 2.9 4.7 1.6 10.6 3.9
5. 2X.X.X.X 80.0% 10 3.0 3.0 3.0 3.0 0.0
6. 2X.XX.XX.XX 0.0% 10 1.7 7.2 1.6 34.9 13.6
7. 1XX.1XX.XX.X 0.0% 10 5.2 5.2 5.1 5.2 0.0
8. 2XX.XX.XX.XX 0.0% 10 5.3 5.2 5.1 5.3 0.1
9. 173.194.200.105 100.0% 10 0.0 0.0 0.0 0.0 0.0
在该示例中,数据包在目标地址出现了100%的丢包。从数据上看是数据包没有到达,其实很有可能是目标服务器相关安全策略(比如防火墙、iptables 等)禁用了ICMP所致,导致目的主机无法发送任何应答。所以,该场景需要排查目标服务器的安全策略配置。
场景二:ICMP限速
示例数据如下。
[root@mycentos6 ~]# mtr --no-dns www.google.com
My traceroute [v0.75]
mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016
Keys: Help Display mode Packets Ping*r>Host Loss% Snt Last Avg Best Wrst StDev
1. 63.247.X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3
2. 63.247.X.XX 0.0% 10 0.4 1.0 0.4 6.1 1.8
3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7
4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1
5. 72.14.233.56 60.0% 10 27.2 25.3 23.1 26.4 2.9
6. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.2
7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3
8. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2
在该示例中,在第5跳出现了明显的丢包,但后续节点均未见异常。所以推断是该节点ICMP限速所致。该场景对最终客户端到目标服务器的数据传输不会有影响,所以,分析的时候可以忽略。
场景三:环路
示例数据如下。
[root@mycentos6 ~]# mtr --no-dns www.google.com
My traceroute [v0.75]
mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016
Keys: Help Display mode Packets Ping*r>Host Loss% Snt Last Avg Best Wrst StDev
1. 63.247.7X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3
2. 63.247.6X.X 0.0% 10 0.4 1.0 0.4 6.1 1.8
3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7
4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1
5. 72.14.233.56 0.0% 10 0.0 0.0 0.0 0.0 0.0
6. 72.14.233.57 0.0% 10 0.0 0.0 0.0 0.0 0.0
7. 72.14.233.56 0.0% 10 0.0 0.0 0.0 0.0 0.0
8. 72.14.233.57 0.0% 10 0.0 0.0 0.0 0.0 0.0
9 ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
在该示例中,数据包在第5跳之后出现了循环跳转,导致最终无法到达目标服务器。这通常是由于运营商相关节点路由配置异常所致。所以,该场景需要联系相应节点归属运营商处理。
场景四:链路中断
示例数据如下。
[root@mycentos6 ~]# mtr --no-dns www.google.com
My traceroute [v0.75]
mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016
Keys: Help Display mode Packets Ping*r>Host Loss% Snt Last Avg Best Wrst StDev
1. 63.247.7X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3
2. 63.247.6X.X 0.0% 10 0.4 1.0 0.4 6.1 1.8
3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7
4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1
5. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
6. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
7. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
8. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
9 ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0
在该示例中,数据包在第4跳之后就无法收到任何反馈。这通常是由于相应节点中断所致。建议结合反向链路测试做进一步确认。该场景需要联系相应节点归属运营商处理。
更多信息
操作系统类型不同,链路测试所使用的工具也有所不同,简要介绍如下:
Linux系统
此处简单介绍两个链路测试工具:
工具一:mtr命令
mtr(My traceroute)几乎是所有Linux发行版本预装的网络测试工具。其将ping
和traceroute
的功能合并,所以功能更强大。mtr默认发送ICMP数据包进行链路探测。您也可以通过-u
参数来指定使用UDP数据包进行探测。相对于traceroute
只会做一次链路跟踪测试,mtr会对链路上的相关节点做持续探测并给出相应的统计信息。所以,mtr能避免节点波动对测试结果的影响,所以其测试结果更正确,建议优先使用。
用法说明
mtr [-BfhvrwctglxspQomniuT46] [--help] [--version] [--report]
[--report-wide] [--report-cycles=COUNT] [--curses] [--gtk]
[--csv|-C] [--raw] [--xml] [--split] [--mpls] [--no-dns] [--show-ip*r> [--address interface] [--filename=FILE|-F]
[--ipinfo=item_no|-y item_no]
[--aslookup|-z]
[--psize=bytes/-*ytes] [--order field*r> [--report-wide|-w] [--inet] [--inet6] [--max-ttl=NUM] [--first-ttl=NUM]
[--bitpattern=NUM] [--tos=NUM] [--udp] [--tcp] [--port=PORT] [--timeout=SECONDS]
[--interval=SECONDS] HOSTNAME
常见可选参数说明
- --report:以报告模式显示输出。
- --split:将每次追踪的结果分别列出来,而非统计整个结果。
- --psize:指定ping数据包的大小。
- --no-dns:不对IP地址做域名反解析。
- --address:主机有多个IP地址时,设置发送数据包的IP地址。
- -4:只使用IPv4协议。
- -6:只使用IPv6协议。
另外,也可以在mtr运行过程中,输入类似如下的字母用于快速切换模式。
- ?或h:显示帮助菜单。
- d:切换显示模式。
- n:启用或禁用DNS域名解析。
- u:切换使用ICMP或UDP数据包进行探测。
命令输出示例
返回结果说明
默认配置下,返回结果中各数据列的说明如下:
- 第一列(Host):节点IP地址和域名。按n键可切换显示。
- 第二列(Loss%):节点丢包率。
- 第三列(Snt):每秒发送数据包数。默认值是10,可以通过
-c
参数指定。 - 第四列(Last):最近一次的探测延迟。
- 第五、六、七列(Avg、Best、Worst):分别是探测延迟的平均值、最小值和最大值。
- 第八列(StDev):标准偏差,越大说明相应节点越不稳定。
工具二:traceroute命令
traceroute也是几乎所有Linux发行版本预装的网络测试工具,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。
- 首先,traceroute先发送小的具有最大存活时间值(Max_TTL)的UDP探测数据包。
- 然后,侦听从网关开始的整个链路上的ICMP TIME_EXCEEDED响应。探测从TTL=1开始,TTL值逐步增加,直至接收到ICMP PORT_UNREACHABLE消息。
说明:
- ICMP PORT_UNREACHABLE消息用于标识目标主机已经被定位,或命令已经达到允许跟踪的最大TTL值。
- traceroute默认发送UDP数据包进行链路探测,可以通过
-I
参数来指定使用ICMP数据包进行探测。
用法说明
traceroute [-I] [ -m Max_ttl ] [ -n ] [ -p Port ] [ -q Nqueries ] [ -r ] [ -s SRC_Addr ] [ -t TypeOfService ] [ -f flow ] [ -v ] [ -w WaitTime ] Host [ PacketSize ]
常见可选参数说明
- -d:使用Socket层级的排错功能。
- -f:设置第一个检测数据包的存活数值TTL的大小。
- -F:设置不要分段标识。
- -g:设置来源路由网关,最多可设置8个。
- -i:主机有多个网卡时,使用指定的网卡发送数据包。
- -I:使用ICMP数据包替代UDP数据包进行探测。
- -m:设置检测数据包的最大存活数值TTL的大小。
- -n:直接使用IP地址而非主机名称(禁用DNS反查)。
- -p:设置UDP传输协议的通信端口。
- -r:忽略普通的Routing Table,直接将数据包发送到目标主机上。
- -s:设置本地主机发送数据包的IP地址。
- -t:设置检测数据包的TOS数值。
- -v:详细显示指令的执行过程。
- -w:设置等待远端主机回包时间。
- -x:开启或关闭数据包的正确性检验。
命令输出示例
traceroute工具的更多用法请参见traceroute工具的man帮助。
Windows系统
此处简单介绍两个链路测试工具:
工具一:WinMTR(建议优先使用)
WinMTR是mtr工具在Windows环境下的图形化实现,但进行了功能简化,只支持部分mtr的参数。WinMTR默认发送ICMP数据包进行探测,无法切换,和mtr一样。相比tracert,WinMTR能避免节点波动对测试结果的影响,所以测试结果更正确。所以在WinMTR可用的情况下,建议优先使用WinMTR进行链路测试。
用法说明
WinMTR无需安装,直接解压运行即可。操作方法非常简单,说明如下:
- 如下图所示,运行程序后,在Host字段输入目标服务器域名或IP,注意不要包含空格。
- 单击Start开始测试。开始测试后,相应按钮变成了Stop。
- 运行一段时间后,单击Stop停止测试。
- 其它选项说明如下。
- Copy Text to clipboard:将测试结果以文本格式复制到粘贴板。
- Copy HTML to clipboard:将测试结果以HTML格式复制到粘贴板。
- Export TEXT:将测试结果以文本格式导出到指定文件。
- Export HTML:将测试结果以HTML格式导出到指定文件。
- Options:可选参数,包括的可选参数如下。
- Interval(sec):每次探测的间隔(过期)时间。默认为1秒。
- ping size(bytes):ping探测所使用的数据包大小,默认为64字节。
- Max hosts in LRU list:LRU列表支持的最大主机数,默认值为128。
- Resolve names:通过反查IP地址,以域名显示相关节点。
返回结果说明
默认配置下,返回结果中各数据列的说明如下:
- 第一列(Hostname):节点的IP或域名。
- 第二列(Nr):节点编号。
- 第三列(Loss%):节点丢包率。
- 第四列(Sent):已发送的数据包数量。
- 第五列(Recv):已成功接收的数据包数量。
- 第六、七、八、九列(Best 、Avg、Worst、Last):分别是到相应节点延迟的最小值、平均值、最大值和最后一次值。
工具二:tracert命令行工具
tracert(Trace Route)是Windows自带的网络诊断命令行程序,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。 tracert通过向目标地址发送ICMP数据包来确定到目标地址的路由。在这些数据包中,tracert使用了不同的IP生存期,即TTL值。由于要求沿途的路由器在转发数据包前必须至少将TTL减少1,因此TTL实际上相当于一个跃点计数器(hop counter)。当某个数据包的TTL达到0时,相应节点就会向源计算机发送一个ICMP超时的消息。
tracert第一次发送TTL为1的数据包,并在每次后续传输时将TTL增加1,直到目标地址响应或达到TTL的最大值。中间路由器发送回来的ICMP超时消息中包含了相应节点的信息。
用法说明
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name
常见可选参数说明
- -d:不要将地址解析为主机名(禁用DNS反解)。
- -h:maximum_hops,指定搜索目标地址时的最大跃点数。
- -j: host-list,指定沿主机列表的松散源路由。
- -w:timeout,等待每个回复的超时时间(以毫秒为单位)。
- -R:跟踪往返行程路径(仅适用于IPv6)。
- -S:srcaddr,要使用的源地址(仅适用于IPv6)。
- -4:强制使用IPv4。
- -6:强制使用IPv6。
- target_host:目标主机域名或IP地址。
命令输出示例
C:\> tracert -d 223.5.5.5
通过最多 30 个跃点跟踪到 223.5.5.5 的路由
1 请求超时。
2 9 ms 3 ms 12 ms 192.168.X.X
3 4 ms 9 ms 2 ms X.X.X.X
4 9 ms 2 ms 1 ms XX.XX.XX.XX
5 11 ms 211.XX.X.XX
6 3 ms 2 ms 2 ms 2XX.XX.1XX.XX
7 2 ms 2 ms 1 ms 42.XX.2XX.1XX
8 32 ms 4 ms 3 ms 42.XX.2XX.2XX
9 请求超时。
10 3 ms 2 ms 2 ms 223.5.5.5
跟踪完成。
适用于
- 云服务器 ECS