TCP/IP协议簇中ARP协议

一、ARP协议简介

在《IP协议》中咱们讲解了IP地址相关内容,IP协议中包含了目的IP地址和源IP地址,可是当一台主机把以太网数据帧发送到位于同一局域网上的另外一台主机时,是根据48bit的以太网地址来肯定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。缓存

还记得数据链路层的以太网的协议中,每个数据包都有一个MAC地址头么?咱们知道每一块以太网卡都有一个MAC地址,这个地址是惟一的,那么IP包是如何知道这个MAC地址的?这就是ARP协议的工做。网络

在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。ARP协议数据哪一层,不一样的资料有不一样的说法,这里不做重点讨论。数据结构

ARP(地址解析)协议是一种解析协议,原本主机是彻底不知道这个IP对应的是哪一个主机的哪一个接口,当主机要发送一个IP包的时候,会首先查一下本身的ARP高速缓存(就是一个IP-MAC地址对应表缓存),若是查询的IP-MAC值存不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的全部主机都会查询本身的IP地址,若是收到广播包的某一个主机发现本身符合条件,那么就准备好一个包含本身的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新本身的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工做。app

二、ARP协议结构

以前的文章《以太网数据包结构》能够看出图表示ARP协议的数据结构。ui

 

 

 这里先看一下典型的ARP包的组成结构。spa

 

 

 前面12个字节是MAC地址,在《以太网数据包结构》文章中讲解过,接下来是帧类型,其中0806表示是ARP协议帧。接下来,就是ARP数据包部分了,第一个硬件类型字段表示发送方想要知道的硬件接口类型硬件,对于以太网MAC地址,它的值应该为1。协议类型字段表示要映射的协议地址类型,它的值为0x0800时,即表示要映射为IP地址,能够看出,该值与以太网数据帧头中类型字段的值使用相同的一组值。blog

接下来的两个单字节长度的字段,称为硬件地址长度和协议地址长度,它们分别指出硬件地址和协议地址的长度,长度单位为字节。对于以太网上ARP请求或应答来讲,它们的值分别为6和4,表明MAC地址的长度和IP地址的长度。在ARP协议包中留出硬件地址长度字段和协议地址长度字段可使得ARP协议在任何网络中被使用,而不只仅只在以太网中。接口

操做字段op指出ARP数据包的类型,它们能够是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4),这里咱们只关心前两个类型。RARP为逆地址解析协议,这里简单说一下,RARP用于主机启动时得到本身的IP地址。这个过程很简单:主机启动时,广播发送一个RARP请求数据包,数据包中包含了自身的MAC地址,而后等待响应。网络中另外一台主机必须设置为监听RARP请求状态,并在收到请求后为该主机分配一个IP地址并返回RARP应答给主机,一旦收到应答,主机就有了IP地址,就能够在后续中使用了。内存

接下来的四个字段是发送端的以太网MAC地址、发送端的IP地址、目的端的以太网MAC地址和目的端的IP地址。路由

关于PAD填充字节,请看《以太网数据包结构》有讲解。

注意:在以太网的数据帧头部中和ARP数据包中都有发送端的以太网MAC地址。对于一个ARP请求包来讲,除接收方以太网地址外的全部字段都应该被填充相应的值。当接收方主机收到一份给本身的ARP请求报文后,它就把本身的硬件地址填进去,而后将该请求数据包的源主机信息和目的主机信息交换位置,并把操做字段op置为2,最后把该新构建的数据包发送回去,这就是ARP应答。

三、wireshark抓包分析

假设查询IP为192.168.0.103的MAC地址,使用以下命令

arp -a 192.168.0.103

 

 

 抓包分析

 

 

 这里分享下wireshark的抓包文件

连接:https://pan.baidu.com/s/1AWPj85Jb4nmLY8h2yJucUA  提取码:bxjq

四、ARP协议分类

ARP数据包的种类有两种:

一是ARP请求包,它是经过以太网广播的方式发送的,用于向具备某个IP地址的主机发送请求,但愿该主机返回其MAC地址;

二是ARP应答包,收到ARP请求的主机会比对该数据包中的IP地址与本身的IP地址是否符合,如果,则该主机向源主机返回一个ARP应答包,向源主机报告本身的MAC地址。源主机经过提取ARP应答包中的相关字段来更新ARP缓存表。

一个典型的arp缓存信息以下,在任意一个系统里面用“arp-a”命令:

 

 

 都会获得这样的结果。这样的高速缓存是有时限的,通常是20分钟(伯克利系统的衍生系统)。

五、ARP协议应用

