ARP协议

ARP协议存在的作用

在网网络通讯时,源主机的应用用程序知道目目的主机的IP地址和端又口口号,却不知道目目的主机的硬件地址,而而数据包首首先是被网网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目目的主机的硬件地址。ARP协议就起到这个作用。

ARP协议的组成

这里写图片描述

以太网目的地址:接收端的MAC地址
以太网源地址:发送方的MAC地址
帧类型 : 对于TCP / ID四层,每一层的协议可能不止一个,则接收端接收到的下层数据包递交给上层时,应对于不同协议的功能,则需要有一个标志位来表示下层数据上缴给哪一个协议去处理,以下列举基本的帧类型:
0800 IP数据包
0806 ARP请求/应答
8035 RARP请求/应答
硬件类型:链路层网网络类型,1为以太网网
协议类型:要转换的地址类型,0x0800为IP地址
两个地址长度:分别对于以太网网地址和IP地址分别为6和4(字节)
op:字段为1表示ARP请求,字段为2表示示ARP应答
后四位字段:一次对应发送方MAC地址、IP地址, 接收方MAC地址、IP地址

ARP过程

接下来我们来下一次ARP的完整过程,我们首先有两台主机H1和H2,当我们需要进行通信的时候,这个时候只是知道H1和H2的IP地址IP1和IP2,还有H1的MAC地址MAC1,但是无法知道H2的MAC地址,此时我们进行H1与H2通信,所以这个时候我们首先填充ARP数据报,此时的是请求ARP数据报,对目的地址填充ffffffffffff,op为1,然后,由前主机以广播的形式发送到当前局域网。

这里写图片描述

所以,当当前局域网当中的主机接受到这个广播的帧,会有两种情况,一种就是帧当中的IP2和自己不相符合,这样它们的操作就是丢弃这个帧,另外一种的IP地址和IP2符合,这个时候就来进行处理这个帧,此时,接受到请求报文的主机H2会发送一个应答ARP数据报给H1,这里ARP报文的发送端IP地址和发送端MAC地址,都是现在当前要发送应答报文的主机H2的IP2和MAC2,目的端IP地址和目的端MAC地址都当初发送请求报文的主机H1的IP1和MAC1。op现在为2,然后加一个以太网首部发送出去,当到达目的主机的时候,此时,首先取出以太网帧的首部,然后交给上层的ARP,上层的ARP进行处理,然后ARP可以从当中得到op,发现是应答报文,所以去看发送端的MAC地址,然后这样就得到了所需要进行通信的MAC地址。

这里写图片描述

### ARP协议的工作原理 ARP(Address Resolution Protocol)是用于将IP地址解析为MAC地址的协议。在网络通信中,数据传输依赖于MAC地址而非IP地址。每个设备在发送数据之前,必须知道目标设备的MAC地址。如果只知道目标设备的IP地址而不知道其MAC地址,则需要通过ARP协议进行查询。 当一个设备需要解析目标设备的MAC地址时,它会广播一个ARP请求帧。该请求帧含自己的IP地址和MAC地址作为源信息,以及目标设备的IP地址[^3]。所有接收到此广播的设备都会检查是否与请求中的目标IP地址匹配。如果匹配,则目标设备会向发起请求的设备发送一个单播ARP应答帧,其中含其自身的MAC地址[^1]。 #### ARP缓存的作用 为了提高效率并减少网络中的广播流量,设备通常会维护一个ARP缓存表。这个表记录了已知IP地址与MAC地址之间的映射关系。当设备需要解析某个IP地址对应的MAC地址时,首先会在本地ARP缓存中查找。如果找到匹配项,则直接使用缓存中的MAC地址;如果没有找到,则发起ARP请求[^5]。 #### ARP协议与MAC地址的关系 ARP协议的核心功能就是建立IP地址与MAC地址之间的映射关系。在网络通信中,IP地址用于标识主机的位置,而MAC地址用于标识主机的物理接口。当两台主机位于同一子网内时,它们可以直接通过ARP协议解析彼此的MAC地址并进行通信。如果两台主机不在同一子网内,则需要通过路由器转发数据。在这种情况下,源主机首先需要解析默认网关(通常是路由器接口)的MAC地址,然后将数据发送给路由器[^3]。 ```python # 示例代码:模拟ARP请求与应答过程 class ARP: def __init__(self): self.cache = {} def request(self, source_ip, source_mac, target_ip): print(f"Broadcasting ARP request: Who has {target_ip}? Tell {source_ip}") return {"type": "request", "source_ip": source_ip, "source_mac": source_mac, "target_ip": target_ip} def reply(self, source_ip, source_mac, target_ip, target_mac): self.cache[target_ip] = target_mac print(f"Sending ARP reply: {source_ip} is at {source_mac}") return {"type": "reply", "source_ip": source_ip, "source_mac": source_mac, "target_ip": target_ip} # 创建ARP实例 arp = ARP() # 发起ARP请求 request_packet = arp.request("192.168.1.10", "AA-BB-CC-DD-EE-FF", "192.168.1.1") # 接收ARP应答 reply_packet = arp.reply("192.168.1.1", "00-11-22-33-44-55", "192.168.1.10", "AA-BB-CC-DD-EE-FF") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值