浅析常用网络协议之ARP

网络
如何根据目的IP获取到MAC地址呢,这时候ARP就登场了,IP地址通过 ARP,获得MAC地址,有了MAC地址才能在物理网络上传输数据。

Labs 导读

在我们平时发现上不了网的时候,或者刚刚配置好一台电脑的时候,有一个习惯就是ping,对于ping相信读者都比较熟悉,就是给你要ping的地址发送ICMP探测报文,看看这个目的地是否可达。对于网络的分层,读者应该或多或少有所了解,比如数据链路层、网络层、传输层、应用层,IP数据网络层,MAC属于数据链路层,完整的以太报文在网络中传输的时候,是携带MAC地址的,当你去ping某个地址的时候,比如ping 114.114.114.114,你可以知道IP,但你并不知道MAC地址。

Part 01、  ARP简介 

ARP,是地址解析协议(Address Resolution Protocol)。其基本功能为根据设备的IP地址来查询对应MAC地址的协议。主机通过ARP查询到MAC地址后,将在ARP缓存表中增加映射表项,即IP地址和MAC地址的映射表项,也就是我们常说的ARP表项。

ARP是一种常见又十分重要的协议,比如网络扫描、内网渗透、局域网流控、流量欺骗等都跟ARP脱不了干系。听上去这么重要的协议,说简单也简单,整个ARP完整交互过程仅需要两个报文搞定,一问一答。但是ARP协议本身也有令人迷惑的地方,由ARP本身延伸出来很多概念,比如动态ARP、静态ARP、免费ARP、代理ARP等等。

在深入到技术原理之前,我们先看下面三句话:

1、知道IP即可

一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,而且我们平时接触更多的也是IP地址,只要知道了IP地址,我们可以通过协议来获取通信所需的MAC地址,完成数据封装,这就是ARP协议的作用。

2、IP--->MAC的映射

ARP(Address Resolution Protocol)即地址解析协议, 用于实现从IP地址到MAC地址的映射,即询问目标IP对应的MAC地址。

3、逐层封装到链路层

在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。

图片

Part 02、ARP基本原理 

以我们平时最简单的一个ping的流程来切入:

主机A ping主机B为例,ping过程在网络中需要构造ICMP报文,ICMP报文简单来说就是MAC头+IP头+ICMP头,其中,MAC头中包含源MAC、目的MAC地址信息以及以太网协议类型(IPv4协议族的类型值为0x0800)。IP头中主要包含源IP地址、目的IP地址、协议类型(这个协议类型主要指的传输层协议类型,比如UDP是17,TCP是6,ICMP是1)。ICMP头中是一些控制面的信息,比如type代表是ARP请求还是ARP应答等等。

ARP请求和应答的过程如下图所示:

图片

我们分几个步骤来简单的描述上图中所示的ARP报文协议流程:

  • 为何要发送ARP

当在主机A命令行中敲入ping x.x.x.x(x.x.x.x为主机B的地址)的时候,系统会获取到目的IP(x.x.x.x),源IP(主机A的IP),ping字段代表要发送ICMP报文,要送入ICMP协议栈,所以以太网协议类型0x8000(代表IPv4)和IP头中的协议类型1(代表ICMP)也确定了,所以IP头的信息完整可以构造了,但是没有MAC头信息,所以在协议栈中封装完IP头后,封装MAC头前,主机A根据主机B的IP地址IP2去自己的ARP表中查询主机B的MAC,发现没有,说明要么没有发生过交互(如果发生过一次完整的ARP交互,会记录映射信息),要么就是发生过但是已经老化了(ARP表项每隔一段时间会老化),所以需要发送ARP请求给主机B。

  • 发送的ARP报文是什么样子

ARP请求报文简单来说就是在网络中发送一帧广播报文,目的MAC为全F,内层封装中有自身的IP、MAC信息,以及请求目标的IP地址,同一广播域中的交换机收到全F的广播报文后,会在该广播域内广播。ARP报文格式如图所示:

图片图片

  • 接收者收到之后会怎样

其他主机也会收到该广播报文,但是发现请求的不是自己的地址则不会做出回应,主机B收到之后,发现是请求自己的MAC地址,首先会将发起方(主机A)的IP和MAC的映射关系存入自身的ARP表项(简单来说,ARP请求首先要有自我介绍,然后才是询问),同时构造ARP应答报文发送到网络中。

  • 接收者发送的是什么报文

因为主机A在发送ARP请求的时候,走的是二层转发,二层转发需要MAC地址转发,所以交换机并不知道目的MAC地址该往哪里去,只能在发送端(主机A)发送广播报文,但是当主机B回复ARP应答的时候,已经知道了主机A的MAC地址,所以只需要发送单播报文就可以了,这就是为什么ARP请求是广播报文,ARP应答是单播报文。ARP应答报文如图所示:

图片图片

当然,如果在第一步,主机A查询自身ARP表项发现能够查到主机B的IP对应的MAC地址时,就不需要再发送ARP请求了,因为已经知道了MAC地址,直接封装二层头,然后发送完整的ICMP报文出去就可以了。

