本篇主要介绍 ARP 协议报文格式,使用命令,工作原理
感谢观看,欢迎提出问题
联系地址邮箱:blbagony@163.com
参考资源
ARP协议及使
ARP协议的作用
- ARP(Address Resolution Protocol):地址解析协议,用于将IP地址解析为以太网MAC地址(物理地址)的协议。
- 在局域网中,主机或其他网络设备发送数据给其他设备时,必须知道对方网络层的地址(IP 地址),但仅仅有有 IP 地址是不能将数据发送到某一台主机,需要一个从 IP 地址到物理地址的映射。ARP 就是实现这个功能的协议。
ARP报文格式
- 硬件类型:表示硬件地址的类型。它的值为1表示以太网地址;
- 协议类型:表示要映射的协议地址类型。它的值为 0x0800 即表示IP 地址;
- 硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或应答来说,它们的值分别为 6 和 4;
- 操作类型(OP): 1 表示 ARP 请求,2 表示 ARP 应答;
- 发送端 MAC 地址:发送方设备的硬件地址;
- 发送端 IP 地址:发送方设备的 IP 地址;
- 目标 MAC 地址:接收方设备的硬件地址;
- 目标 IP 地址:接收方设备的 IP 地址;
工作原理
假设主机A和B在同一个网段,主机A要向主机B发送信息。如图1-2所示,具体的地址解析过程如下:
主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
实例演示
将数据包发送到主机要先将数据包发送到该主机所在的目的网络,送至后进行广播(ARP),该ARP帧中的目的硬件地址填写全一或全 f ,发送方 MAC 地址填写当前主机或网络服务器的硬件地址,目的 IP 地址填写起始发送方的IP地址。 发送后该网络中的每一台主机查看该 ARP 帧的目的 MAC 地址,发现是广播后移交给网络层,网络层查看自己的 IP 地址是否与该 IP报文 中目标 IP 地址相同,若不相同则直接丢弃。若相同,目的主机响应,填写刚刚收到的 MAC 地址,并将自己的 MAC 写入源 MAC 地址。这时,该网络中的每一台主机依旧能看到这份数据,但主机发现该 ARP 帧的目的 MAC 地址并不是广播或者自己的 MAC 地址会直接丢弃不会向上层交付。
ARP 协议在数据链路层的上层,在网络层的下面,介于两者之间。它是一种功能性的地址解析协议。
ARP表
设备通过 ARP 解析到目的 MAC 地址后,将会在自己的 ARP 表中增加 IP 地址到 MAC 地址的映射表项,以用于后续到同一目的地报文的转发。
ARP表项分为动态 ARP 表项和静态 ARP 表项:
- 动态 ARP 表项由 ARP 协议通过 ARP 报文自动生成和维护,可以被老化,可以被新的 ARP 报文更新,可以被静态 ARP 表项覆盖。当到达老化时间、接口 down 时会删除相应的动态 ARP 表项。
- 静态 ARP 表项通过手工配置和维护,不会被老化,不会被动态 ARP 表项覆盖。
ARP命令
Linux 中用 arp -a 选项查看 ARP 表中缓存的 MAC 地址和对应的 IP 地址
Linux中的ARP操作
ARP脚本
- 通过arp脚本抓取对应主机mac地址
- 用 ifconfig 命令可以查看自己的 IP 地址和子网掩码;
- head中写入自己所在网络的网络号;
- -v 是筛选掉不存在的或者没有回应主机对应的 IP 地址;
- wait 是等待当前脚本所有执行结果结束;
#!/bin/bash
head='192.168.43'
i=1
count=0
while [ $i -le 254 ]
do
if [ $conut -gt 20 ];then
count = 0;
sleep 1
fi
ping -c1 "$head"".$i" &
let i++
let count++
done
wait
echo "###############################################"
arp -a | grep -v 'incomplete'
echo "###############################################"
执行结果
- 主机名称 + IP 地址 + MAC 地址 + 网卡