在实践中深刻理解ARP协议

0.说明缓存


    本文为我我的计划撰写的博客专题《在实践中深刻理解常见网络协议》中关于ARP协议的一篇bash

有兴趣的朋友能够继续关注个人博客,我将会陆续撰写各类协议的实践分析文章。网络

        在同一个网络(无特别说明,均指以太网络)中进行通讯的主机,必需要拥有目标主机的MAC地址才可以正确地将数据发送给目标主机,那么如何知道目标主机的MAC地址呢?能够经过ARP协议。ARP协议就是用来获取目标IP地址所对应的MAC地址的,也就是说,ARP协议能够动态地在三层IP地址和二层MAC地址之间创建一种映射关系。能够用以下示意图来形象表示其做用:
ide

wKioL1cHdYrzdFoQAABCVOaI8VA489.png

        能够看到上面的图示是把ARP协议划分到网络层,也既是认为它是一个网络层的协议,这是出于它为网络层的IP协议提供服务而考虑的。但实际上,因为ARP协议用以解析出IP地址(逻辑地址)所对应数据链路层中的地址(物理地址/硬件地址),因此把其划分在数据链路层也是没有问题的,这并无严格的定义。学习

        咱们下面将经过具体的实践过程来分析四种常见的ARP包:ARP请求包、ARP响应包、无偿ARP包与IP地址冲突检测,同时也会分析一下ARP代理的发生过程。
ui

        这里会使用的环境以下:spa

  • 网络设备模拟器:GNS3操作系统

  • 抓包软件:Wireshark计算机网络




1.网络环境搭建3d


        为了简洁起见,这里不设置一个较大的网络环境来知足前面四种状况ARP包分析的须要,而是在分析不一样的ARP状况时分别搭建较小的网络环境,这样可使咱们的分析更有针对性。




2.ARP包报文格式


        以下:

wKiom1cGFGHRkO7MAAB5efhRsBY432.jpg

        注意咱们关注的是28字节的ARP包,只不过上面的图还包含了以太网首部字段信息(显然以太网首部的帧类型为ARP,在分析IP协议时提到过,这是一个数据分用的概念)。

        由于对于ARP包的分析,其实咱们更关心的应该是ARP请求包、ARP响应包、无偿ARP包或者ARP代理相关的知识,然后面的实践也主要是分类地进行讨论。因此下面先给出一个普通ARP包(请求包)的实际结构,而后再给出每个字段的具体含义(参考了《TCP/IP详解 卷1:协议》的部份内容),先做一个基本的了解,最后再详细分析这些包产生的过程:

  • 一个普通ARP包(请求包的实际结构)

wKioL1cHfA6QwK28AACIULqKkL8900.png

  • ARP包各字段具体含义(对比上面实际抓到的包)

字段 含义
硬件类型

占16位

表示硬件地址的类型,值为1即表示以太网地址,也就是MAC地址

协议类型

点16位

表示要映射的协议地址类型,值为0x0800即表示IP地址,由于本文都是在IP协议的基础上进行分析的(即网络层逻辑地址为IP地址),因此所抓到的包的该字段类型都为0x0800

硬件地址长度

占8位

指出硬件地址的长度,单位为字节,由于本文针对的是以太网,而以太网地址为MAC地址,占48位,即6字节,因此后面抓到的包中该字段的值都为6,再也不做特别说明

协议地址长度

占8位

指出三层逻辑地址的长度,单位为字节,由于本文针对的是以太网地址和IP地址的映射,而IP地址占32位,即6字节,因此后面抓到的包中该字段的值都为4,再也不做特别说明

操做字段

指出操做类型,对应的值以下:

  • ARP请求:1

  • ARP响应:2

  • RARP请求:3

  • RARP响应:4

但由于RARP如今已经不多使用了,因此本文不会讨论

发送端以太网地址

占48位

准确上说是“发送端硬件地址”,但由于本文只针对以太网进行讨论,因此表述为“发送端以太网地址”

发送端IP地址

占32位

准确上说是“发送端网络层逻辑地址”,但由于本文只针对的是以太网地址和IP地址的映射的讨论,因此表述为“发送端IP地址”

目的以太网地址 占48位
目的IP地址 占32位




3.在实践中分析ARP的实现过程:ARP请求、ARP响应


(1)网络环境搭建

        本节主要是抓取ARP请求包和ARP响应包来分析ARP请求与响应的一个详细过程,以及对应ARP包中相关字段的含义,这个实践的网络环境比较简单,以下:

wKioL1cH9t3A3IpcAAAYFDS8dzg450.png

        在R1路由器上作以下配置:

R1#conf t
R1(config)#int f0/0
R1(config-if)#no shu
R1(config-if)#ip add 192.168.1.1 255.255.255.0
R1(config-if)#do wr

        在R2路由器上作以下配置:

