抓包发现好多arp 广播_12、处于第2.5层的协议ARP协议

  • Post author:
  • Post category:其他


ARP协议是我们经常碰到的一个协议,无时无刻不在使用它,我们没有理由不去好好认识它一下。

e8afaa22db0423a0cad56fa555ff3d47.png

上一篇文章中有一个段落是这样说的:

若A和B属于同一子网,如果A知道B的MAC地址,则在主机A的数据链路层把IP数据包封装成“帧”的形式,其中:- 源MAC地址:A的MAC地址 – 目的MAC地址:B的MAC地址 – 源IP地址:A的IP地址 – 目的IP地址:B的IP地址

如果A不知道B的MAC地址,则使用ARP协议,发送一个数据包来获取B的MAC地址,获得之后,在使用同样的方法来对IP数据包进行封装。然后直接发给主机B,至此完成数据传输。

8eebab919e738112f7c2d6865d099ab8.png

没错,我们A需要知道B的MAC地址,就需要通过ARP协议来解决。

一、ARP协议简介


ARP



Address Resolution Protocol

的缩写,表示“地址解析协议”。(有的时候需要有意地记忆下全称,这个或许有一天会有用)

那如何在不知道其

MAC

地址的情况下向我们所属的网络上的机器发送消息?

这个时候

广播地址

就开始起作用啦。多亏了广播地址,该消息将被发送给所有人,这被称为

ARP

请求 或

ARP

广播。

上图的主机A会通过广播将此信息广播出去:“xxx这台机器可以向我发送你的MAC地址吗?”,这个时候主机B也会收到此广播,发现IP是自己的IP,因此回应自己的

MAC

地址给主机A。

因此,

ARP

是这样一种协议,它可以关联

OSI

第 2 层的

MAC

地址与第 3 层的

IP

地址。

不过这里有个问题,如果每次你要发送信息时都用广播,难道网络不会饱和吗?当然会。所以我们得采用一个解决方案,就是:ARP 表。

二、ARP表


为了避免每次要向机器发送信息时都必须发送

ARP

广播,我们用

ARP

表短时间内维持

IP

地址和

MAC

地址的对应关系,这也被称为

ARP

缓存。

因此,如果主机A将数据包发送给主机B,则将B的

MAC

地址记在

ARP

表中。下一次我想与之通信时,将不再需要在网络上发送

ARP

广播了。

借助

ARP

协议,我们可以根据

IP

地址获取

MAC

地址。还有一个

RARP

协议,是

Reverse Address Resolution Protocol

的缩写,表示“反向地址解析协议”,和

ARP

正相反,

RARP

协议可以根据

MAC

地址获取

IP

地址。



windows

上可以用

arp -a

命令查看

ARP

缓存:

6b2b1d2608fd8cbe22138f0b91848331.png


ARP

表也有TTL寿命,这个 TTL 的大小是不一定的,和操作系统有关,也可以设置。一般来说,如果与此地址在大约两分钟内没有通信,那么对应的记录就会从

ARP

表中被删除。因此,

ARP

表是动态的,它会随着时间的流逝而变化,具体取决于与本机通信的机器。

三、ARP请求过程

假设我们是机器A

192.168.0.1

,想要向机器B

192.168.0.2

发送消息。此时还不知道机器B的

MAC

地址,这个时候

ARP

协议开始发挥作用了:

  • 我们首先查看本地

    ARP

    表,看看表中是否存在 IP 地址

    192.168.0.2

    与它的

    MAC

    地址的关联记录;

  • 如果表中有此关联记录的话,我们直接向

    MAC

    地址发送信息,完毕;

  • 如果表中没有此关联记录,则通过网络发送

    ARP

    广播;

  • 机器

    192.168.0.2

    将回复我们,并告诉我们它的

    MAC

    地址;

  • 我们将在

    ARP

    表中写入

    IP

    地址

    192.168.0.2

    和其

    MAC

    地址的关联记录;

  • 我们向

    MAC

    地址发送信息,完毕。

上面提过,它可以关联

OSI

第 2 层的

MAC

地址与第 3 层的

IP

地址。那么它到底是2层协议还是3层协议呢?

答案是:

ARP



OSI