基础知识:路由下有两个设备,他们相互知道对方IP和MAC,可是他们不能直接通信,须要路由作转发,若是两个设备直接用网线连起来,就是直接通信。

 举个栗子

路由下有两个设备,首先一点:每一个设备(包括路由),都有本身的ARP缓存表。设备A向局域网下设备B通信(A设备知道B设备的IP)

状况1:A知道B的MAC地址,也就是在本身的ARP缓存表有设备B,直接封包,交给路由就好。

状况2:A不知道B的MAC地址,也就是在本身的ARP缓存表没有设备B,此时比较不幸,发送数据须要延时发送,首先设备A会向网关(就是路由)ARP请求包(以太网目的地址是FF-FF-FF-FF-FF-FF),这时候分状况A和B。

状况A:路由知道设备B的MAC,也就是本身的ARP缓存表有设备B,把本身的知道的设备B的IP和MAC返给设备A,设备A更新一下,本身的ARP缓存表,按状况1处理。

状况B:路由不知道设备B的MAC,路由就在本身的局域网发送,ARP请求包,去问设备B的MAC。获得以后,再发送给A。A获得MAC地址后按照状况1处理。

上述状况说明,想要网络设备第一次就通信流畅,必需要局域网内的设备都知道本身的MAC地址,在网络设备开发中咱们通常在网络设备首次接入网络后,首先向局域网广播本身的<IP,MAC>地址信息,称为无回报(gratuitous)ARP请求,这样的一个ARP数据包将告诉其余主机关于本身的信息,其余主机根据各自收到的ARP包更新本身的ARP表项。上文中提到的伯克利系统的衍生系统,ARP的缓存表通常存储20分钟,若是不及时更新,主机会删除“离线”设备的ARP表,由于主机ARP缓存表内存有限,不可能存储无限的ARP表信息。针对这种状况,咱们开发网络设备,须要每隔一段时间广播一下本身的<IP,MAC>地址信息,表示本身“还活着”。可是不能太过频繁发送,频繁发送会被部分型号的路由认为是病毒。

六、ARP攻击

上一篇《IP协议》讲解了IP攻击,接下来说解下咱们常听的ARP攻击。

ARP协议有一个很大的漏洞,若是网络中的全部用户都规规矩矩,按照上述流程使用ARP就不会存在任何问题。但若是有恶意的设备收到一个ARP请求包(ARP请求包是广播形式发送的,局域网全部主机均可以收到),它无论包中的IP地址是否和本身相同,都会产生一个ARP应答包,告诉请求的用户:我这台主机的MAC地址就是你请求的目的IP地址匹配的MAC地址。另外一方面,因为发送ARP请求的源主机不具有任何容错、认证功能(ARP协议未提供任何机制实现这些功能),这样它便会轻易地相信这条ARP应答,并把它加入到了本身的ARP缓存表中。这样作的后果可想而知,源主机在之后都会将具备该目的P地址的数据包发送到那个恶意的主机上。这样,它能轻松地实现数据的窃听,这也就是咱们经常据说的ARP攻击的基本原理。

 

 

 当PC1发送ARP协议询问PC2的MAC地址时,因为是广播的,PC3也收到了这个ARP请求包,PC3把不属于本身的广播包接收,同时回应一个虚假的回应包,告诉PC1我就是PC2。这样PC1会收到两个回应包(一个正确的IP2-MAC2,一个虚假的IP2-MAC3),可是PC1并不知道到底哪一个是真的,因此PC1会作出判断,而且判断后到达的为真,那么怎么让虚假的回应包后到达呢,PC3能够接二连三的发送这样的回应包,总会把哪一个正确的回应包覆盖掉。

然后PC1会创建IP2-MAC3这样一条ARP缓存条目,之后当PC1给PC2发送信息的时候,PC1依据OSI模型从上至下在网络层给数据封装目的IP为IP2的包头,在链路层经过查询ARP缓存表封装目的MAC为MAC3的数据帧,送至交换机,根据查询CAM表,发现MAC3对应的接口为Port3,就这样把信息交付到了PC3,完成了一次ARP攻击。

若是ARP攻击严重的话,恶意的网络设备只要在网络内阅读送上门的全部广播的ARP请求数据包,就能偷听到网内全部<IP,MAC>地址信息,进而监听多台网络设备。

 

防止办法:

咱们可使用静态ARP缓存表防止ARP攻击,可是缺点是违背了ARP协议的动态地址解析原则。

 

点击查看本文所在的专辑,STM32F207网络开发

相关文章
相关标签/搜索