问题标签 [igmp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
168 浏览

c - 在一个套接字上接收来自多个组的多播流量时出现问题

我正在使用 C 语言开发一个应用程序,该应用程序在一个套接字上侦听多个多播组。我正在禁用套接字选项:IP_MULTICAST_ALL。套接字正在接收来自 20 个不同的多播组的流量。此流量以突发方式到达套接字。其中一个频道每秒只发布一条消息,这里没有发现任何问题。

我也有一个可靠的协议用于这个多播提要。如果一个侦听器错过了一条消息,那么协议会尝试通过消息与源对话来恢复该消息,然后像往常一样通过相同的通道执行重传。

当有消息突发到达套接字时,就会出现问题,然后 RUDP 协议会强制重新传输这些消息。消息到达没有问题,但如果消息突发组停止重新传输新数据,因为它们没有更多的流量要发送,有时(很容易重现它)套接字不会从这些中读取那些待处理的传入消息如果周期性消息从不同的组(具有微小流量、微小和周期性流量的组)到达,则分组。到目前为止的情况是,之前发送了许多传入消息,等待应用程序读取(不再通过该组发送数据),来自另一个组的周期性消息,该组定期发送一些消息。

我在这里看到的是,应用程序从定期发送一些消息的组中读取一条消息,然后从其他组(突发组)中读取一批消息。套接字配置为非阻塞,每次从套接字读取一批消息时我都会得到 EAGAIN errno,然后没有更多数据要读取,直到套接字从周期性组获得新消息,然后读取此消息以及来自其他组的一批其他未决消息(应用程序仅从一个套接字读取)。我确保其他组不会产生更多数据,因为我测试了停止其他进程以发送更多数据。因此,这些组上的所有待处理消息都已发送。

最令人惊讶的事实是,如果我阻止写入周期性组的进程发送更多消息,那么侦听器套接字会神奇地从之前发布消息突发的组中获取所有挂起的流量。就像周期性组的流量以某种方式停止处理来自不发布新数据但缓冲区充足的组的流量。

起初我以为它与IGMP或轮询机制有关(我的应用程序可以执行主动等待或阻塞等待)。阻塞等待是通过非阻塞套接字实现的,但如果 errno 设置为 EAGAIN,则应用程序会等待轮询以获取新消息。在这两种情况下,我都会得到相同的行为。我认为这不是 IGMP,因为 IGMP_SNOOPING 在交换机中处于关闭状态,并且因为我使用一台计算机环回来重现相同的行为,以进行所有这些进程之间的通信。

我还使用内核绕过技术(不使用内核 API 来处理网络)重现了这种行为,因此它似乎与 TCP/IP 堆栈无关。使用内核绕过技术,我有相同的范式:一个消息接口从所有组中获取所有流量。在这种情况下,所有进程都使用这种机制进行通信,而不是几个 TCP/IP 和几个内核旁路。该模型是同质的。

当我从多个组接收实时流量时,我只收到一批消息(但不是全部),但如果我停止来自不同多播组的定期流量,我怎么会收到所有待处理的流量?这个周期性的流量组每秒只有一条消息。突发组不再发布,因为所有消息都已发布。

请问,有人知道我接下来应该检查什么吗?

0 投票
0 回答
105 浏览

windows - Windows Source-Specific-Multicast 数据包在应用层丢弃?

Switch A 和 Switch B 都支持IGMPv3,设备 A 和设备 B 将视频流多播到相同的地址和端口(例如 232.0.0.1:12000)。Windows 7/10 上的 vlc/ffplay 播放会丢失数据包,但在 Linux 上播放流畅。

我已经测试了以下场景:

  1. 使用 IGMP v2,在 Windows 和 Linux 上,多播流(到不同地址)的两个设备都可以流畅播放;
  2. 使用IGMP v3,两台设备都多播流,Linux播放流畅,Windows 7/10播放轻弹,Windows上的Wireshark显示没有丢包;
  3. 使用IGMP v3,只需一台设备组播,Windows和Linux都可以流畅播放。
0 投票
1 回答
188 浏览

linux - IGMP:主机拒绝来自 src“0.0.0.0”的 igmp 查询

根据 RFC4541,代理发送 src 为 0.0.0.0 的 IGMP 查询是有效的场景。此外,RFC 在第 2.1.1 (4) 节中说:“如果交换机不是查询器,它应该在这些代理查询中使用‘全零’IP 源地址(即使某些主机可能选择不处理查询)使用 0.0.0.0 IP 源地址)。

问题是:如何让主机接受这些查询呢?是否有开关或者是否需要 Linux/debian buster 4.19.99 上的补丁

0 投票
1 回答
160 浏览

c# - 使用 TTL 加入多播组

我正在使用 C# .net 框架 4.7。我的应用程序正在尝试加入距离几台路由器(跳数)远的多播组。结果,我尝试发送 TTL > 1 的 IGMP 数据包。目前,我使用 UdpClient.JoinMulticastGroup() 并将 TTL 参数设置为 3,但是当我使用 Wireshark 检查 IGMP 数据包时,TTL 保持在 1 .

