ARP
ARP全称为Address Resolution Protocl,即地址解析协议。
该协议的功能就是根据IP地址,找到对应主机的MAC地址。
应用场景
以主机A找局域网内主机B的MAC地址为例,其工作流程如下:
- 本地主机A在局域网中广播ARP请求,ARP请求中包含目的主机的IP地址。意思是:
- Who has IP-B ? Tell A
- 局域网内只有主机B会应答该消息。主机B发送ARP应答包,里面包含IP地址及其对应的硬件地址。意思是:
- The MAC of IP-B is MAC-B
协议格式
抓包实例
上图是一个ARP request广播包的抓包截图。可以看出以下特点:
- 链路层的目的MAC地址为全1,表示广播。仅会在局域网内广播。
- 链路层的帧类型为0x0806,表示是ARP协议
- ARP request对应的Opcode为1
- ARP request中的Target MAC由于未知,故填写为全0
- ARP request中的Target IP就是要解析的IP地址
上图是一个ARP reply的抓包截图。可以看出以下特点:
- ARP reply中的Opcode为2
- ARP reply是单播,而ARP request是广播
ARP高速缓存
为避免频繁使用ARP request来请求MAC地址,系统都会维持一个高速缓存。Linux上可以用arp -a
命令查看。
无论本地主机是否发送ARP request,只要本地主机收到ARP reply包就会修改ARP高速缓存。正是由于这一特性的存在,导致了使用ARP协议进行中间人攻击成为可能。具体的攻击原理可参考这篇文章。
ARP代理
当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理。