ARP 协议

ARP 协议,第1张

网络设备有数据要发送给另一台网络设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。通过目的IP地址二获取的MAC地址的过程是由ARP(Address Resolution Protocol)协议来实现的。

数据链路层在进行数据封装的时候,需要目的MAC地址。

一台网络设备要发送数据给另外一台网络设时,必须要知道对方的IP地址。但是,仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过数据链路层进行发送,而数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。每一个网络设备在数据封装前都需要获取下一跳的MAC地址。IP地址由网络层来提供,MAC地址通过ARP协议来获取。ARP协议是TCP/IP协议簇中的重要组成部分,ARP能够通过目的IP地址发现目标设备的MAC地址,从而实现数据链路层的可达性。

ARP数据包格式:

关于ARP协议属于2层还是3层的讨论:

https://networkengineering.stackexchange.com/questions/5064/on-which-layer-of-the-osi-model-does-the-arp-protocol-belong

这里有句话很好:OSI只是一个模型,没有任何一个协议是完全属于哪一层的。

我们看帧结构,ARP数据直接包含在Ethernet_II中,我个人认为它可以归纳于二层。

网络设备通过ARP报文来发现目的MAC地址。ARP报文中包含以下字段:

1)Hardware Type:硬件地址类型,一般为以太网;

2)Protocol Type:表示三层协议地址类型,一般为IP;

3)Hardware Length和Protocol Length为MAC地址和IP地址的长度,单位是字节; (这个理论上可以不要,因为前面已经确定了硬件类型和协议类型)

4)Operation Code指定了ARP报文的类型,包括ARP request和ARP reply;

5)Source Hardware Address 指的是发送ARP报文的设备MAC地址;

6)Source Protocol Address指的是发送ARP报文的设备IP地址;

7)Destination Hardware Address指的是接收者MAC地址,在ARP request报文中,该字段值为0;

8)Destination Protocol Address指的是接受者的IP地址。

通过ARP协议,网络设备可以建立目标IP地址和MAC地址之间的映射。网络设备通过网络层获取到目的IP地址之后,还要判断目的MAC地址是否已知。

