链路层:ARP 协议

禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!

地址解析协议 ARP#

当我们知道了 IP 地址之后,就可以马上和目的主机进行通信了吗?答案是否定的,因为在链路层中路由器并不知道它的下一跳机子的具体位置在哪里,也就没有办法进行通信了。不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。因此当知道主机的 IP 地址之后,就先要找出其对应的硬件地址。地址解析协议 ARP 可以根据网络层使用的 IP 地址,解析出在数据链路层使用的硬件地址。

原来还有一个逆地址解析协议 RARP,作用是是只知道自己硬件地址的主机知道它的 IP 地址,但是现在的 DHCP 协议已经包括了它的功能。

ARP 高速缓存#

每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。形如“< IP address;MAC address;TTL >”,其中 TTL(生存时间) 指的是地址映射有效时间。设置生存时间是很有必要的,因为目的主机的网络适配器可能会更新物理地址,此时若映射永久保存,则源主机就可能永远使用错误的物理地址进行通信。ARP 高速缓存是即插即用的,也就是说它将被自动建立,不需要系统管理员进行配置。

如果没有 ARP 缓存,则任何一台主机只要进行一次通信,就必须在网络上以广播的方式发送 ARP 请求分组,这就会是得网络通信量大大增加。ARP 高速缓存存放最近获得的 IP 地址到 MAC 地址的绑定,以减少 ARP 广播的数量。主机 A 在发送其 ARP 请求分组时,就将自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。当主机 B 收到 A 的 ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。这对主机 B 以后向 A 发送数据报时,因为 ARP 高速缓存就显得更方便了。

地址解析#

当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。如没有则 ARP 进程在本局域网上执行以下动作:

  1. ARP 进程砸本局域网上广播发送一个 ARP 请求分组
  2. 本局域网上所有主机运行的 ARP 进程都收到 ARP 请求分组;
  3. 目的主机的 IP 地址与 ARP 请求分组要查询的 IP 地址一致,就收下 ARP 请求分组,并向发送方发送ARP 响应分组(其他主机啥都不做);
  4. 收到 ARP 响应分组后,将得到的 IP 地址到硬件地址的映射写入 ARP 高速缓存。


其中 ARP 请求分组包含发送方硬件地址 / 发送方 IP 地址 / 目标方硬件地址(未知时填 0) / 目标方 IP 地址,ARP 响应分组包含发送方硬件地址 / 发送方 IP地址 / 目标方硬件地址 / 目标方 IP 地址,ARP 分组封装在物理网络的帧中传输。

ARP 的任务#

ARP 是解决同一个局域网上,主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器。这个路由器把分组转发给下一个网络,剩下的工作就由下一个网络来做。从 IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。
现在思考一个问题,为什么不直接使用硬件地址进行通信?由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。IP 编址把这个复杂问题解决了,连接到互联网的主机只需各自拥有一个唯一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便。调用 ARP 的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。因此在虚拟的 IP 网络上用 IP 地址进行通信,给广大的计算机用户带来了很大的方便。

使用 ARP#

使用 ARP 有以下四种典型情况:

  1. 发送方是主机,要把 IP 数据报发送到本网络上的另一个主机。这时用 ARP 找到目的主机的硬件地址。
  2. 发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
  3. 发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用 ARP 找到目的主机的硬件地址。
  4. 发送方是路由器,要把 IP 数据报转发到另一个网络上的一个主机。这时用 ARP 找到本网络上另一个路由器的硬件地址。剩下的工作由这个路由器来完成。

ARP 分组格式#

在以太网上解析 IP 地址时,ARP 请求和应答分组的格式如下。

字段名 说明
源地址和目的地址 目的地址为全1的特殊地址是广播地址
帧类型 表示后面数据的类型
硬件类型 表示硬件地址的类型,值为 1 即表示以太网地址
协议类型字段 表示要映射的协议地址类型,值为 0x0800 即表示 IP 地址
硬件地址长度 硬件地址的长度,以字节为单位,MAC 地址为 6
协议地址长度 协议地址的长度,以字节为单位,IP 地址为 4
操作字段 指出四种操作类型:ARP 请求(1)、ARP 应答(2)、RARP 请求(3)和 RARP 应答(4)

接下来的四个字段是发送端的硬件地址(以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。对于一个 ARP 请求来说,除目的端硬件地址外的所有其他的字段都有填充值。

免费 ARP#

另一个 ARP 特性称作免费 ARP(gratuitous ARP),它是指主机发送 ARP 查找自己的 IP 地址,通常它发生在系统引导期间进行接口配置的时候。免费 ARP 可以有两个方面的作用:

  1. 一个主机可以通过它来确定另一个主机是否设置了相同的 IP 地址;
  2. 如果发送免费 ARP 的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。

RARP 协议#

RARP 协议的功能#

具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取 IP 地址。但是无盘机,如 X 终端或无盘工作站,则需要采用 RARP 逆地址解析协议来获得 IP 地址。无盘系统的 RARP 实现过程是从接口卡上读取唯一的硬件地址,然后发送一份 RARP 请求(一帧在网络上广播的数据),请求某个主机响应该无盘系统的 IP 地址(在RARP应答中)。

RARP 分组的格式与 ARP 分组基本一致,RARP 请求的操作代码为 3,应答操作代码为 4。对应于 ARP,RARP 请求以广播方式传送,而 RARP 应答一般是单播传送的。

RARP 用户进程#

RARP 服务器的复杂性在于,服务器一般要为多个主机(网络上所有的无盘系统)提供硬件地址到 IP 地址的映射,该映射包含在一个磁盘文件中。由于内核一般不读取和分析磁盘文件,因此 RARP 服务器的功能就由用户进程来提供。
更为复杂的是,RARP 请求是作为一个特殊类型的以太网数据帧来传送的,这说明 RARP 服务器必须能够发送和接收这种类型的以太网数据帧。

多个 RARP 服务器#

RARP 服务器实现的一个复杂因素是 RARP 请求是在硬件层上进行广播的,这意味着它们不经过路由器进行转发。为了让无盘系统在RARP服务器关机的状态下也能引导,通常在一个网络上(例如一根电缆)要提供多个 RARP 服务器。

参考资料#

《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社
《TCP/IP 详解 卷1:协议》(美)W.Richard Stevens 著,范建华 胥光辉 张涛 等译,谢希仁 校,机械工业出版社

posted @   乌漆WhiteMoon  阅读(763)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS