在 Linux IPv4 堆栈上,UDP 多播侦听套接字可以接收单播数据包吗?或者,UDP 单播套接字可以接收多播数据包吗?

在 Linux IPv4 堆栈上,UDP 多播侦听套接字可以接收单播数据包吗?或者,UDP 单播套接字可以接收多播数据包吗?

我的理解是,如果套接字不绑定本地地址(或绑定到INADDR_ANY),并且不调用connect()设置远程地址/端口,则无法阻止单播数据包传递到多播侦听套接字,或者反之反之亦然,因为当数据包到达 UDP 层时剩下的唯一检查是端口号匹配(同样,因为其他标准(例如远程/本地地址)都为零)。我能想到的假设场景是这样的:

  1. 在具有一个接口的计算机上,主 IP 地址是 IP_ADDR
  2. 套接字 A 监听 UDP 多播地址 MULTICAST_IP_A,端口号为 PORT_A
  3. 套接字 B 在 PORT_B 上侦听 UDP 单播

那么以下陈述是否正确?

  1. 发送到组地址 MULTICAST_IP_A(端口号 PORT_B)的多播数据包将被传递到套接字 B
  2. 发送到 IP_ADDR:PORT_A 的单播数据包将被传递到套接字 A

我查看了Linux IPv4源代码,到目前为止似乎会发生上述两种情况,例如,__udp_is_mcast_sock()true即使为空也会返回inet->mc_list,因为inet_create()设置inet->mc_all1.但我不是专家,想听听有人验证/无效这些声明,也许还可以提供一些代码指示。谢谢!

答案1

请注意,如果本地地址不是多播的,udp_is_mcast_sock() 将返回 false(请参阅ip_mc_sf_允许)。

对于这两个问题,这篇文章可能会有所帮助:绑定多播 (UDP) 套接字意味着什么?

对于情况1。

  • 组播数据包发送到组地址 MULTICAST_IP_A,端口号为 PORT_B将不会被传送到套接字B

对于情况2。

  • 单播数据包发送到 IP_ADDR:PORT_A将要被传递到套接字 A。UDP 多播套接字将绑定在 0.0.0.0 上,这就是原因。您可以启动服务器并运行netstat -aun来查看,尽管您可能已经在端口 5353 (avahi/mdns) 上拥有一个服务器。

您可以使用 python 多播客户端/服务器程序检查这种情况和其他情况这个帖子。要模拟单播客户端/服务器行为,您可以使用nc(netcat)。

相关内容