TCP/IP详解卷一:ARP:地址解析协议

277 阅读13分钟

引言

ARP(Address Resolution Protocol)为IP地址到对应的硬件地址之间提供动态映射.

一个例子

% ftp bsdi
  1. 应用程序FTP客户端调用函数 gethostbyname(3)把主机名(bsdi)转换成32 bit的IP地址。这个函数在 DNS(域名系统)中称作解析器,我们将在第1 4章对它进行介绍。这个转换过程或者使用DNS,或者在较小网络中使用一个静态的主机文件(/etc/hosts)
  2. FTP客户端请求 TCP用得到的 IP 地址建立连接
  3. TCP 发送一个连接请求分段到远端的主机,即用上述 IP 地址发送一份 IP 数据报
  4. 如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那么 IP 数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,那么就通过 IP 选路函数来确定位于本地网络上的下一站路由器地址,并让它转发 IP 数据报。在这两种情况下,IP 数据报都是被送到位于本地网络上的一台主机或路由器。
  5. 假定是一个以太网,那么发送端主机必须把 32 bit的 IP 地址变换成48 bit的以太网地址。从逻辑 Internet 地址到对应的物理硬件地址需要进行翻译。这就是 ARP 的功能。ARP适用于许多主机或路由器连接到单个网络的广播网络。
  6. ARP 发送一份称作 ARP 请求的以太网数据帧给以太网上的每个主机。这个过程称作广播,如图 4 - 2中的虚线所示。 ARP 请求数据帧中包含目的主机的 IP 地址(主机名为 bsdi),其意思是“如果你是这个 IP 地址的拥有者,请回答你的硬件地址。”
  7. 目的主机的 ARP 层收到这份广播报文后,识别出这是发送端在寻问它的 I P地址,于是发送一个 ARP 应答。这个 ARP 应答包含 IP 地址及对应的硬件地址。
  8. 收到 ARP 应答后,使 ARP 进行请求—应答交换的IP数据报现在就可以传送了。
  9. 发送IP 数据报到目的主机
  • 网络接口有一个硬件地址(一个 48 bit的值)
  • 内核(如以太网驱动)必须知道目的主机硬件地址才能够发送一帧数据
  • ARP 的功能是在32 bit的 IP 地址和采用不同网络技术的硬件地址之间提供动态映射
  • 点对点链路不使用 ARP

ARP高速缓存

  • 高速缓存存放了最近 Internet 地址到硬件地址之间的映射记录
  • 高速缓存中每一项的生存时间一般为 20 分钟
  • 使用 arp 命令可以查看高速缓存
bsdi % arp -a
sun (140.252.13.33) at 8:0:20:3:f6:42
svr4 (140.252.13.34) at 0:0:c0:c2:9b:26

ARP的分组格式

  • 以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全 1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧
  • 两个字节长的以太网帧类型表示后面数据的类型。对于 A R P请求或应答来说,该字段的值为 0x0806。

【注】形容词 hardware (硬件)和 protocol (协议)用来描述 ARP 分组中的各个字段。例如,一个 ARP 请求分组询问协议地址(这里是IP 地址)对应的硬件地址(这里是以太网地址)

  • 硬件类型字段表示硬件地址的类型。它的值为 1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为 0x0800 即表示I P地址。它的值与包含 IP 数据报的以太网数据帧中的类型字段的值相同,这是有意设计的
  • 接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上 IP 地址的ARP 请求或应答来说,它们的值分别为 6和4。
  • 操作字段指出四种操作类型,它们是
    • ARP 请求(值为1)
    • ARP 应答(值为2)
    • RARP 请求(值为3)
    • RARP 应答(值为4)
  • 接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(I P地址)、目的端的硬件地址和目的端的协议地址。

对于一个 ARP 请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的 ARP 请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2,最后把它发送回去。

ARP举例

一般的例子

为了看清楚 ARP 的运作过程,我们执行 telnet 命令与服务器连接

bsdi % arp -a                   //verify ARP cache is empty
bsdi % telnet svr4 discard
Trying 140.252.13.34...             //Connected to svr4.
Escape character is '^]'.
connect to the discard server
^]
telnet> quit
Connection closed.  //type Control, right bracket to get Telnet client prompt and terminate

