ARP协议

ARP是地址解析协议,它的作用是在以太网环境下,通过3层的IP地址来找寻2层的MAC地址,得到一张ARP缓存表。转发数据的时候根据ARP缓存表来进行传输。
尽管Internet上的每台设备都有一个或多个IP地址,仅用这些地址仍然不能发送报文。数据链路层网卡如以太网卡不理解Internet地址。对于以太网,每一个以太网卡都有一个48bit的以太网地址。网卡基于这48bit以太网地址收发帧,网卡与32bit IP地址没有关系。

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用
  • 当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据 48位的以太网地址来确定目的接口的.

ARP报文

在以太网中,ARP请求和应答都有着下面的分组格式,总共48字节:

ARP协议_第1张图片
分组格式
  • 以太网的目的地址和源地址:目的以太网地址全为1,即FF:FF:FF:FF:FF:FF则为广播地址,在本地局域网内,所有的以太网接口都要接收这个数据帧

  • 帧类型:2个字节长的帧类型,告诉我们这个以太网数据帧携带的是什么数据。对于ARP来说这两个字节是0x0806,对于IP数据报是0x0800,还有RARP(逆地址解析协议)是0x8035。

  • 硬件类型和协议类型:这两个字段就是用来描述ARP分组的,硬件类型用来指代需要什么样的物理地址,协议类型则是需要映射的协议地址类型。用来描述ARP时,表达的就是我有协议类型IP,我需要的硬件类型是以太网的物理地址。那么硬件地址就为1,表示以太网地址,协议类型是0x0800,看这边与前面的帧类型中提到的IP数据报的帧类型是一样的,这是有意设计的。

  • 硬件地址长度和协议地址长度:这里的值分别为6字节和4字节。代表48bit的以太网地址,32bit的IP地址。

  • 操作码:1=>ARP请求, 2=>ARP应答,3=>RARP请求,4=>RARP应答。这些值用于区分具体操作类型,因为字段都相同,所以必须指明操作码,不然连请求还是应答都分不清。

  • 最后四个字段:
    源硬件地址
    源协议地址
    目标硬件地址
    目标协议地址。
    注意到这里有两个字段是与分组首端重复的。我们在发送ARP请求时,只有目标硬件地址是空着的,因为我们请求的就是它的值,当对应机器收到后,就会把自己的硬件地址写到这个字段,并把操作码改成2,再发回去。于是就知道彼此的硬件地址,开始真正的通讯。

ARP高速缓存

知道了ARP发送的原理后,我们不禁疑惑,如果每次发之前都要发送ARP请求硬件地址会不会太慢,但是实际上ARP的运行是非常高效的。那是因为每一个主机上都有一个ARP高速缓存,我们可以在命令行键入arp -a获取本机ARP高速缓存的所有内容:

? (10.0.0.253) at 0:c:29:39:3b:6f on en0 ifscope [ethernet]
? (10.0.63.255) at (incomplete) on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]

高速缓存中的每一项的生存时间一般为20分钟,有了这些缓存,我们经常直接使用硬件地址,加快速度了。以上说的都是在一个本地网络内完成的,如果ARP请求是从一个网络主机发送到另一个网络主机呢?下面介绍ARP代理的概念。

ARP代理

如果ARP请求是从一个网络主机发送到另一个网络主机,那么连接这两个主机的路由器就可以回答该请求,这个过程称为委托ARP或者ARP代理。我们知道IP路由选择,如果主机不相连,我们就把数据报发送到一默认路由上,由路由器来转发该数据报。在ARP协议中,我们发往网络的请求主机物理地址也会由路由器回答,得到的就是路由器的物理地址,发送方就根据这个物理地址把数据报发送到路由器,由路由器转发,再下面的事情由路由器完成,那是属于IP协议的事了,当然在那个过程中,也不断使用ARP协议获取每一步的物理地址。

目标IP与自己在同一网段

  • arp高速缓存有目标IP的MAC地址:直接发送到该物理地址。
  • arp高速缓存没有目标IP的MAC地址:发送ARP广播请求目标IP的MAC地址,缓存该MAC地址,然后发数据报到该MAC地址。

目标IP与自己不在同一网段

  • 这种情况需要将包发给默认网关,所以主要获取网关的MAC地址
  • arp高速缓存有默认网关的MAC地址:直接发送IP数据报道默认网关,再由网关转发到外网。
  • arp高速缓存没有默认网关的MAC地址 :还是发送ARP广播请求默认网关的MAC地址,缓存该地址,并且发送数据报到网关。

ARP协议工作过程

1.当主机A向本局域网上的某个主机B发送IP数据报时,就先在自己的ARP缓冲表中查看有无主机B的IP地址。
2.如果有,就可以查出其对应的硬件地址,再将此硬件地址写入MAC帧,然后通过以太网将数据包发送到目的主机中。
3.如果查不到主机B的IP地址的表项。可能是主机B才入网,也可能是主机A刚刚加电。其高速缓冲表还是空的。在这中情况下,主机A就自动运行ARP。

  • 3.1 ARP进程在本局域网上广播一个ARP请求分组。ARP请求分组的主要内容是表明:我的IP地址是192.168.0.2,我的硬件地址是00-00-C0-15-AD-18.我想知道IP地址为192.168.0.4的主机的硬件地址。
  • 3.2在本局域网上的所有主机上运行的ARP进行都收到此ARP请求分组。
  • 3.3 主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件地址。其余的所有主机都不理睬这个ARP请求分组。ARP响应分组的主要内容是表明:“我的IP地址是192.168.0.4,我的硬件地址是08-00-2B-00-EE-AA”,请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
  • 3.4 主机A收到主机B的ARP响应分组后,就在其ARP高速缓冲表中写入主机B的IP地址到硬件地址的映射。

事例说明:用ping说明ARP工作的原理
假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping192.168.1.2。该命令会通过ICMP协议发送ICMP(以太网控制报文协议)数据包
该过程需要经过下面的步骤:  
1.应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序)

  1. 内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
    3.如果存在该IP-MAC对应关系,那么跳到步骤7,如果不存在该IP-MAC对应关系,那么接续下面的步骤;
    4.内核进行ARP广播,目的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址
  2. 当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;
    6.本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;
    7.内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;

ARP欺骗

ARP欺骗又叫ARP毒化,英文ARP spoofing,是一种针对ARP的攻击方式,这里简略介绍一下。
运行机制
ARP欺骗主要是攻击者发送大量假的ARP数据包到网络上,尤其是网关上。假设你的网关的IP地址是192.168.0.2,MAC地址为00-11-22-33-44-55,你发送的数据都会从这个MAC地址经过,这时候我发送大量ARP数据包,然而我的包是构造出来的,IP是你的IP,但是MAC地址我替换成了我的MAC地址,这时候你更新你的ARP缓存时,就会把我机器的MAC地址当成192.168.0.2的MAC地址,于是你的流量都到我这来了,我可以把你的数据改改再发给网关,或者什么都不做,你都上不了网了。

防治方法
最理想的用静态ARP,不过在大型网络不行,因为ARP经常需要更新,另外一种方法,例如DHCP snooping,网络设备可借由DHCP保留网络上各电脑的MAC地址,在伪造的ARP数据包发出时即可侦测到。此方式已在一些厂牌的网络设备产品所支持。

参考文章:
https://www.jianshu.com/p/65710069d934
https://blog.csdn.net/tigerjibo/article/details/7351992

你可能感兴趣的:(ARP协议)