R2#conf t
R2(config)#int f0/0
R2(config-if)#no shu
R2(config-if)#ip add 192.168.1.2 255.255.255.0
R2(config-if)#do wr

        而后在R1路由器上查看arp缓存表:

R1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.1.1             -   cc01.127f.0000  ARPA   FastEthernet0/0

        能够看到arp缓存表中并无192.168.1.2的MAC地址,因此若是待会R1发送数据给R2,必然会有ARP请求发生,因此这里请确保R1中确实没有192.168.1.2的MAC地址,若是有的话,建议重启两个路由器。(虽然能够在路由器上执行clear arp-cache来清除arp缓存表,可是清除事后又会立刻生成,因此这里建议直接重启)


(2)抓取并分析ARP请求包和ARP响应包

        首先在R1和R2的链路上启动Wireshark,监测R1的接口。(这是GNS3的功能,能够直接抓取经过两个路由器之间链路的数据包)

        在R1上执行以下命令:

Router#ping 192.168.1.2

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 44/62/76 ms

        !表示数据发送成功,能够看到第一个是".",则表示数据发送失败,这是由于,第一个包在发送时,R1中并无192.168.1.2的MAC地址,因而就去发送ARP请求来得到其MAC地址,可是当得到MAC地址以后,第一个包已经超时了(等待MAC地址超时),并无发送出去,能够看下面抓到的包:

wKioL1cH-e3xXuGhAADU7E7LgVU534.png        

        能够看到已经有2个ARP包(1个请求和1回答)和8个ICMP包(4个请求和4个回答),这里咱们主要分析的是ARP包。

  • ARP请求包

        数据包结构以下:

wKiom1cH-kLC3NwiAABfmtjo-0M195.png

        字段分析以下:

a.硬件类型、协议类型、硬件地址长度、协议地址长度

        这几个字段的内容跟前面讨论的同样,由于针对的是以太网和IP地址

b.操做字段Opcode

        能够看到Opcode的值为request(1),因此这是一个ARP请求包。

c.发送端以太网地址

        咱们是从R1向R2发送数据的。

        从前面的命令执行结果:

R1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.1.1             -   cc01.127f.0000  ARPA   FastEthernet0/0

        这确实是R1的MAC地址(配置了192.168.1.1 IP地址的接口的MAC地址)。

d.发送端IP地址

        发送端也确实是192.168.1.1,也就是R1。

e.目的以太网地址

        能够看到这里为全0,在ARP请求包中,会把目的以太网地址字段的值置为全0,由于此时并不知道目的以太网地址是什么(也就是不知道192.168.1.2的MAC地址是多少)。

f.目的IP地址

        数据包是从R1发送给R2的,因此目的IP地址就是192.168.1.2,R2收到这个ARP请求包以后,若是看到这个字段的内容是本身的IP地址,就会回复这个ARP包,也就是会发送一个ARP响应包。


        其实字段内容并不难理解,不过这里须要注意一点是,查看这个ARP请求包的数据链路层的目的MAC地址:

wKioL1cH_3eSuNofAABuEHLgQXk437.png

        会发现其是一个广播地址,这也就意味着,发送一个ARP请求包,以太网中的全部主机都可以收到该ARP请求包,可是并非全部的主机都会回复这个ARP请求包,只有当接收者的IP地址与ARP请求包中的Target IP address中标识的目的IP地址一致时才会进行回复。


  • ARP响应包

        数据包结构以下:

wKiom1cIAIjD5WhMAABfYHDqc2M769.png

        对比ARP请求包来分析,其实发现并无相关多少,只是有如下几点区别:
a.ARP响应包的操做字段Opcode值为reply(2)

b.ARP响应包的二层目的MAC地址为ARP请求包发送者的MAC地址

        也就是说,ARP请求包是以广播的形式发送的,但ARP则是以单播的形式发送的,那么发给谁呢?ARP请求包是谁发送的,ARP响应包就发给谁,对应的二层目的MAC地址就是ARP请求包发送者的MAC地址

c.发送端以太网地址、发送端IP地址、目的以太网地址、目的IP地址

        跟ARP请求包的内容相反,只不过ARP响应包中的全部地址字段的值都是已知的,这个很容易理解,不过须要注意的是,在这个时候,ARP响应包到底要发给谁,已经很明确了,因此ARP响应包是一个单播包。


        正如上面看到的,理解常规的ARP请求包和ARP响应包的过程并不复杂,只要知道了网络通讯的基本原理,各个字段的值也就很容易理解了。




4.在实践中分析ARP的实现过程:无偿ARP与IP地址冲突检测


  • 有偿ARP

        前面在获取某个IP地址对应的MAC地址是,都须要先发送一个ARP请求包,而后再经过接收一个ARP响应包来知道该IP地址所对应的MAC地址,由于须要发送ARP请求包,咱们能够认为这是“有偿”的,即要付出一些代价。

  • 无偿ARP

        而所谓无偿ARP,指的就是,我不须要发送一个ARP请求包,对方就会“无偿”地把一个ARP响应包发给我(其实也主是主动发送过来),以此来告诉我它的MAC地址。

