Ping命令的工作过程及单向Ping通的原因
Ping命令的工作过程及单向Ping通的原因
当网络出现问题时,我们最常用的测试工具就是“Ping”命令了。但有时候我们会碰到单方向Ping通的现象,例如通过HUB或一根交叉线连接的在同一个局域网内的电脑A、 B,在检查它们之间的网络连通性时,发现从主机A Ping 主机B正常而从主机B Ping 主机A时,出现“超时无应答”错误。为什么呢?
要知道这其中的奥秘,我们有必要来看看Ping命令的工作过程到底是怎么样的。
假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢?
首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表中查找出IP地址192.168.1.2所对应的物理地址(也叫MAC地址,熟悉网卡配置的朋友不会陌生,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。
从Ping的工作过程,我们可以知道,主机A收到了主机B的一个应答包,说明两台主机之间的去、回通路均正常。也就是说,无论从主机A到主机B,还是从主机B到主机A,都是正常的。那么,是什么原因引起只能单方向Ping通的呢?
一、安装了个人防火墙
在共享上网的机器中,出于安全考虑,大部分作为服务器的主机都安装了个人防火墙软件,而其他作为客户机的机器则一般不安装。几乎所有的个人防火墙软件,默认情况下是不允许其他机器Ping本机的。一般的做法是将来自外部的ICMP请求报文滤掉,但它却对本机出去的ICMP请求报文,以及来自外部的ICMP应答报文不加任何限制。这样,从本机Ping其他机器时,如果网络正常,就没有问题。但如果从其他机器Ping这台机器,即使网络一切正常,也会出现“超时无应答”的错误。
大部分的单方向Ping通现象源于此。解决的办法也很简单,根据你自己所用的不同类型的防火墙,调整相应的设置即可。
二、错误设置IP地址
正常情况下,一台主机应该有一个网卡,一个IP地址,或多个网卡,多个IP地址(这些地址一定要处于不同的IP子网)。但对于在公共场所使用的电脑,特别是网吧,人多手杂,其中不泛有“探索者”。曾有一次两台电脑也出现了这种单方向Ping通的情况,经过仔细检查,发现其中一台电脑的“拨号网络适配器”(相当于一块软网卡)的TCP/IP设置中,设置了一个与网卡IP地址处于同一子网的IP地址,这样,在IP层协议看来,这台主机就有两个不同的接口处于同一网段内。当从这台主机Ping其他的机器时,会存在这样的问题:
(1)主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段;
(2)主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去Ping其他机器,IP层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机Ping这台主机时,请求包从特定的网卡来,ICMP只须简单地将目的、源地址互换,并更改一些标志即可,ICMP应答包能顺利发出,其他主机也就能成功Ping通这台机器了
二、扩展PING命令参数
Router#ping
Protocol [ip]:
Target IP address: 165.48.183.12
Repeat count [5]: 10
Datagram size [100]: 1600
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: 165.48.48.3
Type of service [0]:
Set DF bit in IP header? [no]:
Data pattern [0xABCD]:
Loose, Srict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 10, 1600-byte ICMP Echoes to 165.58.183.12, timeout is 2 seconds:
!!!!!!!!!!
Success rate is 100 percent (10/10), round-trip min/avg/max = 36/39/48 ms
首先我们讨论特权模式下的ping的各种可用属性。每种属性的缺省值在括号中显示。
Protocol 需要测试的协议。
Target address 测试的目标地址。
Repeat count 如果出现间歇性的失败或者响应时间过慢,ping重复的次数。
Datagram size 如果怀疑报文由于延迟过长或者分段失败而丢失,则可以提高报文的大小。例如,我们可以使用1600字节的报文来强制分段。
Timeout 如果怀疑超时是由于响应过慢而不是报文丢失,则可以提高该值。
Extended commands 回答确定以获得扩展属性。
Source address 必须是路由器接口的地址。
Type of service 根据RFC 791 TOS规定的属性,通常缺省值为0。
Set DF bit in IP header? 通过设置DF位禁止分段,即使是报文超过了路由器定义的MTU也禁止分段。
Data pattern [0xABCD] 通过改变数据模式可以测试线路的噪声。
Loose,Strict,Record,Timestamp,Verbose[none] 这些都是IP报文头的属性。一般只使用Record属性和Verbose,其他属性很少被使用。Record可以用来记录报文每一跳的地址,Verbose属性给出每一个回应应答的响应时间。。
Sweep range of sizes [n] 该属性主要用于测试大报文被丢失、处理速度过慢或者分段失败等故障
Traceroute命令
Traceroute的工作原理:
Traceroute最简单的基本用法是:traceroute hostname
Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器...... traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?
Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。
Traceroute提取发 ICMP TTL到期消息设备的IP地址并作域名解析。每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。
Traceroute face="宋体" 有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP TTL到期消息的响应。然后,Traceroute给TTL记数器加1,继续进行
traceroute命令
那里 可以 用于 ping 验证设备的之间连通性,可以 用于traceroute命令发现路径信息包 开始对路由在哪里划分的远端目的地,并且。
目的在 traceroute 命令之后将记录 每个ICMP "时间超出的"消息的来源提供信息包开始到达目的地路径 的跟踪。
执行traceroute命令的 设备派出用户数据协议顺序 (UDP)数据包,其中每一带有增加存活时间(TTL)值,到一个无效的 端口地址(默认值33434)在远端主机。
首先,三个数据包被发送,其中每一与TTL域值设定 到1。当在路径,击中第一个路由器TTL值为1导致数据包对" 超时"; 此路由器然后回应与表明的ICMP "时间超出的"消 息数据包到期了。
其次,三更多UDP 信息被发送,其中每一带有设置的TTL值到2。这在路径导致 第二个路由器对目的地对回归ICMP "时间超出的"消息。
此进程继续直到信息包到达目的地 并且直到产生追踪途径的系统在路径从每个路由器收到了ICMP "时 间超出的"消息对目的地。 因为这些数据包设法访问一个无 效的端口(默认值33434)在目的地主机,主机回应与ICMP "表示一 个不可达的端口的端口不可得到的" 消息。此事件信号追踪 路由程序完成。
下面的表列出 traceroute命令字段说明。
字段
说明
协议[ ip ]:
提示对 于一个支持的协议。输入AppleTalk、clns、ip、Novell、阿 波罗、vines、decnet或者xns.默认值: ip.
瞄准 IP addres
您必须输入主机名或IP地 址。没有默认值。
源地址:
使用的路由器的接口或IP地址作为 源地址为探测。路由器正常选择出局接口的IP地址使用。
数字显示[ n ]:
默认值是有一个符号和数字显示; 然而,您 能抑制符号显示。
超时以秒钟[ 3 ] :
等待对探针信息包的一种回应的 秒钟的数量。默认值是3秒。
探测计数[ 3 ]:
将被发送的探测的 数量在每个TTL级别。默认计数是3。
最低的存活时间[ 1 ]:
第一次探测的TTL值。默认值是1 ,但可以设 置为一个高价值抑制已知跳跃显示。
最大存活时间[ 30 ]:
能使用的最大的TTL值。默认值是30。 traceroute命令终止当目的地 到达时或当此值达到时。
端口号 [ 33434 ]:
UDP探测消息使用的目 的地端口。 默认值是33434。
松散,严格,记录,时间戳,Verbose[none ]:
IP头选项。您能指定所有组 合。 traceroute命令发出提 示对于要求的字段。注意 traceroute命令在每次探测将安置请求的选项 ; 然而,没有保证所有路由器(或端节点)将处理选项
//这此不用记,也没有多大意义。 主要是应用
三、监视和测试配置
1。R1#ping
Protocol [ip]:
Target IP address: 12.1.1.2
Repeat count [5]:
Datagram size [100]: 3000
Timeout in seconds [2]:
Extended commands [n]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 3000-byte ICMP Echos to 12.1.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 100/128/192 ms
查看R2收送包的记录
R2#clea counters s1/0
Clear "show interface" counters on this interface [confirm
R2#sh int s1/0
TSerial1/0 is up, line protocol is up
Hardware is M4T
Internet address is 12.1.1.2/24
MTU 1500 bytes, BW 1544 Kbit, DLY 20000 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation HDLC, crc 16, loopback not set
Keepalive set (10 sec)
Restart-Delay is 0 secs
Last input 00:00:00, output 00:00:01, output hang never
Last clearing of "show interface" counters 00:00:01
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: weighted fair
Output queue: 0/1000/64/0 (size/max total/threshold/drops)
Conversations 0/1/256 (active/max active/max total)
Reserved Conversations 0/0 (allocated/max allocated)
Available Bandwidth 1158 kilobits/sec
Conversations 0/1/256 (active/max active/max total)
Reserved Conversations 0/0 (allocated/max allocated)
Available Bandwidth 1158 kilobits/sec
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
16 packets input, 15284 bytes, 0 no buffer
Received 1 broadcasts, 0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
16 packets output, 15284 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 output buffer failures, 0 output buffers swapped out
0 carrier transitions DCD=up DSR=up DTR=up RTS=up CTS=up
//收到的16个包,我们都知道一个IP数据包是1500字节。而我们发送是的3000字节,1500字节中数据大小是46--1500,1500还要加上IP包头开销。所以要分成三个包发送。
R2#sh int s1/0
Serial1/0 is up, line protocol is up
省略……
1 packets input, 24 bytes, 0 no buffer
Received 1 broadcasts, 0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
1 packets output, 24 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 output buffer failures, 0 output buffers swapped out
0 carrier transitions DCD=up DSR=up DTR=up RTS=up CTS=up
//每秒会发送一个24字节的数据包,我查了一下。IPV4占包头占24个字节。引用*(TCP报头是一个20字节长的段,在带有选项的时候可以达到24字节)
R1#ping
Protocol [ip]:
Target IP address: 3.3.3.3
Repeat count [5]: 3
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: 1.1.1.1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]: re
Number of hops [ 9 ]:
Loose, Strict, Record, Timestamp, Verbose[RV]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
Packet has IP options: Total option bytes= 39, padded length=40
Record route: <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
Reply to request 0 (300 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route:
(12.1.1.1)
(23.1.1.2)
(3.3.3.3)
(23.1.1.3)
(12.1.1.2)
(1.1.1.1) <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
End of list
Reply to request 1 (232 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route:
(12.1.1.1)
(23.1.1.2)
(3.3.3.3)
(23.1.1.3)
(12.1.1.2)
(1.1.1.1) <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
End of list
Reply to request 2 (228 ms). Received packet has options
Total option bytes= 40, padded length=40
Record route:
(12.1.1.1)
(23.1.1.2)
(3.3.3.3)
(23.1.1.3)
(12.1.1.2)
(1.1.1.1) <*>
(0.0.0.0)
(0.0.0.0)
(0.0.0.0)
End of list
Success rate is 100 percent (3/3), round-trip min/avg/max = 228/253/300 ms
//从上面输入可以看出PING记录是路由器出口的IP地址
R3#traceroute 1.1.1.1
Type escape sequence to abort.
Tracing the route to 1.1.1.1
1 23.1.1.2 60 msec 132 msec 96 msec
2 12.1.1.1 168 msec 156 msec *
//而traceroute则是记录着路由器入口的IP地址
R1#debug ip pa
IP packet debugging is on
R1#ping 3.3.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
!!!
*Dec 24 01:49:42.387: IP: s=12.1.1.1 (local), d=224.0.0.5 (Serial1/0), len 80, sending broad/multicast
*Dec 24 01:49:42.871: IP: tableid=0, s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), routed via FIB
*Dec 24 01:49:42.875: IP: s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), len 100, sending
*Dec 24 01:49:43.127: IP: tableid=0, s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), routed via RIB
*Dec 24 01:49:43.127: IP: s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), len 100, rcvd 3
*Dec 24 01:49:43.131: IP: tableid=0, s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), routed via FIB
*Dec 24 01:49:43.135: IP: s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), len 100, sending
*Dec 24 01:49:43.319: IP: tableid=0, s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), routed via RIB
*Dec 24 01:49:43.319: IP: s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), len 100, rcvd 3
*Dec 24 01:49:43.323: IP: tableid=0, s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), routed via FIB
*Dec 24 01:49:43.327: IP: s=12.1.1.1 (local), d=3.!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 168/220/288 ms
R1#3.3.3 (Serial1/0), len 100, sending
*Dec 24 01:49:43.487: IP: tableid=0, s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), routed via RIB
*Dec 24 01:49:43.487: IP: s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), len 100, rcvd 3
*Dec 24 01:49:43.491: IP: tableid=0, s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), routed via FIB
*Dec 24 01:49:43.495: IP: s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), len 100, sending
*Dec 24 01:49:43.679: IP: tableid=0, s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), routed via RIB
*Dec 24 01:49:43.679: IP: s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), len 100, rcvd 3
*Dec 24 01:49:43.683: IP: tableid=0, s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), routed via FIB
*Dec 24 01:49:43.687: IP: s=12.1.1.1 (local), d=3.3.3.3 (Serial1/0), len 100, sending
*Dec 24 01:49:43.967: IP: tableid=0, s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), routed via RIB
*Dec 24 01:49:43.967: IP: s=3.3.3.3 (Serial1/0), d=12.1.1.1 (Serial1/0), len 100, rcvd 3
四、总结
ping 与 traceroute一般都用于连通性的试测,不过使用扩展ping和traceroute可以让我得到更多链路上的信息