【网络层】ARP 地址解析协议


ARP 含义以及作用

ARP:address resolution protocol 地址解析协议
网络设备将数据发给另一台网络设备时,必须要知道对方的网络层地址(IP地址)。IP地址是由网络层来提供的,但是IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须包含目的MAC地址,因此发送端拥有IP地址是不够的,还必须获取目的MAC地址。(数据帧包解析
因此,ARP协议就是用来实现通过目的IP地址而获取目的MAC地址的过程。
在这里插入图片描述
上图所示,当PC1去访问PC2的时候,帧包中只知道PC2目标的IP不知道它的MAC地址(MAC地址是没有规律的,每个设备的MAC地址都是全球唯一的,因此PC1不可能知道PC2的MAC地址)。这样PC1这就没有办法封装帧包头,也就无法将数据封装成帧包发送给PC2。
为了解决这个问题,就出现ARP协议。


ARP工作原理

类比生活中的场景,当所有人在一个空间中,我现在想要将重要的消息传给小王,现在需要先找到小王的位置应该如何做呢?
1、我:小王你在哪里?
2、小王:我在房间大门口。

在这个场景中,我是本机,小王是对端设备。本机当前知道的信息为:本机(源IP),本机位置(源MAC地址),对端设备(目的IP);本机为了获取对端设备的位置(目的MAC地址),在当前的环境中大喊:IP为XX.XX.XX.XX (小王)在哪里?当小王接收到信号就会回应:IP为XX.XX.XX.XX (小王)在 MAC为XX - XX - XX - XX- XX - XX

通过上诉的生活场景,大致初略的了解ARP是如何找到对端的MAC地址。现在通过模拟器 抓包,来看看真实的环境。
拓扑图如下:
在这里插入图片描述
拓扑图描述:
1、拓扑中有三台设备,一台交换机。(PC1为主机)
2、双击各个设备,对应配置每台设备的IP和MAC地址。
3、将所有设备打开。

右击PC1设备打开抓包工具Wireshark。
双击PC1设备进入命令行,输入:ping 10.0.0.3
在这里插入图片描述
当输入ping 10.0.0.3的时候,
第一个抓到的包就是ARP request请求,描述Info为:谁是10.0.0.3 ? 告诉10.0.0.1
第二个抓到的包就是ARP reply/respond回应,描述Info为:10.0.0.3 是在00.00.00.00.00.03

注:在请求过arp之后,再ping。是不会有arp包的。因为设备都记录在设备里 了。
查看ARP缓存命令 :Arp -a
清空ARP缓存命令 :Arp -d

PC1 和 PC3 的详细通信过程如下所示:
(1)当主机 PC1 想发送数据给主机 PC3 时,首先在自己的本地 ARP 缓存表中检查主 机 PC3 匹配的 MAC 地址。
(2)如果主机 PC1 在缓存中没有找到相应的条目,它将询问主机 PC3 的 MAC 地址, 从而将ARP请求帧广播到本地网络上的所有主机。该帧中包括源主机PC1的IP地址和MAC 地址。本地网络上的每台主机都接收到 ARP 请求并且检查是否与自己的 IP 地址匹配。如果 主机发现请求的 IP 地址与自己的 IP 地址不匹配,它将会丢弃 ARP 请求。
(3)主机 PC3 确定 ARP 请求中的 IP 地址与自己的 IP 地址匹配,则将主机 PC1 的地 址和 MAC 地址添加到本地缓存表。
(4)主机 PC3 将包含其 MAC 地址的 ARP 回复消息直接发送回主机 PC1(这个数据帧 是单播)。
(5)当主机 PC1 收到从主机 PC3 发来的 ARP 回复消息时,会将主机 PC3 的 IP 和 MAC 地址添加的自己的ARP缓存表。本机缓存是有生存期的,默认ARP缓存表的有效期是120s。 当超过该有效期后,将再次重复上面的过程。主机 PC3 的 MAC 地址一旦确定,主机 PC1 将能向主机 PC3 发送 IP 通信了。


ARP报文解析

ARP报文的类型分为request请求和reply/respond回应

ARP request请求

在这里插入图片描述
在这里插入图片描述
ARP 请求报文中 未知目标MAC地址显示全FF或者全00,这里抓包显示为全FF
ARP 的以太网帧头中目标MAC地址显示为全FF(表示发送的类型为广播帧,也就是说同一广播域的主机都会收到)
在同一个广播域中的主机都会收到广播帧,只有目标IP匹配的设备才会有回应,其他设备即使收到广播帧发现目标IP不匹配,不会有回应的。

报文格式
在这里插入图片描述
在这里插入图片描述
第一个字段是广播类型的 MAC 地址:0XFF-FF-FF-FF-FF-FF,其目标是网络上的 所有主机。
· 第二个字段是源 MAC 地址,即请求地址解析的的主机 MAC 地址。
· 第三个字段是协议类型,这里用 0X0806 代表封装的上层协议是 ARP 协议。

接下来是 ARP 协议报文部分其中各个字段的含义如下:
· 硬件类型:表明 ARP 协议实现在哪种类型的网络上。
· 协议类型:表示解析协议(上层协议)。这里一般是 0800,即 IP。
· 硬件地址长度:MAC 地址长度,此处为 6 个字节。
· 协议地址长度:IP 地址长度,此处为 4 个字节。
· 操作类型:表示 ARP 协议数据包类型。1 表示 ARP 协议请求数据包,2 表示 ARP 协议应答数据包。
· 源 MAC 地址:发送端 MAC 地址。
· 源 IP 地址:表示发送端协议地址(IP 地址)。
· 目标 MAC 地址:目标端 MAC 地址。
· 目标 IP 地址:表示目的端协议地址(IP 地址)。

ARP reply/respond回应

在这里插入图片描述
在这里插入图片描述
ARP响应的类型为单播帧,主要回复MAC给对端。

应答报文格式
在这里插入图片描述


ARP 缓存

ARP 扫描形成ARP缓存工作原理就是在同一个域内连续发送ARP请求,有响应的将信息缓存起来,用于后续通讯。这个过程不会被任何的策略或者方法所打断。
ARP 请求/响应之后,就会将信息存在ARP缓存中。但是ARP缓存中的信息是有时间限制的,在时间到了之后就会自动清空ARP缓存。这时如果再去ping设备,先查ARP缓存中没有响应的信息,会再一次发送ARP请求。
ARP缓存会记录 所有设备响应包中的源MAC和源IP。
在这里插入图片描述

命令解析
arp -a查看ARP缓存
arp -d清空ARP缓存
  • 17
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ARP协议地址解析协议)是一种用于将网络层地址(如IP地址解析为数据链路层地址(如MAC地址)的协议。其工作原理如下: 1.当主机A需要向主机B发送数据时,首先检查其ARP高速缓存(ARP Cache)中是否有主机B的IP地址对应的MAC地址。如果有,则直接将数据帧发送给主机B的MAC地址;如果没有,则执行第2步。 2.主机A向网络广播一个ARP请求包,请求包中包含主机A的IP地址和MAC地址,以及主机B的IP地址网络中所有主机都会收到这个请求包,但只有主机B会响应。 3.主机B收到ARP请求包后,会向主机A单独发送一个ARP响应包,响应包中包含主机B的IP地址和MAC地址。 4.主机A收到ARP响应包后,将主机B的IP地址和MAC地址存入其ARP高速缓存中,并将数据帧发送给主机B的MAC地址。 下面是一个简单的Python实现,用于发送ARP请求并接收ARP响应: ```python import socket import struct def get_mac_address(ip_address): # 创建ARP请求包 arp_request = struct.pack("!HHHBBH6s4s6s4s", # ARP请求包格式 0x0001, # 硬件类型:以太网 0x0800, # 协议类型:IPv4 0x0006, # 硬件地址长度:6 0x0004, # 协议地址长度:4 0x0001, # 操作类型:ARP请求 b"\x00\x00\x00\x00\x00\x00", # 发送方MAC地址 socket.inet_aton("192.168.1.100"), # 发送方IP地址 b"\x00\x00\x00\x00\x00\x00", # 目标MAC地址 socket.inet_aton(ip_address)) # 目标IP地址 # 创建套接字并发送ARP请求包 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW) s.bind(("eth0", socket.SOCK_RAW)) s.send(arp_request) # 接收ARP响应包 while True: packet = s.recvfrom(2048)[0] eth_header = struct.unpack("!6s6sH", packet[:14]) if eth_header[2] == 0x0806: # 如果是ARP响应包 arp_header = struct.unpack("2s2s1s1s2s6s4s6s4s", packet[14:42]) if socket.inet_ntoa(arp_header[6]) == ip_address: return ":".join("{:02x}".format(ord(c)) for c in arp_header[5]) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bazinga bingo

您的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值