(1)网络环境搭建

        可是在总结何时对方会主动把一个ARP响应包发送过来以前,咱们先实践一下,网络环境仍是用上面的那个:

wKioL1cH9t3A3IpcAAAYFDS8dzg450.png

        不过咱们须要修改一下R2的IP地址,修改成192.168.1.252(在这个过程当中抓包软件Wireshark要打开),以下:

R2>en
R2#conf t
R2(config)#int f0/0
R2(config-if)#ip add 192.168.1.252 255.255.255.0


(2)抓取并分析ARP请求包和ARP响应包

        这样作以后打开Wireshark软件,会发现抓到下面这样一个包:

wKioL1cIBo6T_ObPAAAgd1QXSaA867.png        能够看到Info一列,有个Gratutous的标识,中文意思就是“无偿,免费”的意思,咱们能够查看一下数据包的结构:

wKiom1cIBo7w_G8_AABrB1Dg3DE060.png

        经过查看操做字段Opcode的值,其实能够发现,无偿ARP其实也是一个ARP响应包(不过普通的ARP响应包是以单播的形式发送的,而无偿ARP是以广播的形式发送的),只不过这个ARP响应包比较特别,它是主动发送的,即它是gratuitous,无偿的。

        另外须要注意的是,发送端IP地址和目的IP地址是同样,这正是无偿ARP有别于普通ARP响应包的地方,当这个数据包被网络中的其余主机(显然咱们这里的网络环境比较简单,因此只有R1)接收到以后,它会让这些主机使用新的IP和MAC地址关系更新它们的ARP缓存表。由于这个ARP数据包是未经请求的,即致使客户端更新ARP缓存,因此会称为无偿ARP。

        在分析了无偿ARP以后,给出下面的几种状况,都会有无偿ARP过程的发生:

a.更改了设备的IP地址

b.某些操做系统在启动完成以后就会发送无偿ARP(Windows和Linux都会)        


(3)IP地址冲突检测

        再分析一下,无偿ARP有什么好处呢?以下:

a.可让以太网中的主机及时地更新其ARP缓存表,这样能够确保在数据发送时能够准确地封闭正确的地址信息

b.检测IP地址是否有冲突

        关于这一点,能够给R2从新配置一个IP地址,而且与R1的相同:

R2>en
R2#conf t
R2(config)#int f0/0
R2(config-if)#ip add 192.168.1.1 255.255.255.0

        几乎立刻就能够在R1和R2的控制台上看到错误日志的输出:

R1>
*Mar  1 00:54:39.007: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:55:09.043: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:55:39.739: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:56:10.011: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:56:40.715: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000
*Mar  1 00:57:10.947: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc02.1a18.0000

R2(config-if)#
*Mar  1 00:45:48.135: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:46:18.623: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:46:48.927: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:47:19.651: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:47:49.959: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:48:21.623: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000
*Mar  1 00:48:51.919: %IP-4-DUPADDR: Duplicate address 192.168.1.1 on FastEthernet0/0, sourced by cc01.127f.0000

        这里由于在修改了R2的IP地址时,它发送了无偿ARP包,R1经过检查发现其IP地址跟本身的同样,因而就会在控制台上报错,可是R2为何又会报错呢?由于在R1发现地址有冲突时,也发送了表示IP地址冲突的无偿ARP包,以下:

wKiom1cIDHXA6ONRAAAiRKTdoDQ454.png        注意这是一个广播包,因此R2必然也能收到,查看它的包结构:

wKioL1cIDbfy14eCAACn4FWd_YA806.png

        根据数据包的内容,R2也知道发生了IP地址冲突,因此也就会在控制台上输出错误日志了。




4.在实践中分析ARP的实现过程:ARP代理


        若是ARP请求是从一个网络的主机发往另外一个网络上的主机,那么链接这两个网络的路由器就能够回答这个请求,这个过程就称为ARP代理。这是很是精简和通俗易懂的解释,咱们能够经过下面的实践来进行体会。


(1)网络环境搭建

        以下:

wKiom1cID2miLu1zAAA2DvoUiiU886.png

        在前面的基础上,R1增长以下配置:

R1>en
R1#conf t
R1(config)#ip route 0.0.0.0 0.0.0.0 f0/0

        R2增长以下配置:

R2>en
R2#conf t
R2(config)#int f1/0
R2(config-if)#no shu
R2(config-if)#ip add 192.168.2.2 255.255.255.0
R2(config-if)#do wr

        R3则配置以下:

