TCPIP详解 卷1协议 四 地址解析协议
4.1——地址解析协议(ARP)
对于TCP/IP网络,地址解析协议(ARP)[RFC0826]提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。ARP仅用于IPv4。IPv6使用邻居发现协议,它被合并入ICMPv6。当两个局域网的主机之间传输的以太网帧包含IP数据报时,由48位以太网地址确定该帧的目的接口。地址解析是发现两个地址之间的映射关系的过程。对于使用IPv4的TCP/IP协议族,这是由运行的ARP来实现的。ARP几乎总是用于32位IPv4地址和以太网的48位MAC地址之间的映射。
ARP提供从网络层地址到相关硬件地址的动态映射。我们使用动态这个术语是因为它会自动执行和随时间变化,而不需要系统管理员重新配置。也就是说,如果一台主机改变它的网络接口卡,从而改变了它的硬件地址(但保留其分配的IP地址),ARP可以在一定延时后继续正常运作。ARP操作通常与用户或系统管理员无关。
注意:提供ARP反向映射的协议称为RARP,它用于缺少磁盘驱动器(通常是无盘工作站或X终端)的系统。它在当前已很少使用,而且需要系统管理员手动配置。
4.2——直接交付和ARP
直接交付发生在一个IP数据报被发送到一个IP地址,而该地址与发送方具有相同IP前缀的情况下。不会通过路由器转发。
- 应用程序使用32位IPv4地址10.0.0.1。
- 应用程序要求TCP协议建立一条到10.0.0.1 的连接。
- 通过向 10.0.0.1 发送一个IPv4 数据报,TCP尝试向远程主机发送一个连接请求
- 我们假设地址 10.0.0.1 使用与发送主机相同的网络前缀,数据报可被直接发送到这个地址而不经过任何路由器。
- 假设以太网兼容地址被用于 IPv4 子网,发送主机必须将 32 位的 IPv4 目的地址转换为48位的以太网地址。就是需要从逻辑Internet地址向对应物理硬件地址进行转换。这是ARP功能。ARP工作在正常模式下,仅适用于广播网络,链路层能将一个消息交付到它连接的所有网络设备。这是 ARP运行的一个重要要求。在非广播网络中,可能需要更复杂的映射协议。
- 在一个共享的链路层网段上,ARP向所有主机发送一个称为ARP请求的以太网帧。这被称为链路层广播。ARP请求包含目的主机的IPv4 地址(10.0.0.1),并寻找以下问题的答案:“如果你将 IPv4 地址 10.0.0.1 配置为自己的地址,请向我回应你的MAC 地址。”
- 通过ARP,同一广播域中的所有系统可接收ARP请求。这包括可能根本不运行 IPv4或 IPv6 协议的系统,但不包括位于不同 VLAN 中的系统,即使支持它们。如果某个系统使用请求中指出的 IPv4 地址,它仅需要响应一个 ARP 应答。这个应答包含 IPv4 地址(与请求相匹配)和对应的MAC地址。这个应答通常不是广播,而是仅直接发送给请求的发送方。同时,接收 ARP 请求的主机学习 IPv4 到 MAC 地址的映射,并记录在内存中供以后使用
- ARP应答被原始请求的发送方接收,现在可发送引起这次ARP请求/应答交换过程的数据报。
- 发送方可将数据报封装在以太网帧中直接发送到目的主机,并使用由ARP交换学到的以太网地址作为目的地址。由于这个以太网地址仅指向正确的目的主机,所以其他主机或路由器不会接收到这个数据报。因此,当仅使用直接交付时,并不需要经过路由器。
ARP 用于运行 IPv4 的多接入链路层网络,每个主机都有自己首选的硬件地址。点到点链路(例如PPP)不使用ARP。当这些链路被建立后,在链路两端通知正在使用的地址。由于不涉及硬件地址,因此不需要地址解析或ARP。
4.3——ARP缓存
ARP高效运行的关键是维护每个主机和路由器上的ARP缓存(或表)。该缓存使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。当IPv4地址映射到硬件地址时,它对应于高速缓存中的一个条目,其正常到期时间是条目创建开始后的20分钟。
ARP协议表中的条目可分为:
- 由ARP协议动态学习的
- 通过手工输入的
- 发布:主机对输入的ARP请求返回一个ARP应答。(用于配置代理ARP)
4.4——ARP帧格式
下图显示了在以太网中转换一个IPv4地址时常用的ARP请求和应答分组的格式。前14字节构成标准的以太网头部,假设没有 802.1p/q 或其他标记,其余部分由 ARP 协议来定义。ARP 帧的前 8个字节是通用的,这个例子中的剩余部分专门用于将 IPv4 地址映射到 48 位的以太网地址。
- DST:目的以太网地址,对于ARP请求,目的以太网地址 ff:ff:ff:ff:ff:ff(全部为 1)是广播地址,在同一广播域中的所有以太网接口可接收这些帧。
- SRC:源以太网地址
- 长度或类型:必须为 0x0806。
- 硬件类型:用于描述 ARP 分组中的字段。指出硬件地址类型。对于以太网该值为1。
- 协议类型:用于描述 ARP 分组中的字段。指出映射的协议地址类型。对于IPv4地址,该值为0x0800。
- 硬件大小:硬件地址的的字节数。对于以太网中使用IPv4地址的ARP请求或应答,它的值为6。
- 协议大小:协议地址的字节数。对于以太网中使用IPv4地址的ARP请求或应答,它的值为4。
- Op:指出该操作是 ARP 请求(值为 1)、ARP 应答(2)、RARP 请求(3)或 RARP 应答(4)。由于 ARP请求和 ARP 应答的长度/类型字段相同,因此这个字段是必需的。
- 发送方硬件地址
- 发送方协议地址
- 目的硬件地址
- 目的协议地址
注意,这里存在一些重复的信息:以太网头部和ARP消息都包含发送方硬件地址。对于一个 ARP 请求,除了目的硬件地址(设为 0)之外,其他字段都需要填充。当一个系统接收到一个 ARP 请求,它填充自己的硬件地址,将两个发送方地址和两个接收方地址互换,将Op填字段设置为 2,然后发送生成的应答。
4.6——ARP缓存超时
在大多数实现中,完整条目的超时为20分钟,而不完整条目(对一个不存在主机的ARP请求)的超时为3分钟。这些实现通常在每次使用一个条目后为它重新启动20分钟的超时。[RFC1122]是描述主机需求的RFC,它规定每个条目即使在使用也应启动超时(不刷新),但很多实现并不这样做,它们在每次使用条目后重新启动超时。
注意,这是关于软状态的一个重要例子。软状态是指在超时到达前没有更新而被丢弃的信息。如果网络条件发生改变,软状态有助于启动自动重新配置,因此很多Internet协议使用软状态。软状态的成本是协议必须刷新状态以避免过期。在一些协议设计中,经常包括“软状态刷新”,以保持软状态的活跃。
4.7——代理ARP
代理ARP[RFC1027]使一个系统(通常是一台专门配置的路由器)可回答不同主机的ARP请求。它使ARP请求的发送者认为做出响应的系统就是目的主机,但实际上目的主机可能在其他地方(或不存在)。ARP代理并不常见,通常应尽量避免使用它。
代理ARP也被称为混杂ARP或ARP黑客。这些名称来自ARP代理的历史用途:两个物理网络相互隐蔽自己。在这种情况下,两个物理网络可使用相同的 IP 前缀,只要将中间的路由器配置为一个代理ARP,在一个网络中由代理响应对其他网络中主机的ARP请求。这种技术可用于向一组主机隐藏另一组主机。从前,这样做有两个常见原因:有些系统无法进行子网划分,有些系统使用比较旧的广播地址(全0的主机ID,而不是当前的全1的主机ID)。
4.8——免费ARP和地址冲突检测
-
免费ARP:它发生在一台主机发送ARP请求,目的协议地址为它自己的协议地址(IP地址)。它通常出现在启动时,当接口被配置为“上行”时常这样做。
免费ARP需要达到两个目标:
- 允许一台主机确定另一台主机是否配置相同的 IPv4 地址。发送免费 ARP 的主机并不期望它的请求获得应答。但是,如果它接收到一个应答,通常显示的是错误消息“从以太网地址。。。 发送的重复IP地址”。这是对系统管理员和用户的警告,在同一广播域(例如局域网或 VLAN)中有一个系统配置出错。(实际上没有对这种情况提供解决机制,除了显示一个消息,实际由系统管理员完成。为了解决这个问题,[RFC5227]描述了IPv4 地址冲突检测(ACD))。
- 如果发送免费ARP的主机已改变硬件地址,该帧导致任何接收广播并且其缓存中有该条目的其他主机,将该条目中的旧硬件地址更新为与该帧一致。
-
地址冲突检测(ACD):ACD定义了ARP探测分组和ARP通告分组
- ARP探测分组:ARP 探测分组是一个ARP 请求分组,其中发送方协议(IPv4)地址字段被设置为 0。探测分组用于查看一个候选IPv4地址是否被广播域中的任何其他系统所使用。通过将发送方协议地址字段设置为0,避免候选IPv4地址被另一台主机使用时的缓存污染,这是它与免费ARP工作方式的一个差别。
- ARP通告分组:ARP通告与 ARP 探测相同,除了其发送方协议地址和目的协议地址字段被填充为候选 IPv4 地址外。它用于通告发送方使用候选 IPv4 地址的意图。
ACD的执行流程:当一个接口被启用或从睡眠中唤醒,或一个新链路建立时,这台主机发送一个ARP探测分组。在发送 3 个探测分组之前,首先需要等待一个随机时间(范围为 0 1秒,均匀分布)。当多个系统同时启用时,通过延迟来避免启用带来的拥塞,如果都立即执行ACD,这将导致网络流量激增。探测分组之间存在一个随机的时间间距,大约12秒的延迟(均匀分布)。当请求站发送自己的探测时,它可能接收到ARP请求或应答。
- 收到ARP请求:表明其他系统也在同时尝试获得候选 IPv4 地址
- 收到APR应答:表明其他站已使用候选IP地址。
在这两种情况下,该系统将会显示一个地址冲突消息,并采用其他可选地址。例如,当使用DHCP分配地址时,这是推荐的行为。[RFC5227]对尝试获得地址设置了10次的冲突限制,在请求的主机进入限速阶段之前,它被允许每 60 秒执行一次 ACD,直至成功。
如果发送请求的主机没有发现冲突,它会间隔 2 秒向广播域中发送 2 个 ARP通告,以表明它现在使用这个IPv4 地址。在这个通告中,发送方协议地址和目的协议地址字段被设置为其声称的地址。发送这些通告的目的是确保更新缓存地址映射,以正确反映发送方当前使用的地址。
ACD是一个持续的过程,当一台主机通告它的地址后,它会继续检查输入的ARP流量(请求或应答),查看是否有冲突,如果有的话,说明其他系统与自己正在使用的地址相同。在这种情况下有三种解决方案:
-
停止使用这个地址。
-
保留这个地址,但发送一个防御性ARP通告,如果冲突继续,则停止使用它。
-
不理会冲突,仍继续使用。建议那些真正需要一个固定、稳定地址的系统(例如打印机或路由器等嵌入式设备)使用。
-
保留这个地址,但发送一个防御性ARP通告,如果冲突继续,则停止使用它。
-
不理会冲突,仍继续使用。建议那些真正需要一个固定、稳定地址的系统(例如打印机或路由器等嵌入式设备)使用。