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