网络设备一般都有一个ARP缓存(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应的信息,则通过发送ARP request报文来获得它。学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表现会被自动删除。

如果目标设备位于其他网络则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。

在本例中,主机A的ARP缓存表中不存在主机C的MAC地址,所以主机A会发送ARP Request来获取目的MAC。ARP request报文封装在以太帧中。帧头中的源MAC地址为发送端主机A的MAC地址。此时,由于主机A不知道主机C的MAC地址,所以目的MAC地址为广播地址 FF-FF-FF-FF-FF-FF 。ARP request 报文中包含源IP地址,目的IP地址,源MAC地址,目的MAC地址,其中目的MAC地址的值为0。ARP request报文会在整个网络上传播,该网络中所有主机包括网关都会接受到此ARP request 报文。网关会阻止该报文发送到其他网络上。

所有主机接收到该ARP request报文后,会检查它的目的协议地址(一般是 00-00-00-00-00-00-00 与所有的匹配)字段与自身的IP地址是否匹配。如果不匹配,则该主机将不会响应该ARP request报文。如果匹配,则该主机会将ARP报文中的源MAC地址和源IP地址信息记录到自己的ARP缓存表中,然后通过ARP Reply报文进行响应。

主机C会向主机A回应ARP Reply报文。 ARP Reply 报文中的源协议地址是主机C自己的IP地址,目标协议地址是主机A的IP地址,同事Operation Code被设置为reply。ARP Reply报文通过单播传送。

主机A收到ARP Reply以后,会检查ARP报文中目的MAC地址是否与自己的MAC匹配。如果匹配,ARP报文中的源MAC地址和源IP地址会被记录到主机A的ARP缓存表中。ARP表项的老化超时时间缺省为1200秒(20min)。

位于不同网络的网络设备在不配置网关的情况下,能够通过ARP代理实现相互通信。

在上述例子的组网中,主机A需要与主机B通信时,目的IP地址与本机的IP地址位于不同网络,但是由于主机A未配置网关,所以它会将以广播形式发送ARP request报文,请求主机B的MAC地址。但是,广播报文无法被路由器转发,所以主机B无法收到主机A的ARP请求报文,当然也就无法应答。

在路由器上启用代理ARP功能,就可以解决这个问题。启用代理ARP后,路由器收到这样的请求,会查找路由表,如果存在主机B的路由表项,路由器将会使用自己的G0/0/0接口的MAC地址来回应该ARP request。主机A收到ARP reply后,将以路由器的G0/0/0接口MAC地址作为目的MAC地址进行数据转发。

免费ARP可以用来探测IP地址是否冲突。

主机被分配了IP地址或者IP地址发生变化后,必须立刻检测其所分配的IP地址在网络上是否是唯一的,以避免地址冲突。主机通过发送ARP request报文来进行地址冲突检测。

主机A将 ARP request 广播报文中的目的IP地址字段设置为自己的IP地址,该网络中所有主机包括网关都会接收到此报文。当目的IP地址已经被某一个主机或网关使用时,该主机或网关就会回应 ARP reply 报文。通过这种方式,主机A就能探测到IP地址冲突了。

总结:

1.网络设备在什么情况下回发送ARP request?

源设备在发送数据给目的设备前,会首先查看自身的ARP缓存,查找ARP缓存是否在目的设备的IP地址和MAC地址的映射。如果存在则直接使用,如果不存在则会发送ARP request。

2.网络设备什么时候会产生免费ARP?

当网络上的一个设备被分配了IP地址或者IP地址发生变化后,可以通过免费ARP来检查IP地址是否冲突。

我所了解的一些情况如下:

PC发送免费ARP

case1:PC通过DHCP申请地址,在获取到IP地址后,会发送免费ARP,目的用于探测同一网段时候存在相同的IP地址终端,防止IP冲突。

case2:PC的MAC地址发生变化后,会发送免费ARP,用于刷新同网段其他终端保存该PC的ARP表现。这个是那本经典的TCP/IP红宝书上讲的,但是小编不了解什么情况下,PC的MAC地址会发生变化。

case3:服务器进行虚拟化后(Vmware、XEN),但VM迁移后,会发送RARP、ARP报文,这个不是免费ARP。

case4:同一网段存在相同IP的两个终端,单一个终端收到另外一个终端的ARP请求报文,原味SenderIP为自身IP,这时会发送免费ARP。(这个是小编印象中的,不一定是这样,有环境,你可以实践下)

网络设备Router发送免费ARP:

case1:vlanif接口shutdown/no shutdown后,会发送免费arp。

case2:VRRP的master会定时发送免费arp,单VRRP发生主备切换时也会发送免费arp。目的用于刷新下面的二层交换机的mac表项。

case3:Router的三层接口收到op为1、2,SenderIP为selfIP的免费arp,会发送op为2的免费arp。

目前遇到以上这些情况,应该还是有其他情况存在的。总之要记住免费arp的两个作用,对于其他情况也就很好分析了。

免费arp的作用1:告诉同网段的其他主机、接口,我的mac地址发生了变化。

作用2:告知同网段存在IP地址冲突。

《Tcp/Ip协议簇》读书笔记

在IP协议能够把一个分组从源主机交付到目的主机之前,它首先要知道如何将这个分组交付给下一跳;

IP在使用数据链路层服务时,它就需要知道下一跳的物理地址;

通过 地址解析协议(ARP) 可以做到这一点。

目标:

互联网是由许多物理网络和一些像路由器这样的连网设备组成。从源主机出发的分组在最终到达目的主机之前,可能要经过多个物理网络。

在网络这一级,主机和路由器是通过它们的逻辑地址来识别的。

逻辑地址就是互联网地址,它管辖范围是全局,逻辑地址在全局上是唯一的。

在物理这一级,主机和路由器是用它们的物理地址来识别的。

物理地址是一个本地地址,它管辖范围是本地网络,物理地址在本地网络内必须唯一,全局则没有要求。

把一个分组交付到主机或路由器需要用到两级地址:逻辑地址和物理地址。我们要把逻辑地址映射为响应的物理地址,反之亦然。映射可通过静态或动态方法来实现。

静态映射(static mapping) ,就是将逻辑地址和物理地址关联起来,存储在网络中的每一台机器上;

动态映射(dynamic mapping) ,只要机器知道了另一台机器的逻辑地址,它就可以使用协议找出相应的物理地址;

地址解析协议(ARP ) 和 逆向地址解析协议(RARP)。

ARP协议接受来自IP协议的逻辑地址,将其映射为相应的物理地址,再把物理地址递交给数据链路层。

任何时候,当主机或路由器需要找出这个网络上的另一个主机或路由器的物理地址时,它就可以 广播 一个 ARP查询分组 ;

网络上的每一台主机或路由器都会接收并处理这个ARP查询分组,但只有目的接收方认出自己的IP并返回一个 ARP响应分组 。

ARP分组格式如下:

ARP分组直接封装在数据链路层帧中。

帧中类型字段指出此帧所携带的数据是ARP分组。

典型互联网中ARP工作步骤:

有一种技术称为代理ARP,可用于产生一种子网划分的效果。 代理ARP(proxy ARP) 是代表了一组主机的ARP。

当运行代理ARP的Router收到一个ARP请求,希望找出这些主机中的某一台主机的物理地址时,Router就返回一个宣布它自己的硬件地址的ARP响应分组。Router收到真正的IP分组后,再将这些分组发送给响应主机或路由器。

当IP分组要通过一个ATM广域网时,我们需要一种协议来映射ATM广域网中给定的IP地址的离去点路由器的物理地址;

但是,局域网和ATM网络有一些区别。局域网是个广播网络(在链路层),但ATM网络不是一个广播网络,因此要处理这个任务需要其他解决办法。

ATMARP分组格式如下:

有两种方法可以连接ATM上的两个路由器: 永久虚电路(PVC)和 交换虚电路(SVC) ,ATMARP操作取决于连接方法。

永久虚电路(PVC)连接是由网络提供者在两个端点之间建立的。这些永久连接都指定了 VPI 和 VCI,且它们的数值被保存在每一个交换机的路由表中。

在PVC的情况下,反向请求报文和反向回答报文可以把物理地址和IP地址绑定起来。

反向请求报文,将自己的IP地址和物理地址告知对方;反向响应报文也是。

交换过报文后,两个路由器都增加了一个表项,将物理地址映射到PVC。

在使用交换虚电路(SVC)连接的情况下,路由器每一次想和另一个路由器(或主机)建立连接时,都必须建立一条新的虚电路。但是,仅当进入点Router知道离去点Router的物理地址时,这条虚电路才能建立(ATM不认识IP地址)。

要把IP地址映射为物理地址,每一个Router必须运行客户ATMARP程序,但只有一个计算机运行ATMARP服务器程序。

ATM是非广播网络,一个ATMARP请求报文不可能到达这个网络上的所有路由器。

建立虚连接的过程需要3个步骤:连接服务器、收到物理地址、建立连接。

连接服务器 通常,每一个路由器和服务器之间都建立了一条永久虚电路;

收到物理地址 如果进入点Router和服务器之间有一条连接,那么路由器就向服务器发送ATMARP请求报文。如果服务器能够找到相应的物理地址,就返回ATMARP响应报文;否则就返回ATMARP NACK报文,进入点Router收到 NACK报文,就丢弃这个数据报;

建立虚电路 在进入点Router收到离去点Router的物理地址后,它就能够请求在自己和离去Router之间建立一条SVC。ATM网络利用这两个物理地址建立虚电路,这条虚电路一致持续到进入点Router要求断开连接为止。

在SVC情况下,用请求报文和回答报文可以将物理地址和IP地址绑定。

建立映射表 当路由器第一次连接到ATM网络上时,在路由器和服务器之间就建立起一条永久虚电路,服务器向该路由器发送一个反向请求报文,路由器则返回一个反向响应报文。

有了这两个地址,服务器就能在它的路由表中建立一个表项,以便今后当这个路由器做为离去点路由器时能够用得上。

反向请求和反向响应报文也可用来构建服务器的映射表。

逻辑子网地址(Logical IP Subnet) ,一个大的局域网可以划分为若干个子网,同样,一个ATM网络也可划分为若干个逻辑上(非物理上)的子网。这样做方便 ATMARP 以及其他一些 需要在ATM网络上模拟广播操作的协议(如IGMP)。

连接在ATM网络上的Router可以属于一个或多个逻辑子网。

属于同一个逻辑子网的Router共享相同的前缀和子网掩码;

要使用ATMARP,各个子网中必须有一个独立的ATMARP服务器。

我们可以假设ARP软件包由以下五个构件构成: 高速缓存表(cache table),队列,输出模块,输入模块和高速缓存控制模块

这个软件包接收的是即将被封装成帧而需要一个物理地址的IP数据报。如果ARP软件包找到了物理地址,它就把这个IP分组和物理地址一起交付给数据链路层以便传输。

发送方往往不止一个IP数据报需要发送,如果对发送到同一个主机或路由器的每一个数据报都使用一次ARP协议,显然效率很低。解决办法就是高速缓存表。

当主机或路由器收到一个IP数据报响应的物理地址时,就可以把这个物理地址存储在高速缓存表中。但是,由于高速缓存表的空间非常有限,表中的映射关系可能只有几分钟。

高速缓存表以表项数组的形式实现,每个表项包含以下一些字段:

ARP软件包维持着一组队列,每个队列对应于一个终点,用来在ARP尝试解析硬件地址时保留IP分组。

输出模块把未解析的分组发送到相应的队列(queue),输入模块从队列中取出分组,并连同解析出物理地址一起发送给数据链路层传输。

高速缓存控制模块(Cache-Control Module)负责维护高速缓存表。

专门讨论ARP的RFC包括: RFC826 , RFC1029 , RFC1166 和 RFC1981


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/43398.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-23
下一篇2023-02-23

发表评论

登录后才能评论

评论列表(0条)

    保存