局域网络中,测试客户机当前是否在线一般都是ping对方,返回TTL=XXX 就在线,返回Request timed out一般就“当做”它不在线。极少有人继续往下探究,直到确定对方是否在线。

其实Request timed out真正的含义是对方没有响应ICMP ECHO REQUEST包或者响应这个包超时换句话说就是你没收到对方的ICMP ECHO REPLY包。下面几种情况都有可能返回Request timed out:

1.对方不在线

2.网络中存在防火墙(这里只考虑目标主机安装了防火墙的情况,不考虑网络设备与源头)

3.网络延迟或者网络拥塞(正常情况下极少发生)

可是后两种情况往往被人忽视。

 

一、原理部分

一个ping包的原理:

1.首先查本地arp cache信息,看是否有对方的mac地址和IP地址映射条目记录。如果有则直接发送icmp echo request包。

2.如果没有,则发起一个arp请求广播包,等待对方告知具体的mac地址。

3.收到arp响应包之后,获得某个IP对应的具体mac地址,有了MAC地址之后才可以建立数据链路层连接,进行通讯。同时对ip-mac地址做一个本地cache。
4.发出icmp echo request包,收到icmp echo reply包。
 
Tcpdump抓包求证ping过程:
22:00:29.123851 arp who-has 192.168.1.61 tell 192.168.1.122
22:00:29.123881 arp reply 192.168.1.61 is-at 0:f:1f:ff:71:44
22:07:47.655451 192.168.1.122 > 192.168.1.61: icmp: echo request (DF) (ttl 64, id 0, len 84)
22:07:47.655487 192.168.1.61 > 192.168.1.122: icmp: echo reply (ttl 128, id 25674, len 84)
 
 
二、Windump抓包使其无所遁形。
Ping远端开启XP内置防火墙的机器(192.168.2.27),以下操作均在本地机器完成。
本机安装WinPcap工具和拷贝windump工具。
打开两个命令提示符窗口。一个发送ping ip-addr命令。一个打开windump抓包。
注:为了确保能够发出arp请求,请先确认本地arp cache中没有缓存目标IP-MAC的条目,“arp -a”查看;或者清空arp缓存,“arp -d”,再进行以下操作。
 
窗口1,可以看到开启防火墙后得到time out。无法判断是否在线。
D:\Documents and Settings\Leaves>ping 192.168.2.27
Pinging 192.168.2.27 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 192.168.2.27:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
 
窗口2(需要上面的ping命令调用arp request请求,这就是上面ping的目的)
D:\>windump -n -i 1 arp host 192.168.2.17
windump: listening on \Device\NPF_{5AEB58D5-4F88-4B3F-B5D8-56ED494AF764}
16:07:38.721001 arp who-has 192.168.2.27 tell 192.168.2.17
16:07:38.721987 arp reply 192.168.2.27 is-at 00:03:ff:41:7b:9a    (有ARP回应,说明在线!小样,看你还敢不敢隐身)
 
windump参数
-D 获取网卡ID及信息
-i 接需要侦听网卡序号,利用-D得到。
-n 不把ip解析成计算机名
arp为协议
host 接需要侦听的IP(因为是我ping 2.27,所以我侦听自己的2.17端口ip)

 

路漫漫其修远兮,吾将上下而求索