文章目录
简介
ARP,即Address Resolution Protocol,地址解析协议,可以将IP地址转换为MAC地址。在OSI模型中,MAC地址在第二层(数据链路),IP地址则在第三层(网络),二者之间无法直接通信,ARP就是沟通二者之间的桥梁。
Windows命令行中提供了arp命令,可用于查询本机ARP缓存中IP和MAC地址的对应关系,示例如下
bash
C:\Users\wx>arp -a
接口: 192.168.3.170 --- 0x10
Internet 地址 物理地址 类型
192.168.3.1 8c-de-f9-7f-f0-63 动态
192.168.3.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.22 01-00-5e-00-00-16 静态
224.0.0.251 01-00-5e-00-00-fb 静态
224.0.0.252 01-00-5e-00-00-fc 静态
239.255.255.250 01-00-5e-7f-ff-fa 静态
255.255.255.255 ff-ff-ff-ff-ff-ff 静态
其中,第一条192.168.3.1
→ \to →8c-de-f9-7f-f0-63
是默认网关,就是说,当本机发送数据后,若发现目标IP并不在本地子网,则交给该IP,这这个是路由器的功能。在网上找一个MAC地址查询工具,输入8c-de-f9-7f-f0-63
,可以查到设备厂商为小米,这正是我们用的红米路由器,在浏览器中输入192.168.3.1
即可进其设置界面。
后面的静态地址与其他协议有关,此处略去不讲。
发现局域网中其他设备
本地缓存的ARP对应表并不是一层不变的,只要触发ARP请求,就会产生一组对应地址。根据这个原理,可以搜索局域网中所有的网络设备,代码如下
for /L %i IN (1,1,254) DO ping -w 1 -n 1 192.168.3.%i
arp -a
其原理是,首先,对192.168.3.1
到192.168.3.254
之间的所有IP进行扫描,在扫描结束后,在查看本机ARP缓存地址列表,就可以找到局域网中的设备。当然,如果局域网中的设备多于254个,那么需要根据子网掩码,扫描更多的IP。
Wireshark抓包测试
打开Wireshark,选择一个网络(我这里是WLAN2),在过滤器输入框中输入arp,然后回车,wireshark就会自动过滤出ARP协议的数据。
由于ARP协议作用于IP到MAC转换的过程,所以想要获取ARP报文,只需连接一个之前未曾连接过的IP即可。
这里面的问题是,如果这个IP是某个外部的网络,计算机并不会直接与之相连,而是通过路由器这个桥梁,从而实际连接到的是路由器的IP,对应的自然也是路由器的物理地址,而这个地址早已写入了电脑的缓存表里,不会重新产生ARP报文。
所以具体操作方法为,先在当前网络中添加一个IP地址,并马上删除,然后再去ping这个IP地址,从而产生ARP协议报文。测试后,将这个IP删除,并设为自动IP以恢复网络。
bash
# 测试过程会断网
>netsh interface ip add address "WLAN 2" 192.168.3.123 255.255.255.0
>arp -d 192.168.3.123
>ping 192.168.3.123
> netsh interface ip delete address "WLAN 2" 192.168.3.123
> netsh interface ip set address "WLAN 2" dhcp
最终在Wireshark中截获的数据如下。

其右侧数据含义如下
6c 1f f7 78 87 69 | 以太网目标MAC地址 | ||
8c de f9 7f f0 63 | 以太网源MAC地址 | ||
08 06 | ARP协议标识 | ||
00 01 | 硬件类型,0001是以太网 | ||
08 00 | 协议类型, | ||
06 | MAC长度 | ||
04 | IP长度 | ||
00 01 | 操作类型,0001为ARP请求 | ||
8c de f9 7f f0 63 | 发送MAC地址 | ||
c0 a8 03 01 | 发送IP | ||
00 00 00 00 00 00 | ARP目标MAC地址,没找到 | ||
c0 a8 03 aa | 目标IP |
协议总结
Wireshark截获的ARP报文,可以分为两层,外层是其在以太网中的封装,格式如下
字节长度 | 6 | 6 | 6 | 28 | 18 | 4 |
---|---|---|---|---|---|---|
说明 | 目标地址 | 源地址 | 帧类型 | 报文 | PAD | CRC |
默认值 | - | - | 0x0806 |
报文内容如下
字节长度 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 |
---|---|---|---|---|---|---|---|---|---|
说明 | 硬件类型 | 协议类型 | MAC长度 | IP长度 | 发送者MAC | 发送者IP | 目标MAC | 目标IP | |
默认值 | 0x0001 | 0x0800 | 0x06 | 0x04 |
其中,操作类型为2时表示ARP应答。