Ping命令是对两个TCP/IP系统连通性进行测试的基本工具,目的是为了测试目标主机是否可达。它利用ICMP回显请求(8,0)和回显应答(0,0)报文,而不用经过传输层(TCP/UDP)。Ping服务器一般在内核中实现ICMP的功能,Ping只有在安装了TCP/IP协议以后才可以使用。
Ping命令结构 我们称发送回显请求的 Ping 程序为客户,被 Ping 的主机为服务器。 ICMP 回显请求和回显应答报文: Ping 命令的类型值为 8 或 0 ,代码值为 0 。 标识符: Unix 系统在实现 Ping 程序时把 ICMP 报文中的标识符字段设置成发送进程的 ID 号。这样可以区分多个 Ping 实例。 序列号:从 0 开始,每发送一次新的回显请求就加 1 。通过 Ping 程序打印出返回的每个分组的序列号来查看是否有分组丢失,失序或重复。 Ping 程序通过在 ICMP 报文数据中存放发送请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在 ICMP 报文中的时间值,即是往返时间。 ICMP 回显请求和回显应答的时间差在 4ms 以下。 IP记录路由选项 Ping 程序提供了查看 IP 记录路由选项的功能。 Ping 程序提供 -R 选项来记录路由。它使 Ping 程序在发送出去的 IP 数据报中设置 IP RR 选项(该 IP 数据报包含 ICMP 回显请求报文)。这样,每个处理该数据报的路由器都把它的 IP 地址放入选项字段中。当数据报到达目的端时, IP 地址清单复制到 ICMP 回显应答中。这样返回途中所经过的路由器也被加入到清单中。当 Ping 程序收到回显应答时,它就打印出这份 IP 地址清单。 IP 记录路由选项的缺点: IP 首部中只有有限的空间来存放 IP 地址。 IP 首部中的首部字段长度是 4bit ,因此整个 IP 首部最长只能有 15 个 32bit 长的字(即 60 个字节)。由于 IP 首部固定长度为 20 字节, RR 选项用去 3 个字节,还剩下 40-3=37 个字节用来存放 IP 地址清单,即 37/4=9 个 IP 地址。对于现在的网络中,记录的容量是十分有限的。 IP 数据报中的 RR 选项的一般格式: Code : 1 个字节。指明 IP 选项的类型。 RR 选项的类型是 7 。 Len :是 RR 选项总字段长度。 Ping 程序一般情况都设置成最大长度 39 字节,最多可记录 9 个 IP 地址。 Ptr :基于 1 的指针字段,指向存放下一个 IP 地址的位置。它的最小值为 4 ,指向存放第一个 IP 地址的位置。随着每个 IP 地址存入清单, ptr 的值分别为 8 , 12 , 16… 最大到 36 。当记录下 9 个 IP 地址后, ptr 的值为 40 ,表示清单已满。 当路由器在清单中记录 IP 地址时记录的是出站 IP 地址。当回显应答到达源主机时候,源主机将自己的出口地址也加入清单中。 IP时间戳选项 IP 时间戳选项与记录路由选项类似。 IP 时间戳选项的格式: 时间戳选项的代码为 0x44 。其他两个字段 len 和 ptr 与记录路由选项相同:选项的总长度(一般为 36 或 40 )和指向下一个可用空间的指针( 5 , 9 , 13 等) OF 字段表示溢出字段, FL 字段表示标志字段。时间戳选项的操作根据标志字段进行。标志 描述 0 只记录时间戳 1 记录经过的每台路由器的 IP 地址和时间戳,在选项列表中只有存放 4 对地址和时间戳的空间 3 发送端对选项列表进行初始化,存放了 4 个 IP 地址和 4 个取值为 0 的时间戳值。只有当列表中的下一个 IP 地址与当前路由器地址相匹配时,才记录它的时间戳。 如果路由器由于没有空间而不能增加时间戳选项,那么它将增加溢出字段的值。 如果要同时记录 IP 地址和时间戳(标志位为 1 ),那么就可以同时存入其中的四对值。只记录时间戳是没有意义的。因为没有标明时间戳与路由器之间的对应关系。 扩展Ping命令 -t 不停的 ping 目的主机,直到按下 Control-C 中断。 此功能没有什么特别的技巧,不过可以配合其他参数使用。 -a 解析目的主机的计算机名。 C:/D-Lab>ping -a 192.168.1.23 Pinging practice.dlab.com [192.168.1.23] with 32 bytes of data: Reply from 192.168.1.23: bytes=32 time<10ms TTL=254 Reply from 192.168.1.23: bytes=32 time<10ms TTL=254 Reply from 192.168.1.23: bytes=32 time<10ms TTL=254 Reply from 192.168.1.23: bytes=32 time<10ms TTL=254 Ping statistics for 192.168.1.21: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms //IP 为 192.168.1.21 的主机名为 practice.dlab.com 。 -n 发送指定的 Echo 数据包数。 在默认情况下,一般只发送四个数据包。通过 -n 选项可以定义发送的个数,对衡量网络速度很有帮助。比如想测试发送 35 个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少就可以通过以下获知: C:/D-Lab>ping -n 35 211.17.216.134 Pinging 211.17.216.134 with 32 bytes of data: Reply from 211.17.216.134: bytes=32 time=50ms TTL=241 Reply from 211.17.216.134: bytes=32 time=50ms TTL=241 Reply from 211.17.216.134: bytes=32 time=50ms TTL=241 Request timed out. ……………… Reply from 211.17.216.134: bytes=32 time=50ms TTL=241 Reply from 211.17.216.134: bytes=32 time=50ms TTL=241 Ping statistics for 211.17.216.134: Packets: Sent = 50, Received = 48, Lost = 2 (4% loss), Approximate round trip times in milli-seconds: Minimum = 40ms, Maximum = 51ms, Average = 46ms 由上可知发向目的主机 211.17.216.134 的 35 个数据包的当中,返回了 48 个,其中有两个由于未知原因丢失。这 48 个数据包当中返回速度最快为 40ms ,最慢为 51ms ,平均速度为 46ms 。 -l 定义 echo 数据包大小。 在默认的情况下 windows 下的 ping 发送的数据包大小为 32byte ,也可以通过 -L 选项定义它的大小,但上限只能发送 65500byte 。由于 Windows 系统的安全漏洞,当向对方一次发送的数据包大于或等于 65532 时,对方就很有可能 down 掉。 C:/D-Lab>ping -l 65500 -t 192.168.25.123 // 不停的向 IP 为 192.168.25.123 发送大小为 65500 字节的数据包,此命令带有攻击性。 Pinging 192.168.25.123 with 65500 bytes of data: Reply from 192.168.25.123: bytes=65500 time<10ms TTL=254 Reply from 192.168.25.123: bytes=65500 time<10ms TTL=254 ……………… 这种攻击的后果是使目的主机网络资源枯竭,各种服务被中断。 -f 在数据包中发送“不要分段”标志。 一般所发送的数据包都会通过路由分段再发送给对方,加上此参数以后路由就不会再对发送的数据包进行分段处理。 带有 -f 选项的 ping 是一种快速 ping 。使得 ping 发出的数据包速度和数据包从远程主机返回一样快,或者更快,达到每秒 100 次。在这种方式下,每个请求用一个句点表示,对于每一个响应打印一个空格键。 -i 指定 TTL 值在对方的系统里停留的时间。 此参数同样是帮助检查网络运转情况的。 -v 将“服务类型”字段设置为 tos 指定的值。 -r 在“记录路由”字段中记录发出和返回数据包的路由。指定的 count 值最小是 1 ,最大是 9 。 在一般情况下你发送的数据包是通过一个个路由才到达目的。通过此参数就可以设定想探测经过的路由的个数,不过限制数为 9 个,也就是说只能跟踪到最多 9 个路由。 C:/D-Lab>ping -n 1 -r 9 202.96.105.101 // 发送一个数据包,记录 9 个路由 Pinging 202.96.105.101 with 32 bytes of data: Reply from 202.96.105.101: bytes=32 time=10ms TTL=249 Route: 202.107.208.187 -> 202.107.210.214 -> 61.153.112.70 -> 61.153.112.89 -> 202.96.105.149 -> 202.96.105.97 -> 202.96.105.101 -> 202.96.105.150 -> 61.153.112.90 Ping statistics for 202.96.105.101: Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 10ms, Maximum = 10ms, Average = 10ms -s 指定 count 指定的路由和对应的时间戳。 此参数和 -r 类似,只是这个参数不记录数据包返回所经过的路由,最多只能记录 4 个。 -j 宽松的源站选路(路由稀疏源)。利用 computer-list 指定的主机列表路由数据包。在路经列表中的主机之间可以经过其它未在列表上的主机。 IP 允许的最大数量为 9 。 -k 严格的源站选路(路由严格源)。利用 computer-list 指定的计算机列表路由数据包。在路经列表中的主机之间不可以经过其它未在列表上的主机。 IP 允许的最大数量为 9 。 -w 指定超时间隔,单位为毫秒。 判断目标主机系统 可以通过 ping 回显应答的 TTL 值大小,粗略的判断目标主机的系统类型是 Windows 还是 UNIX/Linux 。一般情况下 Windows 系统返回的 TTL 值在 100-130 之间,而 UNIX/Linux 系统返回的 TTL 值在 240-255 之间。