在另一个系统( sun )上运行带有 -e 选项的 tcpdump 命令时,显示的是硬件地址

  • 在第1行中,源端主机(bsdi)的硬件地址是0 : 0 : c0 : 6f : 2d : 40。目的端主机的硬件地址是 ff : ff : ff : ff : ff : ff,这是一个以太网广播地址。电缆上的每个以太网接口都要接收这个数据帧并对它进行处理

    • 第1行中紧接着的一个输出字段是 arp,表明帧类型字段的值是 0x0806,说明此数据帧是一个 ARP 请求或回答。在每行中,单词arp或ip后面的值60指的是以太网数据帧的长度。由于 ARP 请求或回答的数据帧长都是42字节(28字节的ARP数据,14字节的以太网帧头),因此,每一帧都必须加入填充字符以达到以太网的最小长度要求: 60字节。
    • 第1行中的下一个输出字段 arp who-has表示作为 ARP 请求的这个数据帧中,目的 IP 地址是 svr4 的地址,发送端的 IP 地址是bsdi 的地址。tcpdump 打印出主机名对应的默认 IP 地址。
  • 从第2行中可以看到,尽管 ARP 请求是广播的,但是 ARP 应答的目的地址却是 bsdi(0 : 0 : c0 : 6f : 2d : 40)。ARP 应答是直接送到请求端主机的,而非广播的。

    • tcpdump 打印出arp reply 的字样,同时打印出响应者的主机名和硬件地址。
  • 第3行是第一个请求建立连接的 T C P段。它的目的硬件地址是目的主机 (svr4) 每一行中,行号后面的数字表示 tcpdump 收到分组的时间(以秒为单位)

对不存在主机的ARP请求

网络号和子网号所对应的网络确实存在,但是并不存在所指定的主机号

bsdi % date ; telnet 140.252.13.36 ; date  //telnet to an address
Sat Jan 30 06:46:33 MST 1993    //this time, not a
Trying 140.252.13.36...         //hostname
telnet: Unable to connect to remote host:
Connection timed out            //76 seconds after
Sat Jan 30 06:47:49 MST 1993    //previous date output



bsdi % arp -a
? (140.252.13.36) at (incomplete) //check the ARP cache

  • tcpdump命令输出的超时限制为 29.5秒
  • telnet 客户端的连接请求似乎在大约 75秒后
  • 大多数的BSD实现把完成 TCP 连接请求的时间限制设置为75秒

ARP高速缓存超时设置

  • 一般对完整的表项设置超时值为20分钟,而对不完整的表项设置超时值为 3分钟(在前面的例子中我们已见过一个不完整的表项,即在以太网上对一个不存在的主机发出 ARP 请求。)当这些表项再次使用时,这些实现一般都把超时值重新设为 20分钟。

Proxy ARP

如果 ARP 请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托 ARP或 ARP 代理(Proxy ARP)。

下面例子中,netb作为sun的代理arp:

如果在主机gemini上执行arp命令,经过与主机sun通信以后,我们发现在同一个子网140.252.1上的netb和sun的IP地址映射的硬件地址是相同的。通常是使用委托ARP的线索。

gemini % arp -a
netb (140.252.1.183) at 0:80:ad:3:6a:80
sun (140.252.1.29) at 0:80:ad:3:6a:80

图4-6中的另一个需要解释的细节是在路由器netb的下方(SLIP链路)显然缺少一个IP地址。为什么在拨号SLIP链路的两端只拥有一个IP地址,而在bsdi和slip之间的两端却分别有一个IP地址?

用ifconfig命令可以显示拨号SLIP链路的目的地址,140.252.1.183。NetBlazer不需要知道拨号SLIP链路每一端的IP地址(这样做会用更多的IP地址)。相反,它通过分组到达的串行线路接口来确定发送分组的拨号主机,因此对于连接到路由器的每个拨号主机不需要用唯一的IP地址。所有的拨号主机使用同一个IP地址140.252.1.183作为SLIP链路的目的地址。

ARP代理也称作混合ARP(promiscuous ARP)或ARP出租(ARP hack)。这些名字来自于ARP代理的其他用途:通过两个物理网络之间的路由器可以互相隐藏物理网络。在这种情况下,两个物理网络可以使用相同的网络号,只要把中间的路由器设置成一个ARP代理,以响应一个网络到另一个网络主机的ARP请求。这种技术在过去用来隐藏一组在不同物理电缆上运行旧版TCP/IP的主机。分开这些旧主机有两个共同的理由,

  • 其一是它们不能处理子网划分,
  • 其二是它们使用旧的广播地址(所有比特值为0的主机号,而不是目前使用的所有比特值为1的主机号)。

Gratuitous ARP

指主机发送ARP查找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候。 如果我们引导主机bsdi并在主机sun上运行tcpdump命令:

可以有两个方面的作用:

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

ar命令

  • -a来显示A R P高速缓存中的所有内容
  • 超级用户可以用选项-d来删除ARP高速缓存中的某一项内容
  • 选项-s来增加高速缓存中的内容
  • 位于命令行末尾的关键字pub和-s选项一起,可以使系统起着主机ARP代理的作用。系统将回答与主机名对应的IP地址的ARP请求,并以指定的以太网地址作为应答。如果广播的地址是系统本身,那么系统就为指定的主机名起着委托ARP代理的作用。

小结

4.1当输入命令以生成类似图4-4那样的输出时,发现本地ARP快速缓存为空以后,输入命令bsdi % rsh svr4 arp -a 如果发现目的主机上的ARP快速缓存也是空的,那将发生什么情况?(该命令将在svr4主机上运行arp-a命令)

发出rsh命令可与其他主机建立TCP连接。 这样做会导致IP数据报在两个主机之间交换。 这要求另一台主机上的ARP缓存具有我们主机的条目。 因此,即使在我们执行rsh命令之前ARP缓存是空的,当rsh服务器执行arp命令时,也可以保证有一个我们主机的条目。

请描述如何判断一个给定主机是否能正确处理接收到的非必要的ARP请求的方法

  • 确保您的主机在其ARP缓存中没有其以太网上其他主机的条目,例如foo。
  • 确保foo引导时foo发送免费的ARP请求,也许在foo引导时在另一台主机上运行tcpdump。
  • 然后关闭主机foo,并使用arp命令并确保指定temp选项,将不正确的条目输入到foo的系统上的ARP缓存中。
  • 引导foo,启动后,查看主机的ARP缓存条目,以查看是否已更正了错误的条目。

由于发送一个数据包后ARP将等待响应,因此4.2节所描述的步骤7可能会持续一段时间。你认为ARP将如何处理在这期间收到相同目的IP地址发来的多个数据包?

reference:

本书19.2节

tools.ietf.org/html/rfc112…

     2.3.2.2  ARP Packet Queue

        The link layer SHOULD save (rather than discard) at least
        one (the latest) packet of each set of packets destined to
        the same unresolved IP address, and transmit the saved
        packet when the address has been resolved.

        DISCUSSION:
             Failure to follow this recommendation causes the first
             packet of every exchange to be lost.  Although higher-
             layer protocols can generally cope with packet loss by
             retransmission, packet loss does impact performance.
             For example, loss of a TCP open request causes the
             initial round-trip time estimate to be inflated.  UDP-
             based applications such as the Domain Name System are
             more seriously affected.
             

在4.5节的最后,我们指出Host Requirements RFC和伯克利派生系统在处理活动ARP表目的超时时存在差异。那么如果我们在一个由伯克利派生系统的客户端上,试图与一个正在更换以太网卡而处于关机状态的服务器主机联系,这时会发生什么情况?如果服务器在引导过程中广播一份免费ARP,这种情况是否会发生变化?

伯克利派生系统一直尝试与服务器取得联系,在arp缓存中存在服务器的表项,向表项中的地址发送数据,并重设超时时间20分钟,一直循环下去。 在这期间如果服务器重启后,

  • 伯克利派生系统还是一直尝试与服务器取得联系,那么通信不会成功。
  • 手动删除arp中的错误表项,通信成功
  • 停止尝试通信20分钟后,可以通信

如果服务器在引导过程中广播一份免费ARP,那么伯克利派生系统会更新服务器表项,从而实现通信