首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

使用 GRAND 缩小 IPv6 第一个数据包差距

2026-09-16 1 阅读 约5分钟阅读 m_montazeri
分享:
字号:
IPv6 邻居发现中有一个微妙的不对称性:主机知道如何到达其路由器,然后路由器必然知道如何到达主机。 GRAND 通过让主机主动通告其地址来修复这种不对称性,我在 FreeBSD 中实现了该机制。设备加入 IPv6 网络、接收路由器通告、配置新的 IPv6 地址,并立即开始与 Internet 通信。从主人的角度来看,一切都准备好了。它知道其默认路由器的链路层地址,因此可以立即向互联网发送数据包。然而,从路由器的角度来看,情况可能有所不同。路由器可能尚不知道如何到达主机新配置的全局 IPv6 地址。这在 IPv6 邻居发现中造成了微妙的不对称:主机已经可以到达路由器,而路由器可能必须执行邻居发现才能将流量转发回主机。第一个 IPv6 数据包有问题 考虑一台刚刚配置了新 IPv6 地址的主机。主机向离线目的地发送数据包。第一跳路由器收到报文并正常转发。然而,当远程目标响应时,返回数据包将到达路由器,并将主机作为其目的地。路由器可能没有该 IPv6 地址的邻居缓存条目,因此它必须先解析主机的链路层地址,然后才能转发数据包。这将邻居发现直接置于第一个返回数据包的关键路径中。对于通常对应用程序不可见的机制,这可能会产生明显的影响:连接的第一个数据包可能会经历额外的延迟,或者在地址解析过程中可能会被丢弃。这个问题特别有趣,因为主机已经拥有路由器所需的所有信息。主机知道它拥有 IPv6 地址并知道相应的链路层地址,但路由器还没有获知。为什么邻居发现会导致这种情况? IPv6 邻居发现在这种情况下是被动的。当节点需要与它没有可用邻居缓存条目的邻居通信时,它通过发送邻居请求并等待邻居通告来开始地址解析。这对于老邻居来说效果很好。问题出现在从“地址刚刚变得可用”到“网络的其余部分知道如何到达它”的过渡过程中。因此,主机已经知道其 IPv6 地址和链路层地址,而第一跳路由器在流量到达之前可能没有关于主机的信息。这就是 GRAND 所解决的差距。 GRAND:将反应性邻居发现变为主动信息 无偿邻居发现改变了信息流的方向,以便主机不再等待路由器在第一个数据包到达时发现主机,而是使用未经请求的邻居通告主动宣布其 IPv6 地址和链路层地址。然后,路由器可以在需要将流量转发到主机之前了解此信息。这是 RFC 9131 背后的中心思想。但实施 GRAND 不仅仅是每当地址出现时发送未经请求的邻居广告的问题。 GRAND 与多个现有邻居发现规则交互,包括处理多个地址、任播和代理地址、计时和重复地址检测。在 RFC 4861 上构建 GRAND 实施 GRAND 的一个重要部分是了解主动提供的邻居广告已经在邻居发现中发挥了明确的作用。 RFC 4861 规则 7.2.6 指定了未经请求的邻居通告的行为,包括节点链路层地址更改等情况。它还限制一个节点可以为多个地址发送的广告数量,并建议间隔这些广告以避免不必要的拥塞。 RFC 4861 规则 7.2.7 和 7.2.8 涵盖了选播和代理邻居通告的特殊情况。在这些情况下,多个节点可能会响应相同的邻居请求。如果它们都立即传送,它们的目的就失效了。为了解决这个问题,RFC 4861 在发送任播或代理邻居通告之前指定了随机延迟。这使多个潜在响应者有机会避免同时传输。这些计时规则是邻居发现整体设计的重要组成部分:快速提供信息很有用,但在不创建多播风暴的情况下这样做也同样重要。我的实现将这些行为添加为 GRAND 工作的一部分,而不是依赖于预先存在的排队和延迟 NA 基础设施。 GRAND 和延迟的邻居广告 因此,GRAND 中不太明显的部分之一是邻居广告的调度。这就是我决定实现缺失的 RFC 4861 部分的地方
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