Skip to main content

Appendix A. Loopback Suppression and Duplicate Address Detection (环回抑制与重复地址检测)

确定接收到的组播请求是循环回发送者还是实际来自另一个节点是依赖于实现的. 当连接到同一链路的两个接口恰好具有相同的标识符和链路层地址, 并且它们都在大致相同的时间发送内容相同的数据包 (例如, 作为重复地址检测消息的一部分为暂定地址发送的邻居请求) 时, 会出现一个有问题的情况. 虽然接收者将接收两个数据包, 但它无法仅通过比较数据包内容来确定哪个数据包被循环回, 哪个数据包来自另一个节点 (即, 内容相同). 在这种特殊情况下, 不需要精确知道哪个数据包被循环回, 哪个由另一个节点发送; 如果收到的请求多于发送的请求, 则暂定地址是重复的. 但是, 情况可能并不总是这么简单.

IPv4组播规范[RFC1112]建议服务接口提供一种方式, 供上层协议禁止将发送到发送主机是其成员的组播组的数据包本地传递. 某些应用程序知道同一主机上不会有其他组成员, 并且抑制环回可以防止它们必须接收 (和丢弃) 它们自己发送的数据包. 实现此功能的一种直接方法是在硬件级别禁用环回 (如果硬件支持), 并通过软件循环回数据包 (如果请求). 在硬件本身抑制环回的接口上, 运行重复地址检测的节点简单地计算为暂定地址接收的邻居请求的数量, 并将它们与预期数量进行比较. 如果存在不匹配, 则暂定地址是重复的.

然而, 在硬件无法抑制环回的情况下, 过滤掉不需要的环回的一种可能的软件启发式方法是丢弃任何接收到的链路层源地址与接收接口相同的数据包. 甚至有一个链路层规范要求丢弃任何此类数据包[IEEE802.11]. 不幸的是, 使用该标准也会导致丢弃由使用相同链路层地址的另一个节点发送的所有数据包. 重复地址检测将在以这种方式过滤接收数据包的接口上失败:

  • 如果执行重复地址检测的节点丢弃具有与接收接口相同的源链路层地址的接收数据包, 它也将丢弃来自也使用相同链路层地址的其他节点的数据包, 包括使重复地址检测正常工作所需的邻居通告和邻居请求消息. 如果可以禁用抑制, 则可以通过在节点执行重复地址检测时临时禁用环回的软件抑制来避免这个特定问题.

  • 如果已经使用特定IP地址的节点丢弃具有与接口相同的链路层源地址的接收数据包, 它也将丢弃由也使用相同链路层地址的另一个节点发送的与重复地址检测相关的邻居请求消息. 因此, 重复地址检测将失败, 并且另一个节点将配置非唯一地址. 由于通常不可能知道另一个节点何时执行重复地址检测, 因此只有在永久禁用环回的软件抑制时才能避免这种情况.

因此, 在两个接口使用相同链路层地址的情况下正确执行重复地址检测, 实现必须对接口的组播环回语义有很好的理解, 并且接口不能仅仅因为源链路层地址与接口的地址相同而丢弃接收的数据包. 还应该注意的是, 链路层规范可能与使重复地址检测工作所需的条件冲突.