29_OSI_第_3_层的其他协议,ARP
网络协议那些事儿
内容简介
- 前言
之前我们学习了网络领域非常重要的概念:路由(routing),也进行了路由的实践。这让我们了解了数据包(packet)是如何从一个网络传输到另一个网络的,以及数据包是如何被分发的。
我们以前学过的 OSI 第 2 层则让我们了解了数据包如何在同一网络中被传输。
那么,我们不禁要发问:“OSI 第 2 层和第 3 层之间是否存在联系呢?IP 协议是 OSI 第 3 层唯一使用的协议吗?”
我们现在就来解答这些问题!
- ARP 协议
我们之前已经学了 IP 协议,为什么还要有另一个协议呢?
别担心,你很快就会理解的。
我们再用之前的一幅网络图来做例子:

假设,机器 192.168.0.1 想要向机器 192.168.1.2 发送消息。
机器 192.168.0.1 发送消息时,将从 OSI 的应用层跨越到网络层。所以我们跨越第 7 层,然后跨越第 4 层,最后跨越我们已经认识的第 3 层。
在 OSI 第 3 层,看到我们想将数据包发送到机器 192.168.1.2。因此,机器 192.168.0.1 将在其路由表中查找应该经由谁来发送此消息。
192.168.0.1 的路由表我们以前已经编写过了,如下:
| 要连接的网络 | 网关的 IP 地址 |
|---|---|
| 192.168.0.0/24 | 192.168.0.1 |
| 192.168.1.0/24 | 192.168.0.254 |
根据以上的路由表,要访问目标 IP 地址(192.168.1.2)所在的网络 192.168.1.0/24,必须通过网关 192.168.0.254。因此机器 192.168.0.1 需要将软件包发送给网关 192.168.0.254。
网关 192.168.0.254 在机器 192.168.0.1 所属的网络(192.168.0.0/24)上,因此要向 192.168.0.254 发送帧(frame),需要知道它的 MAC 地址。但是,机器 192.168.0.1 却并不知道这个 MAC 地址。
那么,机器 192.168.0.1 怎么才能知道 192.168.0.254 的 MAC 地址呢?必须要询问 192.168.0.254 这台机器;但是要询问它,需要知道它的 MAC 地址;而要知道它的 MAC 地址,就必须询问它… 又进入了死循环。
不要担心,我们有一个解决方案,那就是:ARP 协议!
ARP 协议
ARP 是 Address Resolution Protocol 的缩写,表示 “地址解析协议”。
提问:“如何在不知道其 MAC 地址的情况下向我们所属的网络上的机器发送消息?”
如果你还记得的话,我们以前学习过广播地址,它可以帮助我们达到目的。
机器 192.168.0.1 可以发送以下消息给广播地址(192.168.0.0/24 这个网络的广播地址是 192.168.0.255):“192.168.0.254 这台机器可以向我发送它的 MAC 地址吗?”
多亏了广播地址,该消息将被发送给所有人,这被称为 ARP 请求 或 ARP 广播。因此,机器 192.168.0.254 将收到此消息,并可以将自己的 MAC 地址返回给机器 192.168.0.1。
这样,我们就可以将帧发送到机器 192.168.0.254,借助于它的路由表,它又可以将我们的消息路由到目标机器 192.168.1.2。
因此,ARP 是这样一种协议,它可以关联 OSI 第 2 层的 MAC 地址与第 3 层的 IP 地址。
但是,如果每次你要发送信息时都用广播,难道网络不会饱和吗?
当然会。所以我们得采用一个解决方案,就是:ARP 表。
ARP 表
为了避免每次要向机器发送信息时都必须发送 ARP 广播,我们将使用一个表,该表将在短时间内维持 IP 地址和 MAC 地址的对应关系,这也被称为 ARP 缓存(ARP Cache。cache 是 “缓存” 的意思)。
因此,如果我将数据包发送到网关,则将其 MAC 地址记在 ARP 表中。下一次我想与之通信时,将不再需要在网络上发送 ARP 广播了。
因此,ARP 表可以将 IP 地址和相应的 MAC 地址相关联。借助 ARP 协议,我们可以根据 IP 地址获取 MAC 地址。还有一个 RARP 协议,是 Reverse Address Resolution Protocol 的缩写,表示 “反向地址解析协议”,和 ARP 正相反,RARP 协议可以根据 MAC 地址获取 IP 地址。
我们可以用 arp -an 命令在 Unix / Linux / macOS 上查看 ARP 表。在 Windows 上则是用 arp -a 命令。
例如以下是在我的 macOS 操作系统的命令行中运行arp -an 命令的输出:

