当一个或多个接收者无法绑定到程序的知名端口时,IPv6 多播能否工作?
Can IPv6 multicasting work when one or more receivers are unable to bind to the program's well-known port?
考虑一个简单的 IPv6 多播应用程序:
- 一个“talker”程序定期将 IPv6 UDP 数据包发送到一个众所周知的多播组,然后将它们发送到一个众所周知的端口。
- 零个或多个“侦听器”程序将自己绑定到那个众所周知的端口并加入众所周知的多播组,并且它们都接收到 UDP 数据包。
除了一个或多个侦听器程序无法绑定到众所周知的 UDP 端口,因为其他(不相关)程序中的套接字已经绑定到该端口的情况外,这一切都很好UDP 端口(并且没有设置 SO_REUSEADDR
and/or SO_REUSEPORT
选项以允许它与其他任何人共享)。 AFAICT 在那种情况下,侦听器程序完全不走运,除了要求用户终止干扰程序以释放端口外,它无法接收多播数据。
或者有吗?例如,是否有某种技术或方法允许多播侦听器接收给定多播组的所有传入多播数据包,而不管它们被发送到哪个 UDP 端口?
如果您想接收所有多播流量而不考虑端口,您需要使用原始套接字来获取完整的 IP 数据报。然后您可以直接检查 IP header,检查它是否使用 UDP,然后在读取应用层数据之前检查 UDP header。请注意,执行此操作的方法是 OS 特定的,通常需要管理权限。
关于 SO_REUSEADDR
和 SO_REUSEPORT
,执行此操作的应用程序将允许多个程序接收发送到给定端口的多播数据包。但是,如果您还需要接收单播数据包,则此方法会有问题。传入的单播数据包可以设置到两个套接字,可以始终发送到一个特定的套接字,或者以交替方式发送到每个套接字。这也因 OS.
而异
考虑一个简单的 IPv6 多播应用程序:
- 一个“talker”程序定期将 IPv6 UDP 数据包发送到一个众所周知的多播组,然后将它们发送到一个众所周知的端口。
- 零个或多个“侦听器”程序将自己绑定到那个众所周知的端口并加入众所周知的多播组,并且它们都接收到 UDP 数据包。
除了一个或多个侦听器程序无法绑定到众所周知的 UDP 端口,因为其他(不相关)程序中的套接字已经绑定到该端口的情况外,这一切都很好UDP 端口(并且没有设置 SO_REUSEADDR
and/or SO_REUSEPORT
选项以允许它与其他任何人共享)。 AFAICT 在那种情况下,侦听器程序完全不走运,除了要求用户终止干扰程序以释放端口外,它无法接收多播数据。
或者有吗?例如,是否有某种技术或方法允许多播侦听器接收给定多播组的所有传入多播数据包,而不管它们被发送到哪个 UDP 端口?
如果您想接收所有多播流量而不考虑端口,您需要使用原始套接字来获取完整的 IP 数据报。然后您可以直接检查 IP header,检查它是否使用 UDP,然后在读取应用层数据之前检查 UDP header。请注意,执行此操作的方法是 OS 特定的,通常需要管理权限。
关于 SO_REUSEADDR
和 SO_REUSEPORT
,执行此操作的应用程序将允许多个程序接收发送到给定端口的多播数据包。但是,如果您还需要接收单播数据包,则此方法会有问题。传入的单播数据包可以设置到两个套接字,可以始终发送到一个特定的套接字,或者以交替方式发送到每个套接字。这也因 OS.