第 2 层和第 3 层的协议!

因为

ARP

协议处理第 2 层的信息(

MAC

地址)和第 3 层的信息(

IP

地址),就像在第 2 层和第 3 层之间“跨接”。因此怪不得有人说

ARP

是2.5层的协议!

四、ARP请求的一个例子

再次拿上一篇文章中的例子来重新梳理两个机器之间的通信过程:机器A

192.168.0.1

希望向机器B

192.168.1.2

发送消息。

3d413b815d57931c501616d753cc449e.png

第一步:机器A本地处理

首先一条消息要通过OSI封装下来,从应用层到最后的物理层。当消息到达第三层的时候,机器A即可通过子网掩码来计算机器B不跟自己在一个子网。那么就需要通过路由器1

192.168.0.254

才能离开机器A的网络。

所以我们的机器A发出ARP请求,获取

192.168.0.254

的MAC地址。到目前为止,帧的格式为:

8e5942b4f3d2377e61f31b5a81f4b0a1.png

注意,结合上一篇文章的理论,我们很容易可以得到上面这张图。现在,帧可以离开我们的机器,在线缆上流通了。

第二步:交换机

接收到此帧的第一台机器将是

192.168.0.0/24

这个网络的交换机 。交换机接收到了帧,读取帧中的目标

MAC

地址。交换机将查看自己的

CAM

表以了解表中是否有此

MAC

地址,以便了解应该将帧发送至哪个端口。如果交换机在自己的

CAM

表中找不到目标 MAC 地址,它就将帧发送到所有活动的端口!

因此,交换机现在可以将帧发送至输出端口,此输出端口连接到路由器。路由器就接收到了帧。

第三步:路由器

帧到达路由器,路由器的

OSI

第 2 层读取目标

MAC

地址。它发现目标

MAC

地址正是自己的

MAC

地址!因此,它就不再读取第 2 层的头部了,它将第 2 层以太网协议的头部移除,并将剩余的 IP 数据包发送给指定的第 3 层的协议:

IP

协议。


OSI

第 3 层将读取整个第 3 层的头部,特别是目标

IP

地址。路由器看到目标

IP

地址不是自己的

IP

地址,因此它知道必须将此数据报发送到目标机器。

因此,它将在其路由表中查找,看看应该将数据包发送到哪个网关,以便到达机器

192.168.1.2

路由器看到目标

IP

地址

192.168.1.2

是在自己所属的网络之一(

192.168.1.0/24

)中,因此能够直接将数据包发送给它。

但是,要通过网络发送帧,将需要

192.168.1.2



MAC

地址,因此它将发出

ARP

请求。一旦收到

192.168.1.2



MAC

地址后,它将能够构建帧并通过网络发送。此时,帧的格式变成了:

4f04f7df421d18af4b1719af81b123fa.png

可以看到,与之前的帧的格式相比,仅修改了第 2 层的信息(目标

MAC

地址和源

MAC

地址)!

下面,帧将离开路由器继续前行。

第四步:交换机

帧将到达交换机,但是这次的交换机和第二步的交换机不一样,这次是网络

192.168.1.0/24

的交换机。

交换机查看目标

MAC

地址,看到是机器

192.168.1.2



MAC

地址,因此将帧发给机器

192.168.1.2

第五步:机器B本地处理

机器B收到帧,

OSI

第 2 层读取目标

MAC

地址。它看到目标

MAC

地址正是自己的

MAC

地址。因此,它将读取第二层头部的剩余部分,并将帧中包含的数据报发送给

OSI

第 3 层的协议,就是帧中指定的

IP

协议。

第 3 层的

IP

协议接收数据报并读取数据报的头部,它发现目标

IP

地址正是自己的

IP

地址,因此它将把信息发送到第 4 层(传输层),第 4 层将把信息发送到第 7 层(应用层)。

五、ARP报文详解

经过上面的学习,我们已经知道了

ARP

的概念和作用。但是它的报文长什么样子呢?我们先通过

wireshark

抓个网络包看看实际报文长什么样子吧!


屁股一摇我们便知道,肯定有一对请求报文和响应报文。

ARP请求报文:可以看到目标的mac地址是广播地址。

bdd625f5e391b603a814f56a6177591b.png

