前言
对于应用程序而言,我们与其他设备、服务通信,主要通过域名、IP进行通信,而以太网底层驱动,最终是通过MAC地址来表示设备的唯一标识,即IP是逻辑地址,并不是物理地址。在上一篇文章中,我们也能看到以太网帧首部中,就包含了源、目的设备的MAC的地址。所以我们需要一种IP与MAC相互转换的协议,这种协议就是ARP和RARP.
ARP : Address Resolution Protocol, 根据IP地址获取MAC。
RARP: Reverse Address Resolution Protocol, 根据MAC地址获取IP。
ARP 帧格式
其中:
参数 | 说明 |
---|---|
硬件类型 | 以太网默认为1 |
协议类型 | 0x0800-IPv4 |
硬件大小 | MAC地址大小 |
协议大小 | IP地址长度 |
Op | 操作类型,1-ARP请求;2-ARP相应;3-RARP请求;4-RAPR相应 |
发送方mac | |
发送方IP | |
目的MAC | |
目的IP |
ARP帧抓取示例
我们通过ping 指令就可以出发arp,需要先删除本地arp缓存。
测试指令:
ping 192.168.1.9
删除本地arp 缓存
我们先将本地ARP缓存表删除,命令如下:
arp -d
注意:该命令需要管理员权限。
arp 请求抓包
请求报文解析
ff ff ff ff ff ff // 目的MAC
XX XX XX XX XX XX // 源 mac, 隐藏
08 06 // 协议帧: 0806:ARP
00 01 // 硬件类型
08 00 // 协议类型, IPv4
06 // 硬件MAC地址长度
04 // 协议(ip)地址长度
00 01 // op操作类型。01-ARP请求;02-ARP相应;03-RARP请求;04-RARP响应
XX XX XX XX XX XX // 发送端mac, 隐藏
c0 a8 01 72 // 发送端IP
00 00 00 00 00 00 // 目的端MAC
c0 a8 01 09 // 目的IP
arp响应抓包
响应包解析
XX XX XX XX XX XX // 目的MAC, 隐藏
XX XX XX XX XX XX // 源 mac, 隐藏
08 06 // 协议帧: 0806:ARP
00 01 // 硬件类型
08 00 // 协议类型, IPv4
06 // 硬件MAC地址长度
04 // 协议(ip)地址长度
00 02 // op操作类型。01-ARP请求;02-ARP相应;03-RARP请求;04-RARP响应
XX XX XX XX XX XX // 发送端mac, 隐藏
c0 a8 01 09 // 发送端IP
XX XX XX XX XX XX // 目的端MAC,隐藏
c0 a8 01 72 // 目的IP
00 00 00 00 00 00
00 00 00 00
ARP在同一局域网/不同局域网运行过程
ARP在同一局域网运行过程
- 首先查看本地ARP缓存,若查到,则获取到对应IP的MAC,封装到以太网帧中。
- 如果从ARP缓存表中查不到,则设备发送1个ARP广播分组,具体内容见上述ARP请求包,在同一个局域网内的所有主机,都会收到这个广播信息,只有IP地址与ARP请求的目的IP相同时,便会以单播的形式回应给源主机,当源主机收到arp响应后,就会将目的IP与MAC地址映射写入到ARP缓存中。
ARP在不同局域网运行过程
- 主机将自己的IP地址与目的主机的IP进行与& 计算,判定是否在同一个子网内,如果不在同一个子网内。
- 主机便从ARP缓存表中,获取默认网关的MAC地址,向默认网关发送数据帧,即不在同一个局域网的,在当前网络中,是不用ARP请求的,只用网关的IP和MAC即可。
- 以太网帧数据运行到路由器时,路由器查询转发表,看转发表中是否有目的IP地址,如果有,则直接进行交付。