• 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可以让我得到更多链路上的信息

  • 相关阅读:
    MySQL数据库备份
    执行SDK的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt)
    ftp删除目录和文件,目录下有文件删除提示【550 Remove directory operation failed.】
    Spring mvc接收中文参数值乱码(tomcat配置问题)
    python3获得命令行输入的参数
    Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)
    java定义object数组(可以存储String或int等多种类型)
    java方法中增加不固定参数
    ibatis和myBatis打印sql语句的log4j配置文件
    spring依赖注入之手工装配
  • 原文地址:https://www.cnblogs.com/gaveme/p/3677981.html
Copyright © 2020-2023  润新知