一、ARP直接交付
- 如何发生ARP直接交付:直接交付发生在 一个IP数据报被发送到一个IP地址,而该地址与发送方具有相同IP前缀的情况下
- ARP用于运行IPv4的多接人链路层网络,每个主机都有自已首选的硬件地址。点到点链路(例如PPP)不使用ARP。当这些链路被建立后(通常是由用户或系统来发起创建),在链路两端通知正在使用的地址。由于不涉及硬件地址,因此不需要地址解析或 ARP
演示案例
例如我们在Web浏览器输入以下网址
- 第一步:应用程序要求TCP协议建立一条到10.0.0.1的连接
- 第二步:通过向10.0.0.1发送一个IPv4数据报,TCP尝试向远程主机发送一个连接请求
- 第三步:.我们假设地址10.0.0.1使用与发送主机相同的网络前缀,数据报可被直接发送到这个地址而不经过任何路由器
- 第四步:假设以太网兼容地址被用于IPv4子网,发送主机必须将32位的IPv4目的地址转换为48位的以太网地址。就是需要从逻辑Intemet地址向对应物理硬件地址进行转换。这是ARP功能。ARP工作在正常模式下,仅适用于广播网络,链路层能将一个消息交付到它连接的所有网络设备。这是ARP运行的一个重要要求。在非广播网络(有时被称为非广播多路访问(NBMA))中,可能需要更复杂的映射协议
- 第五步:在一个共享的链路层网段上,ARP向所有主机发送一个称为ARP请求的以太网帧。 这被称为链路层广播。图4-1的斜线阴影中显示了一个广播域。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
- 概念:代理ARP使一个系统(通常是一台专门配置的路由器)可回答不同主机的ARP请求
- 它使ARP请求的发送者认为做出响应的系统就是目的主机,但实际上目的主机 可能在其他地方(或不存在)。ARP代理并不常见,通常应尽量避免使用它
隐藏
代理ARP也被称为混杂ARP或ARP黑客。这些名称来自ARP代理的历史用途:两个物理网络相互隐蔽自已
- 在这种情况下,两个物理网络可使用相同的IP前缀,只要将中间的路由器配置为一个代理ARP,在一个网络中由代理响应对其他网络中主机的ARP请求
- 这种技术可用于向一组主机隐藏另一组主机
- 从前,这样做有两个常见原因:有些系统无法进行子网划分,有些系统使用比较旧的广播地址(全0的主机ID,而不是当前的全1的主机ID)
Linux自动代理ARP
- Linux支持一种称为自动代理ARP的功能
- 它通常在文件/proc/sys/net/ipv4/confys/*/proxy_aap中写人字符1,或使用sysctl命令来启用
- 它支持使用代理ARP功能,而不必为被代理的每个可能的IPv4地址手工输人ARP条目。这样做允许自动代理一个地址范围,而不是单个地址
三、免费ARP和IPv4地址冲突检测(ACD)
- 免费ARP的作用:它发生在一台主机发送ARP请求以寻找自己的地址时。它通常出现在启动时,当接口被配置为“上行”时常这样做
例子
在一 台Linux机器上跟踪显示Windows主机的启动
- 就ARP请求字段而言,发送方协议地址和目的协议地址相同:10.0.0.56
- 另外,以太网头部中的源地址字段被tcpdump显示为0:0:c0:6f:2d:40,它等于发送方硬件地
免费ARP的用途
免费ARP需要达到两个目标:
- ①允许一台主机确定另一台主机是否配置相同的IPv4地址。发送免费ARP的主机并不期望它的请求获得应答。但是,如果它接收到一个应答,通常显示的是错误消息“从以太网 地址……发送的重复IP地址”。这是对系统管理员和用户的警告,在同一广播域(例如局域网或VLAN)中有一个系统配置出错
- ②如果发送免费ARP的主机已改变硬件地址(关闭主机或替换接口卡,然后重新启动主机),该帧导致任何接收广播并且其缓存中有该条目的其他主机,将该条目中的旧硬件地址更新为与该帧一致。如前面所述,如果一台主机接收到一个ARP请求,该请求来自一个已存在接收方缓存中的IPv4地址,则缓存条目更新为ARP请求中发送方的硬件地址。这由 接收到ARP请求的主机完成,免费ARP正好利用这个特性
- IPv4地址冲突检测(ACD):虽然免费ARP提供的一些迹象显示,多个站可尝试使用相同IPv4地址,但它实际上没有对这种情况提供解决机制(除了显示一个消息,实际由系统管理员完成)。为了解决这个问题,提供了IPv4地址冲突检测(ACD)
ACD定义了ARP探测分组和ARP通告分组
- ARP探测分组:是一个ARP请求分组,其中发送方协议(IPv4 )地址字段被设置为0。探测分组用于查看一个候选IPv4地址是否被广播域中的任何其他系统所使用。通过将发送方协议地址字段设置为0,避免候选IPv4地址被另一台主机使用时的缓存污染,这是它与免费ARP工作方式的一个差别
- ARP通告分组:与ARP探测相同,除了其发送方协议地址和目的协议地址字段被填充为候选IPv4地址外。它用于通告发送方使用侯选IPv4地址的意图
- 为了执行ACD,当一个接口被启用或从睡眠中唤醒,或一个新链路建立(例如,当一个新的无线网络关联建立)时,这台主机发送一个ARP探测分组。在发送3个探测分组之前,首先需要等待一个随机时间(范围为0 - 1秒,均匀分布)。当多个系统同时启用时,通过延迟来避免启用带来的拥塞,否则都立即执行ACD,这将导致网络流量激增。探测分组之间存在一个随机的时间间距,大约1 - 2秒的延迟(均匀分布)。
- 当请求站发送自已的探测时,它可能接收到ARP请求或应答。对其探测的应答表明其他站已使用候选IP地址。从不同系统发送的请求,其目的协议地址字段中包含相同的候选IPv4地址,表明其他系统也在同时尝试获得候选IPv4地址。在这两种情况下,该系统将会显示一个地址冲突消息,并采用其他可选地址。例如,当使用DHCP分配地址时,这是推荐的行为。 [RFC5227]对尝试获得地址设置了10次的冲突限制,在请求的主机进人限速阶段之前,它被允许每60秒执行一次ACD,直至成功
- 根据前面所描述的过程,如果发送请求的主机没有发现冲突,它会间隔2秒向广播域中发送2个ARP通告,以表明它现在使用这个IPv4地址。在这个通告中,发送方协议地址和目的协议地址字段被设置为其声称的地址。发送这些通告的目的是确保更新缓存地址映射,以正确反映发送方当前使用的地址
- ACD被认为是一个持续的过程,这是它与免费ARP的区别。当一台主机通告它正使用的地址后,它会继续检查输人的ARP流量(请求和应答),查看自已的地址是否出现在发送方协议地址字段中。如果是的话,说明其他系统与自已在使用相同的地址。在这种情况下,[RFC5227]提供了3种可能的解决方案:停止使用这个地址;保留这个地址,但发送一个“防御性” ARP通告,如果冲突继续,则停止使用它;不理会冲突,仍继续使用。对于最后一个选择,仅建议那些真正需要一个围定、稳定地址的系统(例如打印机或路由器等嵌人式设备) 使用
- [RFC5227]还说明了使用链路层广播发送ARP应答的潜在好处。虽然这不是传统的 ARP工作方式,但同一网段中所有站需处理ARP流量时,这样做可带来一些好处。广播应答可以更快地执行ACD,这是由于所有站都会注意到这个应答,并在发现冲突时使自已的缓存无效