Windows系统中有两个用于网络诊断的命令:ping和ping6。它们分别用于发送ICMP ECHO_REQUEST到网络主机和ICMPv6版的ping实现。这两个命令在实际应用中非常有用,可以帮助我们测试网络连接质量、测量网络速度等。下面我们来详细了解一下这两个命令的使用。
1. ping
ping命令的基本语法如下:
```
ping [options] target
```
其中,`target`是要发送ICMP ECHO_REQUEST的目标地址。常用的选项有:
- `-t`:不停地ping指定的主机,要查看统计信息并继续ping,按Ctl+Break;要停止按Ctl+C。
- `-a`:把地址解析成主机名(NetBios名)。从上面就可以知道IP为192.168.1.21的计算机NetBios名为iceblood.yofor.com。
- `-n count`:发送count指定的Echo数据包数。在默认情况下,一般都只发送四个数据包,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助。比如我想测试发送50个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少就可以通过以下获知:
- `-l size`:定义echo数据包大小。在默认的情况下windows的ping发送的数据包大小为32 byte,我们也可以自己定义它的大小,但有一个大小的限制,就是最大只能发送65500 byte。微软公司为了解决这一安全漏洞于是限制了ping的数据包大小。
- `-f`:在数据包中发送“不要分段”标志。在一般你所发送的数据包都会通过路由分段再发送给对方,加上此参数以后路由就不会再分段处理。
例如,我们想要检测IP为192.168.1.21的计算机的网络连接情况,可以使用以下命令:
```
ping -t -n 50 -l 64 192.168.1.21
```
这将连续地向目标计算机发送50个大小为64字节的数据包,并实时显示统计信息。如果需要停止ping操作,可以按下Ctrl+C键。
以下是重构后的内容:
-i TTL:指定TTL值在对方的系统里停留的时间。此参数同样是帮助你检查网络运转情况的。
-v TOS:将“服务类型”字段设置为 tos 指定的值。
-r count:记录计数跃点的路由,即在“记录路由”字段中记录传出和返回数据包的路由。在一般情况下你发送的数据包是通过一个个路由才到达对方的,但到底是经过了哪些路由呢?通过此参数就可以设定你想探测经过的路由的个数,不过限制在了9 个,也就是说你只能跟踪到9个路由,如果想探测更多,可以通过其他命令实现。下面示例为发送一个数据包,最多记录9个路由:从上面我就可以知道从我的计算机到202.96.105.101一共通过了202.107.208.187 ,202.107.210.214 , 61.153.112.70 , 61.153.112.89 , 202.96.105.149 , 202.96.105.97这几个路由。
-s count:指定count个跃点数的时间戳。此参数和-r差不多,只是这个参数不记录数据包返回所经过的路由,最多也只记录4个。
-j host-list:记录指定主机列表的松散源路由数据包。连续主机可以被中间网关分隔(路由稀疏源),IP允许的最大数量为9。
-k host-list:记录指定主机列表的严格源路由数据包。连续主机不能被中间网关分隔(路由严格源),IP允许的最大数量为9。
-w timeout:等待每次回复的超时间隔,单位为毫秒。此参数没有什么其他技巧。
ping命令的其他技巧:通过ping回显的TTL值判断目标主机的系统类型是Windows还是UNIX/Linux。
TL(Time to Live,生存时间)是IPv4协议包头中的一个值,它用于指示网络路由器在网络中应该将数据包丢弃的最长时间。有很多原因可能导致包在一定时间内无法到达目的地。例如,错误的路由表可能导致数据包的无限循环。为了解决这个问题,一种方法是在一段时间后丢弃该数据包,并向发送者发送一条报文,以便发送者决定是否重发。
TTL的初始值通常是系统默认值,即8位字段。TTL最初的设计目的是为了确定一个时间范围,超过这个时间就应该丢弃数据包。由于每个路由器都会至少将TTL字段减1,因此TTL通常表示在被丢弃之前,数据包可以经过的最大路由器数量。当计数器减少到0时,路由器会决定丢弃该数据包,并向最初的发送者发送一条ICMP报文。Ping和traceroute命令都使用TTL值来尝试连接到指定的主机或跟踪到目标主机的路由。为了使数据包在到达目的地的过程中被各个路由器连续丢弃,traceroute将包的TTL值设置得较小。从发出数据包到收到返回的ICMP报文之间的时间用于计算从一个路由器到另一个路由器的时间。
不同操作系统的默认TTL值可能有所不同。通常,我们可以通过ping回显的TTL值来判断目标系统的类型。然而,这并非TTL的功能,只是对TTL功能的一种理解。实际上,TTL的值是可以修改的。某些特殊系统(如网络入侵检测系统)会定义特殊的TTL值,以拒绝非法访问数据进入网络。在使用PING命令时,可以通过-i选项指定TTL值,以便在路由器丢弃数据包之前允许通过的数据报数量达到指定值。如果将TTL设置为0,则该数据包将立即被丢弃。例如:
```markdown
ping -i 0 127.0.0.1
```
总之,TTL是由发送主机设置的,用于防止数据包在IP互联网络上无限制地循环传递。在转发IP数据包时,路由器需要将TTL值至少减小1。常见的操作系统默认TTL值如下:
操作系统| TCP传输| UDP传输
---|---|---
AIX| 60| 30
DEC Patchworks V5| 30| 30
FreeBSD 2.1| 64| 64
Linux| 64| 64
UNIX| 255| 255
详细的TTL默认值列表如下:
操作系统| TCP传输| UDP传输
---|---|---
Windows 95/98/ME系列| 32| 32
Windows NT系列(2000/XP/7)| 128| 128
FreeBSD 3.4, 4.x: 255
- OpenBSD 2.6, 2.7: 255
- NetBSD: 255
- HP-UX 9.0x: 30
- HP-UX 10.01: 64
- HP-UX 10.20: 255
- Irix 5.3, 6.x: 60
- UNIX: 255
- Linux: 64
- MacOS/MacTCP 2.0.x: 60
- OS/2 TCP/IP 3.0: 64
- OSF/1 V3.2A: 60 (previously was 30)
- Solaris 2.x: 255
- SunOS 4.1.3/4.1.4: 60
- Ultrix V4.1/V4.2A: 60 (previously was 30)
- VMS/Multinet: 64
- VMS/TCPware: 60 (previously was 64)
- VMS/Wollongong 1.1.1.1: 128 (previously was 30)
- VMS/UCX (latest rel.): 128 (previously was 128)
- Windows 95/98/NT 3.51: 32 (previously was 32)
Windows NT40/2000/XP/2003 系统返回的TTL值在100-130之间,而UNIX/Linux系列的系统返回的TTL值在240-255之间。一般情况下,可以通过修改注册表键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters中的DefaultTTL的值来判断操作系统类型。例如,将DefaultTTL设置为000000ff表示255,常用的值为255-FF、128-80、64-40、32-20。
Linux系统中的ping和ping6命令用于发送ICMP协议的ECHO_REQUEST数据包给主机或网关,以获取ICMP ECHO_RESPONSE响应。ping命令主要用于确定网络和各外部主机的状态、跟踪和隔离硬件和软件问题、测试、评估和管理网络。每一个ECHO_REQUEST数据包有一个IP头和ICMP头,后跟一个timeval结构和数目不定的填充字节,以填充数据包中剩下的空间。ping6由于使用ICMPv6,因此还能发送节点信息查询(RFC4620)。
ping命令每秒发送一个数据报并且为每个接收到的响应显示一行输出。它会计算信号往返时间和包丢失情况的统计信息,并且在完成之后显示一个简要总结。ping 命令在程序超时或当接收到SIGINT信号时结束。Host参数可以是一个有效的主机名或者是因特网地址。主要选项包括:
-c count:指定发送的数据包个数。
-f:使用洪泛ping。每一次发送 ECHO_REQUEST,都显示一个句号,而每接收到一个 ECHO_REPLY 信号,就显示一个退格。这就提供了一种对多少信息包被丢弃的信息的快速显示。如果没有设置时间间隔,则时间间隔默认为0,且响应包会尽快返回(或每秒100次,选择较快的一个)。只有超级用户可以使用这个选项。
-i interval:设置包发送之间等待的时间间隔(秒数)。默认等待时间为1秒(在洪泛模式下则为0)。只有超级用户能设置小于0.2秒的值。
以下是重构后的内容:
I:指定设备的源地址,可以是IP地址或设备名。
P:指定多达16个填充字节去填充发送的数据包。这有利于诊断一个网络对数据依赖的问题。例如,使用-p ff将信息包全部用1填充。
R:记录路由。在ECHO_REQUEST包中包含RECORD_ROUTE选项,并且显示返回包中的路由缓存。注意IP头仅仅大到适合9个这样的路由。而且,许多主机和网关忽略这个选项。
R:信息包绕开正常的路由表以直接发送到目标主机。如果主机不在一个直接连接的网络上,将返回一个错误。这个选项的作用是可以通过一个没有路由经过的接口(用-I选项指定)来ping一台本地主机。
S:指定数据包的字节数大小,缺省是56,当和8字节的ICMP头合并时被转换成64字节的ICMP数据包。
T:设置IP包的生存时间为ttl秒。
W:设置等待回应的超时时间。
ping的返回信息有“Request Timed Out”、“Destination Host Unreachable”、“Bad IP address”和“Source quench received”。
“Request Timed Out”这个信息表示对方主机可以到达但是TIME OUT,这种情况通常是对方拒绝接收你发给它的数据包而造成数据包丢失。大多数的原因可能是对方装有防火墙或已下线,也有可能是本机的IP不正确和网关设置错误。
(1)IP不正确:主要是IP地址设置错误或IP地址冲突,这可以利用ipconfig /all这命令来检查。在Windows下IP冲突的情况很少发生,因为系统会自动检测在网络中是否有相同的IP地址并提醒你是否设置正确。在NT中不但会出现“request time out”这提示,有时还会出现“Hardware error”这提示,这个信息比较特殊,不要被它的提示所迷惑。
(2)网关设置错误:网关设置错误主要是网关地址设置不正确或网关没有帮你转发数据,还有就是可能远程网关失效。
在Windows操作系统下,当对方主机无法连接时(例如网络连接出现故障),系统会提示“Request Timed Out”。而在Linux操作系统下,系统会显示“Destination Host Unreachable”。
“Destination Net Unreachable”这个错误信息表示目标主机不存在或者无法与目标建立连接。需要说明的是,“destination host unreachable”和“time out”之间的区别:如果经过的路由器的路由表中存在通往目标的路由,但由于其他原因目标无法到达,那么会出现“time out”;如果路由表中根本没有通往目标的路由,那么就会出现“destination host unreachable”。
当你使用PING命令测试网络计算机时,如果网络设备出现故障,它会返回“destination host unreachable”的信息。如果局域网中使用DHCP分配IP地址,而恰好DHCP失效,那么使用PING命令就会出现这个错误。因为在DHCP失效时,客户端无法获得IP地址,只能手动设置IP地址。这些手动设置的IP地址往往位于不同的子网内,因此会出现“destination host unreachable”的错误。此外,子网掩码设置错误也可能导致这个错误。当然,网络线未接好也是一个重要的产生原因。还有一个比较特殊的情况是路由返回错误信息,通常会在“destination host unreachable”前加上IP地址,以说明哪个路由无法到达目标主机。这表明你的计算机与外部网络连接没有问题,但与某台主机的连接存在问题。例如:From 192.168.148.226 icmp_seq=50 Destination Host Unreachable。
“Bad IP address”这个错误信息表示你可能没有连接到DNS服务器,因此无法解析该IP地址,或者该IP地址不存在。而“Source quench received”这个错误信息相对较为特殊,出现的频率较低。它表示对方或中途的服务器繁忙,无法回应请求。