引言

本章我们要讨论的问题是只对 T C P / I P 协议簇有意义的 I P 地址。数据链路如以太网或令牌
环网都有自己的寻址机制(常常为 48 bit 地址),这是使用数据链路的任何网络层都必须遵从
的。一个网络如以太网可以同时被不同的网络层使用。例如,一组使用 T C P / I P 协议的主机和
另一组使用某种 P C 网络软件的主机可以共享相同的电缆。

当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据 48 bit 的以
太网地址来确定目的接口的。设备驱动程序从不检查 I P 数据报中的目的 I P 地址。
地址解析为这两种不同的地址形式提供映射: 32 bit 的 I P
地址和数据链路层使用的任何类型的地址。 RFC 826 [Plummer
1 9 8 2 ]是 A R P 规范描述文档。

A R P 为 I P 地址到对应的硬件地址之间提供动态映射。我们
之所以用动态这个词是因为这个过程是自动完成的,一般应用
程序用户或系统管理员不必关心。

R A R P 是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或 X 终端),它需要系统
管理员进行手工设置。

TCP/IP详解,卷1:协议--ARP:地址解析协议-LMLPHP

在 A R P 背后有一个基本概念,那就是网络接口有一个硬件地址(一个 48 bit 的值,标识不
同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但
是,T C P / I P 有自己的地址:32 bit 的 I P 地址。知道主机的 I P 地址并不能让内核发送一帧数据给
主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。 A R P 的功能是
在 32 bit 的 I P 地址和采用不同网络技术的硬件地址之间提供动态映射。
点对点链路不使用 A R P。当设置这些链路时(一般在引导过程进行),必须告知内核链路
每一端的 I P 地址。像以太网地址这样的硬件地址并不涉及。

ARP 高速缓存

A R P 高效运行的关键是由于每个主机上都有一个 A R P 高速缓存。这个高速缓存存放了最
近 I n t e r n e t 地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为 2 0 分钟,起
始时间从被创建时开始算起。
我们可以用 a r p(8)命令来检查 ARP 高速缓存。参数-a 的意思是显示高速缓存中所有的内容

ARP 的分组格式

在以太网上解析 I P 地址时,A R P 请求和应答分组的格式如图 4 - 3 所示(A R P 可以用于其他
类型的网络,可以解析 I P 地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个
字段的类型和长度)。

TCP/IP详解,卷1:协议--ARP:地址解析协议-LMLPHP

一般情况下,当系统收到 A R P 请求或发送 A R P 应答时,都要把请求端的硬件地址和 I P 地
址存入 A R P 高速缓存。在逻辑上可以假设,如果请求端要发送 I P 数据报,那么数据报的接收
端将很可能会发送一个应答

ARP 高速缓存超时设置

在 A R P 高速缓存中的表项一般都要设置超时值(在 4 . 8 小节中,我们将看到管理员可以用
a r p 命令把地址放入高速缓存中而不设置超时值)。从伯克利系统演变而来的系统一般对完整
的表项设置超时值为 2 0 分钟,而对不完整的表项设置超时值为 3 分钟(在前面的例子中我们已
见过一个不完整的表项,即在以太网上对一个不存在的主机发出 A R P 请求。)当这些表项再次
使用时,这些实现一般都把超时值重新设为 2 0 分钟。
Host Requirements RFC 表明即使表项正在使用时,超时值也应该启动,但是大多数从伯
克利系统演变而来的系统没有这样做 — 它们每次都是在访问表项时重设超时值

ARP 代理

如果 A R P 请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路
由器就可以回答该请求,这个过程称作委托 A R P 或 A R P 代理(Proxy ARP)。这样可以欺骗发起
A R P 请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另
一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它

TCP/IP详解,卷1:协议--ARP:地址解析协议-LMLPHP

A R P 代理也称作混合 A R P(p r o m i s c u o u s A R P)或 ARP 出租(ARP hack)。这些名字来自于
A R P 代理的其他用途:通过两个物理网络之间的路由器可以互相隐藏物理网络。在这种情况
下,两个物理网络可以使用相同的网络号,只要把中间的路由器设置成一个 A R P 代理,以响
应一个网络到另一个网络主机的 A R P 请求。这种技术在过去用来隐藏一组在不同物理电缆上
运行旧版 T C P / I P 的主机。分开这些旧主机有两个共同的理由,其一是它们不能处理子网划分,
其二是它们使用旧的广播地址(所有比特值为 0 的主机号,而不是目前使用的所有比特值为 1
的主机号)。

免费 ARP

我们可以看到的另一个 A R P 特性称作免费 ARP (gratuitous ARP)。它是指主机发送 A R P 查
找自己的 I P 地址。通常,它发生在系统引导期间进行接口配置的时候

免费 A R P 可以有两个方面的作用: 1) 一个主机可以通过它来确定另一个主机是否设置了相同的 I P 地址。主机 b s d i 并不希望
对此请求有一个回答。但是,如果收到一个回答,那么就会在终端日志上产生一个错误消息
“以太网地址:a : b : c : d : e : f 发送来重复的 I P 地址”。这样就可以警告系统管理员,某个系统有不
正确的设置。 2) 如果发送免费 A R P 的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接
口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的
更新。一个比较著名的 A R P 协议事实[Plummer 1982]是,如果主机收到某个 I P 地址的 A R P 请求,
而且它已经在接收者的高速缓存中,那么就要用 A R P 请求中的发送端硬件地址(如以太网地
址)对高速缓存中相应的内容进行更新。主机接收到任何 A R P 请求都要完成这个操作( A R P
请求是在网上广播的,因此每次发送 A R P 请求时网络上的所有主机都要这样做)

文献[ B h i d e、E l n o z a h y 和 M o rgan 1991]中有一个应用例子,通过发送含有备份硬件地址和
故障服务器的 I P 地址的免费 A R P 请求,使得备份文件服务器可以顺利地接替故障服务器进行
工作。这使得所有目的地为故障服务器的报文都被送到备份服务器那里,客户程序不用关心
原来的服务器是否出了故障。
不幸的是,作者却反对这个做法,因为这取决于所有不同类型的客户端都要有正
确的 ARP 协议实现。他们显然碰到过客户端的 ARP 协议实现与规范不一致的情况

arp 命令

我们已经用过这个命令及参数- a 来显示 A R P 高速缓存中的所有内容。这里介绍其他参数
的功能。
超级用户可以用选项- d 来删除 A R P 高速缓存中的某一项内容(这个命令格式可以在运行
一些例子之前使用,以让我们看清楚 A R P 的交换过程)。
另外,可以通过选项- s 来增加高速缓存中的内容。这个参数需要主机名和以太网地址:
对应于主机名的 I P 地址和以太网地址被增加到高速缓存中。新增加的内容是永久性的(比如,
它没有超时值),除非在命令行的末尾附上关键字 t e m p。
位于命令行末尾的关键字 p u b 和- s 选项一起,可以使系统起着主机 A R P 代理的作用。系统
将回答与主机名对应的 I P 地址的 A R P 请求,并以指定的以太网地址作为应答。如果广播的地
址是系统本身,那么系统就为指定的主机名起着委托 A R P 代理的作用。

小结

在大多数的 T C P / I P 实现中,A R P 是一个基础协议,但是它的运行对于应用程序或系统管
理员来说一般是透明的。 A R P 高速缓存在它的运行过程中非常关键,我们可以用a r p 命令对高
速缓存进行检查和操作。高速缓存中的每一项内容都有一个定时器,根据它来删除不完整和
完整的表项。a r p 命令可以显示和修改A R P 高速缓存中的内容。
我们介绍了 A R P 的一般操作,同时也介绍了一些特殊的功能:委托 A R P(当路由器对来
自于另一个路由器接口的 A R P 请求进行应答时)和免费 A R P(发送自己 I P 地址的 A R P 请求,
一般发生在引导过程中)

05-27 11:17