《TCP/IP 详解 卷1:协议》第 4 章:地址解析协议
- 链路层是经过单一链路通信的协议层。
- IP 网络层协议的设计目标是为跨越不同物理类型的、多节点网络的 packet ,提供主机寻址、路由操作。
在其中要注意的一点是:网络层使用的地址和底层网络硬件使用的地址是不同的概念。网络硬件的地址是由设备制造商定义的存储在设备硬件的永久型内存中,所以它不会改变。网络接口的 IP 地址是由用户或网络管理员分配,可以按需分配、选择,而且 IP 地址可能改变。
网络接口的硬件通常有一个主要的硬件地址,例如以太网或 802.11 无线接口的 48 bits MAC 地址。由硬件交换的帧(frame)需要正确的地址定位到正确的硬件接口,否则无法传输数据。如果一个主机需要发送一个帧到另一个主机,仅知道这台主机的 IP 地址是不够的,还需要知道主机在网络中有效的硬件地址。这就需要;两个地址之间的互相转换。
对于 TCP/IP 网络,地址解析协议,ARP(Address Resolution Protocol)提供了一种在IPv4地址和各种网络技术中使用的硬件地址之间的映射。地址解析是发现两个地址之间映射关系的过程。
ARP 仅用于 IPv4。IPv6 使用的是邻居发现协议,是 ICMPv6 的一部分。
ARP 是一个通用的协议。它被设计为支持多种地址之间的映射。不过实际上它最常被用于 IPv4地址和 MAC 地址之间的映射。ARP 提供动态映射,动态这个术语是因为它会自动执行以及随时间变化不需要系统管理员重新配置,ARP 的操作通常用户或系统人员无关
直接交付
当我们使用互联网服务时,例如在浏览器中打开一个网页,本地必须确定如何与相关的服务器联系。首先判断服务器是否位于本地(即是否在同一个子网)还是远程。如果是远程的需要一台可以到达目的地的路由器。只有位于与目的地同一 IP 子网的系统时,ARP 才能工作。
直接交付(Direct delivery)发生在一个 IP 数据包被发送到一个具有与发送地址相同 IP 前缀的目的地址。即发送方跟接收方为同一子网。直接交付的示意图如下:
例如,用 Web 浏览器打开如下地址:
http://10.0.0.1
一个直接交付的操作:
- 应用程序是一个外部浏览器调用一个函数来解析URL,看他是否包含主机名。这里不是这种情况,而是一个IPv4地址。
- 程序使用TCP协议建立一条连接。通过向目的地址发送一个IPv4数据包TCP尝试向远程主机发送一个连接请求(SYN)。
- 假设发送主机与目的IP地址,具有相同的网络前缀,这意味着数据报可以直接发送到这个地址而不经过任何路由器。
- 假设链路层使用的是以太网地址。则发送主机必须将 32 位的IPv4目的地址转换为 48 位的以太网地址。这就是 ARP 功能。
- 在共享的链路层网段上 ARP 向所有主机发送一个称为 ARP 请求(ARP request)的以太网帧。这是被称为链路层广播。ARP 请求的内容是寻找以下问题的答案:“如果你的 IPv4 地址是 10.0.0.1,请向我回应您的 IP 地址。”
- 同一广播域的所有系统都可以接收到 ARP 请求。这其中可能包括根本不运行IPv4的系统,但不包括位于不同 vLAN 的系统。如果某个系统使用了这个请求内包含的 IPv4 地址,需要回应一个ARP 应答(ARP reply),这个应答的内容就是其 MAC 地址。应答通常不是广播,而是直接发送给请求的发送方。收到应答的主机学习IPv4 到 Mac 地址的映射记录在内存之后,以供以后使用(缓存)。
- 发送方将数据报封装在以太网帧中,使用由 ARP 交换学习到的一台 MAC 地址作为目的地址。直接将数据交付到正确的主机。
ARP 缓存
ARP 缓存(ARP cache)是 ARP 高效运行的关键。每个主机和路由器上有 ARP 缓存表。表存放了使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。当IP地址映射成硬件地址时,生成一个缓存表里的条目。默认到期时间是 20 分钟[RFC1122]
利用 arp -a
命令观察系统的 ARP cache。
ARP 缓存存在超时。
命令允许管理员设置缓存条目永不超时,即设置为静态。大多数实现中,完整的条目超时时间为二十分钟,不完整的条目(例如一个到不存在的主机的请求)超时时间为三分钟。
这是一个关于软状态(soft state)的重要例子。软状态是指在超时前没有更新而被丢弃的信息。如果网络条件发生改变,软状态有助于启动自动重新配置。因此很多 Internet 协议使用软状态,软状态的成本就是必须刷新状态,以避免过期。在一些协议设计中经常包括软状态刷新,以保持软状态的活跃。
ARP 帧格式
字段 | 长度(byte) | 内容 | 含义 |
---|---|---|---|
DST | 6 | ff:ff:ff:ff:ff:ff | ARP 请求默认是广播地址,同一广播域所有以太网接口都可以接受到 |
SRC | 6 | 略 | 发送方 MAC 地址会作为 ARP 应答的目的地址 |
Length or Type | 2 | 0x0806 | ARP 的以太网 type 是固定的 0x0806 |
硬件类型(Hard type) | 2 | 以太网是 1 | 硬件地址类型(链路层可能有很多不同的) |
协议类型(Prot type) | 2 | IPv4 是 0x0800 | 指出映射的网络层协议类型 |
硬件大小(Hard size) | 1 | 以太网是 6 | 硬件地址的长度,以字节为单位,MAC 地址是 8 个字节 |
协议大小(Prot size) | 1 | IPv4 是 4 | 网络层协议地址的长度,以字节为单位,IPv4 地址是 4 个字节 |
操作类型(OP) | 2 | 1~4 | 1:ARP 请求、2:ARP应答、3:RARP 请求、4:RARP 应答 |
发送方硬件地址 | 长度可变 | 顾名思义 | 顾名思义。紧跟在后面的四个字段是 ARP 的主要内容 |
发送方协议地址 | 长度可变 | 顾名思义 | 顾名思义 |
目的硬件地址 | 长度可变 | 顾名思义,且 ARP request 是 0 | 顾名思义 |
目的协议地址 | 长度可变 | 顾名思义 | 顾名思义 |
填充(Pad) | 长度可变 | 顾名思义 | 顾名思义 |
FCS | 4 | 4字节循环冗余校检码(CRC) | Frame Check Sequence |
目标主机生成应答的方式就是填充自己的硬件地址,然后将两个发送方地址和两个接收方地址交换,将op
字段设置为 2,然后发送自己的应答。
总结
ARP 是一个 TCP/IP 的基本协议,不过,它通常在应用程序或用户没有察觉的情况下使用和运行。ARP 用于确定本地可达的 IPv4 子网中,使用某个IPv4地址的主机对应的硬件地址。ARP 在数据报的目的地与发送方处于同一子网时发挥功效。不在同一子网,将会转发到一台路由器(详见 IP 协议)。ARP 缓存是其运行的基础,可以使用arp
命令查看并处理缓存。缓存条目都有计时器。
参考链接:
The Address Resolution Protocol (ARP) is a communication protocol used for discovering the link layer address associated with a given IPv4 address, a critical function in the Internet protocol suite. ARP was defined in 1982 by RFC 826,[1] which is Internet Standard STD 37.
ARP is used for mapping a network address such as an IPv4 address, to a physical address, such as a MAC address. ARP has been implemented with many combinations of network and data link layer technologies, such as IPv4, Chaosnet, DECnet and Xerox PARC Universal Packet (PUP) using IEEE 802 standards, FDDI, X.25, Frame Relay and Asynchronous Transfer Mode (ATM). IPv4 over IEEE 802.3 and IEEE 802.11 is the most common usage.In Internet Protocol Version 6 (IPv6) networks, the functionality of ARP is provided by the Neighbor Discovery Protocol (NDP).