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之间