将广播应用程序移植到 IPv6

本部分介绍将 IPv6 广播应用程序移植到 Windows 套接字可用的多播功能的最佳做法。

比较 IPv4 与 IPv6

准备将 IPv4 广播应用程序移植到 IPv6 时,最值得注意的事项是:IPv6 没有实现的广播概念。 相反,IPv6 使用多播。

适用于 IPv6 的多播可以模拟 IPv4 中的传统广播功能。 将 IPv6 地址设置为链接本地范围的所有节点地址 (FF02::1) 的 IPV6_ADD_MEMBERSHIP 套接字选项等效于使用 SO_BROADCAST 套接字选项在 IPv4 广播地址上广播。 此地址有时称为 全节点多播组。 对于只想为 IPv6 进行广播仿真的应用程序,该方法在操作上是等效的。 但是,IPv6 的一个显著区别在于,默认情况下,不会接收全节点多播组地址上的多播, (IPv4 广播默认接收) 。 应用程序程序员必须使用 IPV6_ADD_MEMBERSHIP 套接字选项来启用来自任何源的多播接收,包括全节点多播组地址。

注意

在 IPv6 中,接口选择是在传递给多播套接字选项或 IOCTL 的参数结构中指定的。

 

但是,对于更丰富、更可靠、更选择性和更易于管理的多个主机的传输,应用程序开发人员应考虑迁移到多播模型。

移动到多播

使用多播,应用程序程序员可以有选择地选择特定的源/组对,从而启用选择性接收模型。 IPv6 上的多播侦听器发现 (MLD) ,IPv4 上的 Internet 组管理协议 (IGMPv3) 版本 3 支持多播编程。 此外,多播使应用程序能够专门阻止组内 (或取消阻止) 发送方,从而进一步保护应用程序免受恶意广播者的阻止。 此功能适用于需要 IGMPv3) 且 IPv6 (需要 MLDv2) 的 IPv4 (。

对于使用多播的应用程序程序员来说,有两种主要方案:从 IPv4 广播 (或多播) 应用程序移植到 IPv6,以及创建新的 IPv6 多播应用程序。

若要移植现有应用程序,可以使用两个选项迁移到 IPv6 多播:使用套接字选项和使用 IOCTL。

  • 使用套接字选项是一种基于更改的方法,它使开发人员能够根据需要更改套接字属性, (例如阻止或取消阻止发件人、添加新源等) 。 此方法更直观,是推荐的方法。 有关多播编程的基于更改的方法的详细信息,请参阅 使用 Windows 套接字的 MLD 和 IGMP
  • 使用 IOCTL 是一种基于最终状态的方法,因为它使开发人员能够通过一次调用提供完全配置的套接字状态,包括包含和排除列表。 有关基于最终状态的方法的详细信息,请参阅 基于最终状态的多播编程

对于创建新 IPv6 多播应用程序的用户,建议的做法是使用套接字选项,而不是使用 IOCTL。

还有一种使用 IPv6 创建多播应用程序的方法,这需要使用 WSAJoinLeaf 函数。 虽然不建议使用 WSAJoinLeaf 函数,但在某些情况下可能会决定其用法。 例如,在 Windows Server 2003 及更早版本上使用套接字选项的一个缺点是它们特定于 IP 版本。 在这些较旧版本的 Windows 上,对于 IPv6 和 IPv4,必须使用不同的套接字选项。 在 Windows Vista 及更高版本上,支持可用于 IPv4 和 IPv6 的新套接字选项。 相比之下, WSAJoinLeaf 函数与 IP 版本和协议无关,因此对于生成必须在 Windows Server 2003 及更早版本上使用多个 IP 版本的应用程序而言,它可能是一种有用的方法。 在某些需要协议和 IP 版本不可知性的情况下,使用 WSAJoinLeaf 函数可能更合适。