ARP响应报文:

6a67f497d533a5cadd56174d855d233d.png

结合上面的实际

wireshark

抓的报文看,其实跟下面这个结构图是一致的:

98001838e5c9e1a5822b407bb84333b7.png

下面依次来看看报文结构各个字段的含义:

  • 硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为 1。

  • 协议类型:表示要映射的协议地址类型。它的值为

    0x0800

    ,表示

    IP

    地址。

  • 硬件地址长度和协议长度:分别指出硬件地址和协议的长度,以字节为单位。对于以太网上

    IP

    地址的

    ARP

    请求或应答来说,它们的值分别为 6 和 4。

  • 操作类型:用来表示这个报文的类型,ARP 请求为 1,ARP 响应为 2,RARP 请求为 3,RARP 响应为 4。

  • 发送方

    MAC

    地址:发送方设备的硬件地址。

  • 发送方 IP 地址:发送方设备的IP地址。

  • 目标

    MAC

    地址:接收方设备的硬件地址。

  • 目标IP 地址:接收方设备的IP地址。



ARP

报文本身的长度为28字节

,分布可以参照下面这张图:

4dc510e34f9ba609df69f4c16de01f14.png

注意注意,我们之前在学习数据链路层的时候说过:以太网的头部长度为18个字节,这里的18我们是把最后4个字节的CRC校验计算进来的,佷多地方如果说以太网头只有14个字节也是正确的(下面我们就会知道,

wireshaek

中其实认的是14字节)。

这里又让我们想起来,以太网帧最小长度是18+46=64字节,小于这个长度可不行,但是

wireshark

实际抓包的时候会发现报文长度不对劲,我们一起来看下:

5aced6712ef94f56bb447c84fa530919.png

这里是搞错了吗?其实是咱们的

wireshark

整的鬼。上面说了,一个

ARP

报文本身是28字节,加上以太网头14个字节,那就是正好的42字节,但是上面也说了,以太网帧最小是64字节啊,剩下的22个字节被吃了吗?不要慌,我们仔细看下上面的

ARP

的请求报文,在以太网帧的最后有个

padding

字段,里面有18个字节的0,显然这个就是为了填充数据用的,那么此时我们就有了14+28+18=60个字节长度了。最后还有4个字节的CRC校验没有计算,正好是我们之前学习的64个字节长度。所以,一般情况下我们

wireshark

抓到的报文长度最少是60字节,但是这里为什么说是一般情况呢?一切皆有例外。

六、奇怪的现象

好了,我们知道了

ARP

报文显示42个字节长度是正常的事情了。但是对于

TCP

报文有的时候出现这样的长度:

119a961152bf9e9cd995738db50ff3f7.png

我们先来看下60个字节,其实这个比较好理解,首先我们知道IP头分为固定部分和可变部分,其中固定部分的长度为20字节。然后看下

TCP

头,这个我们还没学习,这小子的长度也是20个字节。那么我们知道以太网数据部分至少是46个字节,去掉这两兄弟的头部,就剩下可怜的6个字节,什么?连6个字节长度的数据都没有?那你就是一个没事找事干的空数据的

tcp

报文啊。好吧,那这6个字节咋整?

我们是不是受到了上面

ARP

的启发,它是不是由6个字节的o来填充的呢?我们再仔细看下报文,果然!

327f7f3d938b12038bcdde6970f9d31e.png

这里可以得出结论了:对于数据不足的报文,即到了以太网层,不满足至少46字节数据,那么剩下的数据就由以太网层用0来自动补充到46字节。

所以这里显示60个字节,实际上就是20+20+6(0填充的)+14(以太网头部)=60个字节。

自动填充的例子还有佷多,比如这里以太网帧数据部分是45个字节,怎么破?自动加一个1字节的0来补充咯:

d0f789459ead33cf33416a01fa5cf57c.png


那么我们也可以得出,

wireshark

在首页展示的

length

这一列,是没有把以太网的4个字节的

CRC

校验码放进来的。

就比如拿下面这个例子来小小计算下:

1935814e6afae65c4bce9ecc1af75e2f.png