这是我的代码

网上的几篇帖子似乎暗示IGMP是针对本地网络的,所以TTL总是1;但是,如果这是真的,为什么 JoinMulticastGroup 允许我们设置 TTL?但另一方面,当我将 TTL 设置为 3 时,为什么 TTL 不会改变?

有人可以确认多播加入数据包(IGMP)是否可以具有 1 以外的 TTL 值?如果可以,那么我的代码中是否缺少某些内容?

更新:我将 TTL 设置为 10,Wireshark 仍然显示 TTL=1

生存时间:1

0 投票
0 回答
36 浏览

linux - IGMP 问题(从错误的接口发送报告)

我们有几个接口(vlan 配置)的 centos 7。

当我们使用 (ip addr add IP dev eno1.956 autojoin) 命令加入多播时。我们的系统从 lo 接口发送报告打包器,但让打包器从绑定(从命令)接口发送。

你能告诉我我们缺少什么吗?

0 投票
1 回答
200 浏览

windows - 如何配置 Windows/winsock 来回复 IGMP v3 查询?

使用 Winsock2 收集 Windows 10 主机的 ipv4 多播数据。从 Wireshark 中,igmp 加入/离开运行良好,它启动/停止交换机传输(带监听的交换机 + 集成查询器)。交换机的查询器按预期定期发送 igmp v3 常规查询,但 Windows 没有生成报告。所以超时(260s)后,交换机停止发送。该代码类似于www.winsocketdotnetworkprogramming.com上的示例,通过 IP_ADD_SOURCE_MEMBERSHIP 套接字选项使用 igmp 连接。尝试使用另一台主机和 Windows 7:同样的问题。

wireshark的输出,主机是192.168.100.34

所以问题:

  • 必须使用某些选项声明以太网接口以启用 Windows 的自动查询处理吗?
  • 也许查询被过滤了?(但防火墙已禁用...)
  • 遗漏了什么 ?
0 投票
0 回答
32 浏览

igmp - IGMP 中的一般成员资格查询与组特定成员资格查询有什么区别

我在网上浏览了各种文件,但找不到 IGMP 中的一般会员查询。我可以理解组特定消息查询,例如多播路由器向特定组发送查询,例如 224.10.10.10 和对该组感兴趣的所有主机,回复路由器。

但是,这个通用查询是如何工作的,它的目的是什么?客户如何响应此查询?

谢谢。

0 投票
0 回答
56 浏览

linux - 从 Linux 命令行发送 IGMP 多播组离开

我想简单地从我的客户端上的以太网端口(例如 eth2)发送一个 IGMP 多播组离开到交换机,以便离开例如多播组 239.1.2.3。从 Linux 命令行。

我还没有找到任何可以做到这一点的简单示例。我一直在与 Socat 和 Scapy 合作。对于如此微不足道的事情,两者似乎都过大了。而且我也没有设法为他们找到一个例子。即使是这些例子也能让我更接近尝试这个想法。

我希望能找到一些提供简单命令的工具:

igmp-leave -i eth2 239.1.2.3

(这是为了测试 ST2022-7 以故意降低其中一个本质以模拟网络错误。我无法关闭网络接口或修改交换机上的任何内容。这个细节并不重要,但我包括了它上下文)。

0 投票
0 回答
26 浏览

android - 如何获取 Android 10/11 设备的加入多播组列表?

在 Android 9 及更低版本中,我们可以读取 /proc/net/igmp 文件以获取组列表,但这在 Android 10/11 中不起作用。

我尝试过的事情:

  1. 我能够监视多播加入数据包的网络接口,但这并没有给我任何在启动应用程序之前加入的多播组。
  2. 我尝试发送 IGMP 成员资格查询,但没有看到回复数据包(使用来自https://github.com/pali/igmpproxy的代码示例,文件:request.c,函数:sendGeneralMembershipQuery)。
0 投票
0 回答
24 浏览

linux - EADDRNOTAVAIL 丢弃 IGMPv2 成员资格并在间隔内强制发送重新加入

我有一个案例,我想每隔 N 间隔发送一个 IGMP 成员资格报告。目前我有一个套接字用于setsockopt通过内核加入和维护该成员资格。我还设置了另一个套接字来“强制”发送自定义成员报告,然后关闭。

这一切都很好地与套接字一起工作SO_REUSEADDR并且没有出现冲突。但是,当尝试使用 和 离开 IGMPv2 组时 setsockopt如果强制重新加入例程即将发生IP_DROP_MEMBERSHIP,它将出错。长寿命套接字将继续响应 IGMP 查询,就像什么都没发生一样。该软件将不断尝试删除成员资格,从而导致相同的错误。EADDRNOTAVAIL 99 Cannot assign requested address

短暂的套接字将在正确关闭之前绑定、连接和写入close