【计算机网络】ARP协议工作原理

地址解析协议ARP

一 发送数据的过程

在学习ARP协议的工作原理之前,我们需要先知道为什么需要ARP协议,它在数据传输过程中有怎样的作用。

以下是计算机网络中发送数据的一个大致过程。

首先要知道,源主机发送数据要经过5层的封装,目的主机接收数据也要经过5层的解封装,中间系统只有低三层,只负责数据传输,数据在中间系统传输时,也要反复进行3层的封装和解封装。

以下是5层模型中发生数据的步骤:

  • 应用层有一个文件需要传输,也就是一个数据报文需要传输。
  • 传输层将数据报文进行分段,分成多段数据报
  • 网络层拿到数据报,加上首部,封装成IP数据报,再对IP数据报进行分片,以便分组转发,首部应该包含源IP地址和目的IP地址。
  • 数据链路层拿到IP数据报,加上首部和尾部(一般是帧检验序列FCS)封装成数据帧,首部应该包含源MAC地址和目的MAC地址。
  • 物理层拿到数据帧后,以比特流的形式去传输。

备注:MAC地址,即硬件地址,和IP地址不同的是,IP地址是网络层标志各主机和路由器的地址,而MAC地址是实际的物理地址。

发送数据的过程

由于每当数据到达链路层,都需要加上源MAC地址和目的MAC地址,所以就需要用到ARP解析协议,去完成下一跳的IP地址到MAC地址的映射,确定下一跳具体走哪,也就是确定下一跳的硬件地址。

二 ARP工作原理

  • 首先要知道,每一台主机都设有一个ARP高速缓存,里面存有本局域网上的各主机和路由器的IP地址到MAC地址的映射表,这些都是该主机目前知道的一些MAC地址。

  • 当主机A要向本局域网上的某台主机发送IP数据报时,就先在其ARP缓存中查看有无主机B的IP地址,如果有,就在ARP缓存中查找其对应的MAC地址,再把这个MAC地址写入MAC帧,然后通过局域网把该MAC帧发往此MAC地址。

  • 如果ARP缓存中没有该MAC地址,就需要经过以下步骤去获取目的MAC地址。

    • ARP进程在本局域网上广播发送一个ARP请求分组。ARP请求分组的主要内容为源IP地址和源MAC地址,以及目的IP地址。
    • 在本局域网上的所有主机(或路由器)上运行的ARP进程都收到此ARP请求分组。
    • 若主机B的IP地址与ARP请求分组中要查询的目的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,同时在这个ARP响应分组中写入自己的MAC地址。
    • 主机A收到主机B的ARP响应分组后,就在其高速缓存中写入主机B的IP地址到MAC地址的映射。至此,链路层就可以写入目的MAC地址,封装成MAC帧了。

下面是主机1要向主机3发送数据的过程(主机1和主机3在同一个网络,没有经过路由器)

备注:如果主机之间不在同一个网络,比如上图的主机1和主机5,则在数据传输过程中,需要经过多个路由器转发,可以发现,网络层的源IP地址和目的IP地址通常是保持不变的(NAT的情况可能改变),而链路层的源MAC地址和目的MAC地址是随着传输过程而发生变化的

三 小结

ARP协议简介

由于在实际网络的链路上传送数据帧时,最终必须使用MAC地址。

所以我们需要ARP协议:完成主机或路由器IP地址到MAC地址的映射。(解决下一跳走哪的问题)

ARP协议使用过程

检查ARP高速缓存,有对应表项则写入MAC帧,没有则用目的MAC地址为FF-FF-FF-FF-FF-FF的帧封装并广播ARP请求分组,同一局域网中所有主机都能收到该请求。目的主机收到请求后就会向源主机单薄一个ARP响应分组,源主机收到后将此映射写入ARP缓存(10-20min更新一次)。

ARP协议4种典型情况

  • 主机A发给本网络上的主机B:用ARP找到主机B的硬件地址;
  • 主机A发给另一网络上的主机B:用ARP找到本网络上一个路由器(网关)的硬件地址;
  • 路由器发给本网络的主机A:用ARP找到主机A的硬件地址;
  • 路由器发给另一个网络的主机B:用ARP找到本网络上的一个路由器的硬件地址。
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值