作为一名网工,基本上都会有很长一段时间去解决网络中出现的各种问题吧。
比如说,在两台或多台路由器之间创建路由的时候,比如RIP、EIGRP或OSPF……
遇到网络故障的时候,你一般会最先使用哪条命令进行排障?
是Ping还是Traceroute?是Show还是Telnet?又或是Clear、Debug?
排障命令网上一搜,非常多了,但大多数都是讲点理论基础,在实际应用上,差点意思。
为了方便你更好地理解和吸收,遇到同样的情况的时候,可以直接复用。
今天这篇,先给你说说最熟悉的Ping命令,千万别错过这三个实用排障案例。
01
Ping的原理&功能
“ping”这个词源于声纳定位操作,指来自声纳设备的脉冲信号。
Ping命令的思想与发出一个短促的雷达波,通过收集回波来判断目标很相似:
即源站点向目的站点发出一个ICMP Echo Request报文,目的站点收到该报文后回一个ICMP Echo Reply报文。
这样就验证了两个节点间IP层的可达性——表示了网络层是连通的。
Ping命令功能主要是用于检查IP网络连接及主机是否可达。
02
RGNOS平台的ping命令
在RG系列设备上,Ping命令的格式是这样的:
代码语言:javascript复制ping ip-address
比如说,向主机10.15.50.1 Ping报文
代码语言:javascript复制RG# ping 10.15.50.1 //ping通的情况
Switch>PING
Target IP address or host: 10.15.50.1 //目的IP
Repeat count [5]: 2 //执行次数
Datagram size [100]: 8100 //数据包大小
Timeout in milliseconds [2000]: 5000 //延迟时间
Extended commands [n]:
Sending 2, 8100-byte ICMP Echos to 10.15.50.1,
timeout is 5000 milliseconds.
!!
Success rate is 100 percent (2/2)
Minimum = 21ms Maximum = 22ms, Average = 21msRG
# ping 10.15.50.1 //ping不通的情况
Sending 5, 100-byte ICMP Echos to 10.15.50.1,
timeout is 2000 milliseconds.
.....
Success rate is 0 percent (0/5)
03
Windows平台的Ping命令
在PC机上或Windwos为平台的服务器上,Ping命令的格式如下:
代码语言:javascript复制Ping [ -n number ] [ -t ] [ -l number ] ip-address
-n:Ping报文的个数,缺省值为5;
-t:持续地ping 直到人为地中断,Ctr Breack暂时中止ping命令并查看当前的统计结果,而Ctr C则中断命令的执行。
-l:设置Ping报文所携带的数据部分的字节数,设置范围从0至65500。例:向主机10.15.50.1 发出2个数据部分大小为 3000 Bytes的ping报文。
代码语言:javascript复制C:>ping -l 3000 -n 2 10.15.50.1
Pinging 10.15.50.1 with 3000 bytes of data
Reply from 10.15.50.1: bytes=3000 time=321ms TTL=255
Reply from 10.15.50.1: bytes=3000 time=297ms TTL=255
Ping statistics for 10.15.50.1:
Packets: Sent = 2, Received = 2, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 297ms, Maximum = 321ms, Average = 309ms
04
巧用Ping进行故障排除
排障案例① 连通性问题还是性能问题?
案例描述:
工程师小C,在配置完一台路由器之后执行Ping命令检测链路是否通畅。
发现5个报文都没有Ping通,于是检查双方的配置命令并查看路由表,却一直没有找到错误所在。
最后又重复执行了一遍相同的Ping命令,发现这一次5个报文中有1个Ping 通了——原来是线路质量不好存在比较严重的丢包现象。
工程师小C又配置了一台路由器,然后执行Ping命令访问Internet上某站点的IP地址,但没有Ping通。
有了上次的教训小L,再一次Ping了20个报文,仍旧没有响应。于是小L断定是网络故障。
但是在费劲周折检查了配置链路之后仍没有发现任何可疑之处。
最后小L采取逐段检测的方法对链路中的网关进行逐级测试,发现都可以Ping 通,但是响应的时间越来越长,最后一个网关的响应时间在1800ms左右。
会不会是由于超时而导致显示为Ping 不同呢?
受此启发,小L将Ping 命令报文的超时时间改为4000ms,这次成功Ping通了,显示所有的报文响应时间都在2200ms 左右。
建议和总结:
真的是Ping不通吗?这个问题需要定位清楚。
因为连通性问题和性能问题排错的关注点是不一样的——问题定位错误必然会导致排错过程的周折。
使用一般的Ping命令,缺省是发送5个报文的,超时时长是2000ms。
如果Ping不通情况发生,最好能够再用带参数-c和-t的Ping命令再执行一遍。
如:Ping -c 20 -t 4000 ip-address,即连续发送20个报文,每个报文的超时时长为4000ms,这样一般可以判断出到底是连通性问题还是性能问题。
排障案例② 使用大包ping对端进行MTU不一致的故障排除
案例描述:
某次开局,使用RG路由器与其他厂商的某路由器互连,并运行OSPF协议。
数据配置完毕后,一切正常,并在今后相当长的时间内设备运转稳定。但两个月后,用户反馈网络中断。
相关信息显示:
1、登录到两台路由器上,发现双方连接正常,可以相互Ping通对端地址。但OSPF协议中断。
2、登录RG路由器查看邻居状态,发现邻居状态机处于Exstart状态。打开相应的debug开关查看相应的报文信息,发现双方都可以收到Hello报文,但RG路由器发送DD报文后,一直没有收到对方回应的DD报文。
3、登录其他厂商的那台路由器,打开相应的debug开关,发现对方收到RG路由器发送的DD报文后,一发送了相应的DD报文予以回应。
原因分析:
初步断定,RG路由器没有收到DD回应报文,但对方确实发出来了。
既然可以接收到HELLO 报文说明链路是通畅的,而且多播报文的收发也没有问题。
那么有可能是对方发送的DD 报文有错误导致RG路由器拒收,但查看相应的信息,并没有报告接收到错误的DD 报文。
仔细查看某厂商路由器的调试信息发现这个DD报文很大有2000 多字节。
会不会是由于报文太大导致的问题呢?
试着Ping了一个2000字节的报文,结果不通。那么故障原因很可能是——由于双方的MTU不一致导致大包不通。
处理过程:
检查配置,发现对方路由器的MTU设置为4000多而RG路由器的MTU设置为1500,于是修改对端路由器的MTU为1500。
故障排除。
那么为什么工程初期没有问题呢?
这是因为前期DD报文长度小于1500字节,而后来网络扩容导致路由信息过多使DD 报文的长度超过了1500 字节。
建议和总结:
由于Ping 缺省报文是56 个字节,所以显示的Ping 通信息只是表示56字节的报文可以通而并不一定表示其他大小的报文仍旧可以通。
所以,应当善于使用Ping的其他参数来进行故障排除。
排障案例③ A能Ping通B,B就一定能Ping通A吗?
案例描述:
先来看个组网图。
在RouterA上配置一条指向2.0.0.0/8的静态路由:
代码语言:javascript复制RouterA(config)# ip route 2.0.0.0 255.0.0.0 1.1.1.1
在RouterA 上Ping RouterB 的以太网地址2.2.2.2,显示可以正常Ping通。
但是在RouterB上Ping RouterA的以太网地址3.3.3.3,却无法Ping通。
原因分析:
由于在RouterB 上却没有相应的配置到3.0.0.0/8 路由,所以从RouterB 上Ping不通RouterA的以太网口3.3.3.3 。
但是为何在A上可以Ping 通2.2.2.2 呢?同样是没有回程路由啊?
打开路由器上的IP报文调试开关发现,原来从RouterA上发出的ICMP报文的源地址填写的是1.1.1.1而不是3.3.3.3。
由于两台路由器的s0口处于同一网段,所以响应报文可以顺利到达RouterB。
建议和总结:
A能够Ping通B则B一定能够Ping通A(不考虑防火墙的因素),这句话的对错取决于A和B到底是指主机还是指路由器。
如果是指两台主机,那么这句话就是正确的。
如果是指两台路由器那就是错误的,因为路由器通常会有多个IP地址。
现在就有如下问题:当从一台路由器上执行Ping命令它发出的ICMP Echo报文的源地址究竟选择哪一个呢?
实际情况是路由器选择发出报文的接口的IP地址。