有了 ARP 表,之后的通信就会方便很多。例如,当我的电脑希望将数据包发送到 IP 地址为 192.168.0.102 的机器时,它将直接知道其 MAC 地址(c8:d0:83:98:2d:7f)。
但是,如果机器更换了网卡怎么办?网卡一改,对应的 MAC 地址也将更改(因为 MAC 地址是网卡的地址),那在 ARP 表中的 MAC 地址会是旧的值吗?
不是的,因为 ARP 表中包含的信息的使用寿命有限,信息会有一个 TTL(Time To Live 的缩写,表示 “生存时间”),这个 TTL 的大小是不一定的,和操作系统有关,也可以设置。
一般来说,如果与此地址在大约两分钟内没有通信,那么对应的记录就会从 ARP 表中被删除。因此,ARP 表是动态的,它会随着时间的流逝而变化,具体取决于与本机通信的机器。
ARP 请求
让我们重新回到之前的例子:假设我们是机器 192.168.0.1,想要向机器 192.168.1.2 发送消息。
我们已经知道需要先将数据包发送给路由器的 192.168.0.254 这个网络接口,但不知道其 MAC 地址。
此时,就是 ARP 协议的 show time(“表现时刻”)了:
-
我们首先查看本地 ARP 表,看看表中是否存在 IP 地址 192.168.0.254 与它的 MAC 地址的关联记录;
-
如果表中有此关联记录的话,我们直接向 MAC 地址发送信息,完毕;
-
如果表中没有此关联记录,则通过网络发送 ARP 广播;
-
机器 192.168.0.254 将回复我们,并告诉我们它的 MAC 地址;
-
我们将在 ARP 表中写入 IP 地址 192.168.0.254 和其 MAC 地址的关联记录;
-
我们向 MAC 地址发送信息,完毕。
有了 ARP 协议,我们就可以通过 IP 地址,获知其对应的 MAC 地址了。
但是 ARP 协议属于 OSI 的哪一层呢,第 2 层还是第 3 层?
你最好自己搜索相关内容,思考之后做出回答。希望你不要马上看答案。
答案是:ARP 是 OSI 第 2 层和第 3 层的协议!
是的,因为 ARP 协议处理第 2 层的信息(MAC 地址)和第 3 层的信息(IP 地址),就像在第 2 层和第 3 层之间 “跨接”。
既然知道了 ARP 协议及其作用,我们将从头到尾回顾一下两台机器之间的通信。
- 梳理两个机器通信的过程
我们再次用之前的例子(参见下图):机器 192.168.0.1 希望向机器 192.168.1.2 发送消息。

通信的细节
第一步:本地机器
如先前所说,我们的消息将跨越 OSI 模型的不同层,重新回顾一下以前说过的封装(encapsulation)机制:

消息到达第 3 层之后,我们查看路由表,知道我们必须将数据包发送到 192.168.0.254 才能离开我们的网络。我们发出 ARP 请求,并获得 192.168.0.254 的 MAC 地址。
现在,我们可以写出将在网络上流通的帧的格式:

我们将地址 192.168.1.2 设置为目标 IP 地址,因为如果将路由器的接口地址 192.168.0.254 设置为目标 IP 地址,则一方面路由器会认为该数据包是发给自己的,另一方面帧中就没有任何地方表明该信息是要发给机器 192.168.1.2 的了。
现在,帧可以离开我们的机器,在线缆上流通了。
第二步:交换机
接收到此帧的第一台机器将是 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 地址后,它将能够构建帧并通过网络发送。
此时,帧的格式变成了:

可以看到,与之前的帧的格式相比,仅修改了第 2 层的信息(目标 MAC 地址和源 MAC 地址)!
源 MAC 地址不再是机器 192.168.0.1 的 MAC 地址,而是路由器的 192.168.1.254 这个接口的 MAC 地址。这是正常的,因为帧中的 MAC 地址一定是帧在其上流通的网络中的某个 MAC 地址。
因此,帧将离开路由器。
第四步:交换机
帧将到达交换机,但是这次的交换机和第二步的交换机不一样,这次是网络 192.168.1.0/24 的交换机。
交换机查看目标 MAC 地址,看到是机器 192.168.1.2 的 MAC 地址,因此将帧发给机器 192.168.1.2。
第五步:被机器 192.168.1.2 接收
机器 192.168.1.2 接收到帧,OSI 第 2 层读取目标 MAC 地址。它看到目标 MAC 地址正是自己的 MAC 地址。因此,它将读取第二层头部的剩余部分,并将帧中包含的数据报发送给 OSI 第 3 层的协议,就是帧中指定的 IP 协议。
第 3 层的 IP 协议接收数据报并读取数据报的头部,它发现目标 IP 地址正是自己的 IP 地址,因此它将把信息发送到第 4 层(传输层),第 4 层将把信息发送到第 7 层(应用层)。
消息终于被目标机器接收了,真是不容易啊!
当然了,我们只是分析了网络上两台机器之间通信的部分步骤,以后我们将看到还有许多其他步骤。不可思议的是,这一切都是在几毫秒甚至更短的时间内发生的!
现在,我们已经了解了如何在本地网络以及网络之间进行通信,我们就可以开始做比较有趣的事情,特别是扮演初级 “黑客”。
下一课我们就一起来进行一个 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 广播。
一起加油吧~
}如果您想了解更多技术资源,欢迎加入点击这里钉钉群交流IT技术资源查看“IT技术交流群一”群的钉钉群号: 129605002953