所以啊,我们要理解,不要被以太网头的14字节或者18字节给搞晕,当有人说最大是1514的时候说明没有带上4字节的校验码;当有人说是1518的时候说明带上了;反过来也一样,最小报文长度是60字节的时候就是没带上校验码,64字节的时候就说明带上了。

实际上真正传输的报文长度也不止1514字节的(

wireshark

),原因是实际还有7字节前导同步码+1字节帧开始定界符。下面这一段说的会比较清楚为什么

wireshark

上最大的一个包是1514个字节:

实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是6+6+2+1500=1514。

对了,下面还要继续说说54字节,这个就真的比较奇怪了!

其实可以参照这个地址来理解:

https://www.wireshark.org/lists/wireshark-users/201207/msg00028.html

因为在你想到这个问题之前,早就有人提出了疑问。

其实能抓到54个字节也是需要条件的,必须是你发出去的一个报文,这个时候可能还没有填充就被

wireshark

看到并捕获了,因此有的时候会少于60个字节。但是如果你是接收方,那么一个报文的长度至少是60字节。

七、免费ARP

当一台主机发送

ARP

请求的目的IP为自身时,称为免费

ARP

。这种

ARP

不同于一般的

ARP

请求,它的

Sender IP



Target IP

字段是相同的,相当于是请求自己的

IP

地址对应的

MAC

地址。

ff6374805ded9fcd341848464eb72d25.png

免费ARP的作用:

  • 验证IP是否冲突

一个主机可以这个免费ARP来确定同一个网络中,是否有其他设备使用了这个IP地址。

若是发送者收到一个回答,表示网络中存在与自身IP同样的主机;

若是没有收到应答,则表示本机所使用的IP与网络中其他主机并不冲突。

  • 双机热备

很多系统采用双机热备机制,一个为主设备,一个为从设备,两者MAC地址不同(设为MAC1和MAC2),但是通过某种软件,让其对外的IP是相同的(设为IP)。正常情况下: 主设备正常工作,从设备空闲,网络中的客户机的ARP缓存条目为: MAC1–IP;但是当某个时刻主设备出故障,从设备就接管主设备的工作,且从设备立即广播免费ARP请求报文,让网络中的客户机及时更新ARP缓存表: MAC2–IP,这样客户机的业务不会收到影响

  • 网关定期刷新

这个主要是用在网关设备(如路由器)上。网关定期发布免费ARP,告诉网内所有主机自己的IP–MAC对应关系,让网内主机定期收到这个免费ARP请求,进而重置ARP老化时间等

八、ARP的简单总结


  • ARP

    协议是

    OSI

    第 2 层和第 3 层的协议,或者可以将其划归为介于第 2 层和第 3 层之间的协议。当然也有的著作将其划归为 OSI 第 3 层或第 2 层。


  • ARP

    协议使我们可以通过

    IP

    地址查询到

    MAC

    地址。


  • ARP

    协议的运作需要借助

    ARP

    表,也被称为

    ARP

    缓存(

    ARP Cache

    )。

    ARP

    表中的每一行记录了

    IP

    地址和

    MAC

    地址的关联(或称为映射)。


  • ARP

    表中包含的信息的使用寿命是有限的,所以一般来说

    ARP

    表是动态的。超过一定时间之后,

    ARP

    表会删除旧的信息。

  • 为了获取对应于某个

    IP

    地址的

    MAC

    地址,需要发送

    ARP

    请求,也被称为

    ARP

    广播。


  • ARP

    报文本身的长度为28字节

  • 当以太网层发现不满足最少46字节长度的数据时,就会自动加0进行补充,但是

    wireshark

    上的

    length

    并不会显示出来。需要点开详情才知道。

  • 对于

    wireshark

    来说,抓到的包已经去除了

    CRC

    校验等前置部分,因此一般情况下,最小的报文长度为60字节,最大的报文长度应该是1514个字节。

  • 但是对于

    wireshark

    来说,捕获发送发数据的时候,有的时候捕获的是未用0填充的数据报文,因此有的时候会出现小于60字节长度的报文。

  • 免费

    ARP

    是一种特殊的

    ARP

    ,因为它的请求目标IP是自身,因此大多数情况下自身是不希望收到

    ARP

    回执报文的,一旦出现可能是

    IP

    地址发生冲突了。