R3>en
R3#conf t
R3(config)#int f0/0
R3(config-if)#no shu
R3(config-if)#ip add 192.168.2.3 255.255.255.0
R3(config-if)#ip route 0.0.0.0 0.0.0.0 f0/0
R3(config-if)#do wr


(2)抓取ARP包并分析ARP代理过程

        在R1和R2的链路上启动Wireshark,而后在R1上执行以下命令:

R1#ping 192.168.2.3

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.3, timeout is 2 seconds:
...!!
Success rate is 40 percent (2/5), round-trip min/avg/max = 36/50/64 ms

        即R1给R3发送数据,咱们查看抓到的包:

wKioL1cIFBqD1BVYAAAsVzmbz4c606.png        再分别查看详细的包结构:

  • ARP请求包

wKiom1cIE7KhNZgoAABfyXIa4cY502.png

        能够看到ARP请求包跟日常同样,并无什么区别,即R1但愿知道192.168.2.3的MAC地址。

  • ARP响应包

wKioL1cIFLjAqjNgAABfrw-cHVk558.png

        看起来普通的ARP响应包也没有什么区别,其实真的是没有什么区别,但不妨在R2上执行下面的命令,查看一下ARP缓存表:

R2#sh arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.1.1             3   cc01.127f.0000  ARPA   FastEthernet0/0
Internet  192.168.2.2             -   cc02.1a18.0010  ARPA   FastEthernet1/0
Internet  192.168.2.3             3   cc03.2327.0000  ARPA   FastEthernet1/0
Internet  192.168.1.2             -   cc02.1a18.0000  ARPA   FastEthernet0/0

        在这个ARP缓存表中,192.168.2.3对应的MAC地址是cc03.2327.0000,并非上面看到的数据包结构中的cc02.1a18.0000!!!cc02.1a18.0000是192.168.1.2对应的MAC地址!!!能够分析以下:

拓展1:

R1想要知道192.168.2.3的MAC地址,因而发送ARP请求包,但很显然,192.168.2.3跟192.168.1.1并不在同一个网络中;当192.168.1.2接口接收到这个ARP请求包时,R2发现虽然192.168.2.3并非本身,可是它能够到达192.168.2.3所在的网络,即192.168.2.0/24这个网络,因而它就向R1发回了一个ARP响应包,告诉R1,192.168.2.3的MAC地址是本身(即配置了192.168.1.2的接口的MAC地址)。虽然这是一种“谎话”,但因为这样作确实是能够帮R1把数据发送到R3,因此有时候咱们也把ARP代理称做“善意的谎话”。

拓展2:

这也意味着,即便R1知道192.168.2.3跟本身在不一样的网络,它也不会直接就说去请求网关的MAC地址(虽然最终数据确定是先发往网关的),而是还会像日常请求同网段IP地址的MAC地址同样,去发送一个普通的ARP请求,这点尤为须要注意。

拓展3:

咱们说,若是数据是发往不一样的网络的,那么应该先把数据发给网关,那么上面为何不是这样的呢?那是由于,我在配置R1的默认路由时,是以出接口的方式进行配置的,那也就意味着,并无所谓的网关,即不知道网关是谁,既然若是,R1又怎么可以直接去请求网关的MAC地址呢?对它来讲,根本就没有网关!可是又由于配置了默认路由,去往未知网络的数据都直接从1.1的接口发送出去,因此它是直接去请求目的IP地址的MAC地址,而后才有了后来的ARP代理过程的发生。固然,若是配置的是网关(在思科路由器上的配置是:ip route 0.0.0.0 0.0.0.0 下一跳即网关地址),则会按照正常的流程走,即没有代理ARP过程的发生。

这一点对于数据转发的深刻理解是很是重要的,固然,若是以为难以理解的,也不用太担忧,这个须要必定时间的积累,同时本身也要注重思考,在实际的学习过程中不能囫囵吞枣,要想有深刻的理解,就必需要作深刻的分析。

        那么经过上面的实践过程和分析以后也就很是清楚什么是ARP代理了。即若是ARP请求是从一个网络的主机发往另外一个网络上的主机,那么链接这两个网络的路由器就能够回答这个请求,这个过程就称为ARP代理。

        上面这个过程须要体会一下,这样一来的话,相信对计算机网络通讯又会有了更深刻的了解。




5.下一步要作什么


        首先有时间固然是本身也尝试把上面的实践完成一遍,好好分析一下ARP协议,其实ARP协议所涉及到的重要的内容,上面的实践过程基本上都已经所有给出,真的不能错过。

        若是以为本身已经掌握了的话,能够尝试去了解一下ARP欺骗的原理,看看实际上是不是很简单。

        请继续关注香飘叶子51cto博客的博客专题《在实践中深刻理解常见网络协议》的系列文章,有问题能够留言提问,谢谢你们!

相关文章
相关标签/搜索