linux - 接收不需要的多播流量的应用程序

标签 linux kernel multicast

我有以下场景;主机 HostRec:

1) 主机的 NIC bond0 已加入多播组 multicast1 和 multicast2 – 因为应用程序已请求这样做。 2) 我在同一台主机 HostRec 上启动了一个多播监听应用程序,它监听多播 3 和 UDP 端口 3 上的流量。 3) 我在另一台主机 HostSend 上启动多播发送应用程序。

此时我有以下3个场景:

a) 如果第 3 步的发送应用程序在多播地址 multicast3 和 udp 端口​​ 3 上发布,则消息会被上面第 2 步中启动的监听应用程序正确接收。这是预期的行为。

b) 如果我的多播发送应用程序在 multicast2 和端口 3 上发布消息,这些消息仍会被在第 2 步启动的监听应用程序接收。如果多播发送应用程序在多播 1 和端口 3 上发布消息,则行为相同。这种行为是错误的。

c) 如果发送应用程序(第 3 步)开始在多播地址 multicast4 和 udp 端口​​ 3 上发布(HostRec 上的 NIC bond0 尚未加入此多播组),则在第 2 步上启动的监听应用程序正确地未接收到消息。这又是预期的行为。

您能否建议主机的多播内核配置是否有问题?

uname -a Linux HostRec 2.6.18-164.2.1.el5 #1 SMP Mon Sep 21 04:37:42 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

谢谢, 索马里奥

最佳答案

这是预期的行为,尽管起初看起来确实有点奇怪。尽管您认为您正在绑定(bind)到多播组/端口,但您实际上在做的是:

  1. 绑定(bind)到接口(interface)上的 UDP 端口。
  2. 将此接口(interface)订阅到给定的多播组。

这两个 Action 是相当独立的。第一个的结果是您的进程将接收所有发往您的端口/接口(interface)的 UDP 数据包(多播或非多播)。第二个结果是确保将寻址到给定多播地址的数据包(通过网络路由器)发送到您的接口(interface)。

大多数人不希望这样,事实上他们只想接收单个多播组的数据,不想担心网络上发生的其他事情。实现这一点的最佳方法是确保一个端口仅用于一个多播组。通常的做法是使用多播组的最后一个八位位组作为端口的最低有效八位位组。例如 224.0.0.22/端口 19022 和 224.0.0.150/19150。这样您就永远不会得到错误的数据(只要没有人将 UDP 单播数据发送到这些端口)。

关于linux - 接收不需要的多播流量的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11560460/

相关文章:

linux - 历史命令在终端中有效,但在作为 bash 脚本编写时无效

linux - 如何让 Free Pascal 控制台应用程序运行在 "forever"?

c - 过滤掉 IPv6 多播地址范围

C# UDP 客户端读取组播 IP(本地接口(interface)),并将单播 UDP 发送到 VPN

windows - 让我的应用程序使用一些端口 - 防火墙问题

linux - Systemd:同时使用 After 和 Requires

linux - 在 bash 中使用先前命令的输出

linux - 从最低层(硬件)到应用程序的中断流程

linux - 替换linux内核3中的系统调用

linux 内核路径遍历。查找慢的解释