Ping命令的工作过程及单向Ping通的原因

2025-07-26 07:21:03 世界杯大力神杯

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.2Repeat count [5]: Datagram size [100]: 3000Timeout 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/0Clear "show interface" counters on this interface [confirmR2#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#pingProtocol [ip]: Target IP address: 3.3.3.3Repeat count [5]: 3Datagram size [100]: Timeout in seconds [2]: Extended commands [n]: ySource address or interface: 1.1.1.1Type of service [0]: Set DF bit in IP header? [no]: Validate reply data? [no]: Data pattern [0xABCD]: Loose, Strict, Record, Timestamp, Verbose[none]: reNumber 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=40Record 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 optionsTotal option bytes= 40, padded length=40Record 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 optionsTotal option bytes= 40, padded length=40Record 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 optionsTotal option bytes= 40, padded length=40Record 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 paIP packet debugging is onR1#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 msR1#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可以让我得到更多链路上的信息