ARP协议和ARP脚本

什么是ARP协议

arp协议(Address Resolution Protocol)是一种地址解析协议。位于TCP/IP四层结构中的链路层,是通过IP地址寻MAC地址的一种协议。

ARP协议是怎么工作的

在局域网中,当主机或其它网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址是不够的,因为IP数据报文必须封装成MAC帧才能通过物理网络发送,因此发送站还必须有接收站的物理地址,所以需要一个从IP地址到物理地址的映射。APR就是实现这个功能的协议。

我们来通过一个实际例子来看看arp是如何工作的,假设主机A和B在同一个网段,主机A要向主机B发送信息。具体的地址解析过程如下

(1) 主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
(2) 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
(3) 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
(4) 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。

当主机A和主机B主机不在同一个网段时主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。

ARP协议和ARP脚本

ARP协议和ARP脚本
注意:
目的地址和源地址都是mac地址。
0800 0806 0835 分别对应IP ARP RARP
以太网帧的数据长度规定为最小46字节,最大为1500字节,ARP和RARP数据包的长度不够46要在后边补充填充位。最大传输单元(MTU:是指数据帧中的有效载荷的最大长度,不包括帧首部的长度),如果数据包长度大于(MTU),要进行分片。

ARP数据格式

ARP协议和ARP脚本

注意:
1.每台主机都会维护一个arp缓存表,可以用arp-a命令查看,缓存表中的项时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效。
2.以太网目的地址全F为广播地址。
3.帧类型0806表示ARP,硬件类型指链路层网络类型0x0001表示以太网,协议类型指要转换的地址类型0x0800表示ip协议,op字段为1表示ARP请求,为2表示ARP应答。

linux命令:
arp -a或arp –g:用于查看缓存中的所有项目。

arp -a ip:如果有多个网卡,那么使用arp -a加上接口的IP地址,就可以只显示与该接口相关的ARP缓存项目。

arp -s Ip 物理地址:可以向ARP缓存中人工输入一个静态项目。该项目在计算机引导过程中将保持有效状态,或者在出现错误时,人工配置的物理地址将自动更新该项目。

ARP脚本抓取对应主机MAC地址

ARP协议和ARP脚本
chmod u+x arp.sh

运行结果:ARP协议和ARP脚本

ping通后成功抓取到同一网络下的主机mac地址。

查看完整代码:https://github.com/blight-888/CentOs-/tree/master/net/arp