当一个或多个接收者无法绑定到程序的知名端口时,IPv6 组播能否工作?

问题描述

考虑一个简单的 IPv6 多播应用程序:

  • “talker”程序会定期向知名多播组发送 IPv6 UDP 数据包,并将其发送至知名端口。
  • 零个或多个“侦听器”程序将自身绑定到该知名端口并加入知名多播组,并且它们都接收 UDP 数据包。

这一切都很好,除非一个或多个侦听程序无法绑定到众所周知的 UDP 端口,因为某个其他(不相关)程序中的套接字已经绑定到该 UDP 端口(并且没有设置 SO_REUSEADDR 和/或 SO_REUSEPORT 选项以允许与其他人共享)。 AFAICT 在这种情况下,监听程序只是运气不好,它无法接收多播数据,除了要求用户终止干扰程序以释放端口。

或者在那里?例如,是否有某种技术或方法允许多播侦听器接收给定多播组的所有传入多播数据包,而不管它们被发送到哪个 UDP 端口?

解决方法

如果您想接收所有多播流量,而不管端口如何,您需要使用原始套接字来获取完整的 IP 数据报。然后,您可以直接检查 IP 标头,检查它是否使用 UDP,然后在读取应用层数据之前检查 UDP 标头。请注意,执行此操作的方法是特定于操作系统的,通常需要管理权限。

关于 SO_REUSEADDRSO_REUSEPORT,执行此操作的应用将允许多个程序接收发送到给定端口的多播数据包。但是,如果您还需要接收单播数据包,则此方法存在问题。传入的单播数据包可以设置到两个套接字,可以总是发送到一个特定的套接字,或者以交替的方式发送到每个套接字。这也因操作系统而异。