Part 03、  ARP表项 

前面提到过,主机中会存一个IP地址和MAC地址的映射关系表,这就是ARP表项,因为如果每次主机A和主机B通信前都要发送一个广播的ARP请求报文,会极大的增加网络负担。而且同广播域的所有设备都需要接收和处理这个广播的ARP请求报文,也极大的影响了网络中设备的运行效率。

为了解决以上问题,每台主机或设备上都维护着一个高速缓存,这是ARP高效运行的一个关键。在这个高速缓存中,存放主机或设备最近学习到的IP地址到MAC地址的映射关系,即动态ARP表项。主机或设备每次发送报文时,会先在本地高速缓存中查找目的IP地址所对应的MAC地址。如果高速缓存中有对应的MAC地址,主机或设备不会再发送ARP请求报文,而是直接将报文发至这个MAC地址;如果高速缓存中没有对应的MAC地址,主机或设备才会广播发送ARP请求报文,进行ARP地址解析。

前面在ARP基本原理中反复提到过ARP表项,那么前面所说由ARP报文交互流程而学习到的ARP表项称之为动态ARP表项,通过静态配置生成的ARP表项称之为静态ARP表项。静态ARP表项的优点是配置上之后,不需要再发送ARP报文了,可以节省网络开销,缺点是如果对端的信息发生变化,这条表项就失去意义了。

一方面由于高速缓存的容量限制,另一方面为了保证高速缓存中ARP表项的准确性,设备会对动态ARP表项进行老化和更新。

动态ARP表项的老化参数有:老化超时时间、老化探测次数和老化探测模式。设备上动态ARP表项到达老化超时时间后,设备会发送老化探测报文(即ARP请求报文),如果能收到ARP应答报文,则更新该动态ARP表项,本次老化探测结束;如果超过设置的老化探测次数后仍没有收到ARP应答报文,则删除该动态ARP表项,本次老化探测结束。

Part 04、 静态ARP 

前文也提到过静态ARP,这里详细介绍一下静态ARP。静态ARP表项在网络中也有着重要作用,比如某些流程中,不想通过触发ARP报文或者不允许触发ARP报文来学习链路层地址,则可以通过配置静态ARP表项来实现,配置完静态ARP表项之后,当协议栈在需要封装链路层信息的时候,不会发起ARP请求流程,而是直接从ARP表项中拿到对应的MAC地址,封装完成直接发出去。另外静态ARP表项在应对ARP攻击的时候也有重要作用。

静态ARP表项分为长静态ARP表项和短静态ARP表项。

➤ 长静态ARP表项:手动建立IP和MAC间的映射关系,并同时指定该ARP表项所在出接口。长静态ARP表项可以直接用于报文转发。

➤ 短静态ARP表项:手动建立IP和MAC间的映射关系,未同时指定出接口。如果出接口是处于二层模式的以太网接口,短静态ARP表项不能直接用于报文转发。当需要发送报文时,设备会先发送ARP请求报文,如果收到的ARP应答报文中的源IP和源MAC与所配置的IP和MAC相同,则将收到ARP应答报文的接口加入该静态ARP表中,后续设备可直接用该静态ARP表项转发报文。

Part 05、 结语 

ARP协议非常重要并且常用,是数据通信的入门协议,在网络中扮演着十分重要的角色,但就是这么一个关键角色,却十分不安全, 因为ARP协议是建立在网络中各个主机相互信任的基础上的,一旦有人利用这份信任,向某一主机发送伪ARP应答数据包,使该主机发送的信息无法到达预期的目的地或者走向错误的目的地,就是所谓的ARP欺骗或者ARP攻击。

ARP欺骗或者攻击可以导致目标主机与网关通信失败,也会让报文更改方向,所有的数据都会流入攻击者的主机中,造成数据外泄,影响安全。

当然,使用一些防范ARP攻击的杀毒软件可以提高一定的安全性,或者可以通过减少过期时间、建立静态ARP表项等手段去提高网络安全性。

责任编辑:庞桂玉 来源: 移动Labs
相关推荐

2011-07-20 10:20:04

2010-06-29 16:57:53

SNMP协议

2014-06-11 13:25:14

IPARPRARP

2010-06-09 15:23:25

2011-06-02 10:28:15

网络命令Arp

2019-10-31 08:43:43

ICMPARP协议ARP欺骗

2014-06-13 13:47:31

UDP

2010-09-09 16:28:19

2010-06-13 13:55:21

ARP协议

2010-06-12 17:53:14

ARP协议

2010-06-28 16:12:43

ARP协议

2011-05-13 10:11:34

IP协议ARP协议配置

2012-04-06 10:04:21

2011-04-06 11:20:46

2020-12-03 08:37:38

TCPIPARP协议

2011-12-19 15:53:35

2010-08-02 16:43:46

ICMP协议

2010-06-21 13:43:46

2010-06-13 14:31:28

2009-07-02 11:34:42

JSP指令JSP开发
点赞
收藏

51CTO技术栈公众号