首页 > 解决方案 > 有没有办法加快c/c++中多播消息的连接时间?

问题描述

我有一个带有两个托管交换机的 Windows 计算机本地网络,当我在所有计算机上启动所有程序时,另一个交换机上的计算机需要一两分钟才能开始接收多播流量。我在发送端和接收端都使用 Wireshark。我可以看到在发送方发送的数据包,并且需要一两分钟才能在接收方的 Wireshark 上看到这些数据包(接收程序正在运行)。

我设置IP_MULTICAST_TTL为 255 并将发送套接字绑定到正确的 IP 地址,但仍然需要一两分钟才能开始接收多播数据包。

我能做些什么来解决这个问题,最好是编程?类似于 TCP 无延迟或 TCP 保持活动。

标签: c++cnetworkingmulticast

解决方案


根据您的评论,问题在于您在其中一台交换机上启用了 IGMP 侦听。禁用 IGMP 侦听解决了这个问题,但这并不理想。这实际上归结为您没有连接到交换机的多播查询器或 mrouter。

有没有一种编程方式可以说“不要窥探或延迟这个数据包”?

不,这是一种完全取决于交换机型号及其配置方式的网络配置。

通过在交换机上禁用 IGMP 侦听,您实际上是让所有主机都接收多播,而这可能不是(可能不是)可取的。与单播协议不同,多播协议旨在防止多播到达未请求的地方。通过侦听 IGMP,交换机将看到来自主机的加入消息,并将请求组的多播帧发送到连接该主机的交换机接口,但不会发送未请求的任何接口。这可以节省不需要多播的接口和链路上的带宽浪费。

如果两台交换机都启用了 IGMP 侦听,并且您连接了多播查询器或 mrouter,则您不会遇到问题。您可以将其中一台交换机配置为多播查询器来解决问题。


这是网络工程答案的摘录:

思科对问题的解释:

了解问题及其解决方案

默认情况下,Catalyst 交换机启用了 IGMP 侦听。通过 IGMP 侦听,交换机侦听(或侦听)所有端口上的 IGMP 消息。交换机构建了一个 IGMP 侦听表,该表基本上将一个多播组映射到所有请求它的交换机端口。

假设在没有任何事先配置的情况下,接收器 1 和接收器 2 已发出信号,它们打算接收映射到 L2 多播 MAC 地址 01.00.5e.6f.ef.ef 的 239.239.239.239 的多播流。交换机 1 和交换机 2 都在它们的侦听表中为这些接收器创建一个条目,以响应接收器生成的 IGMP 报告。交换机 1 在其表中输入端口 Gigabit Ethernet 2/48,交换机 2 在其表中输入端口 Fast Ethernet 1/0/47。

注意:此时,组播源还没有开始流量,没有一台交换机知道交换机的mrouter端口。

当交换机 1 上的源开始传输多播流量时,交换机 1 已“看到”来自接收器 1 的 IGMP 报告。因此,交换机 1 提供多播输出端口千兆以太网 2/48。但是,由于交换机 2 在 IGMP 侦听过程中“吸收”了来自接收器 2 的 IGMP 报告,因此交换机 1 在千兆以太网 2/46 端口上看不到 IGMP 报告(多播请求)。因此,交换机 1 不会向交换机 2 发送任何多播流量。因此,接收器 2 永远不会收到任何多播流量,即使接收器 2 在同一个 VLAN 中但只是在与多播源不同的交换机上。

出现此问题的原因是,没有 mrouter 的任何 Catalyst 平台都不真正支持 IGMP 侦听。在没有 mrouter 端口的情况下,该机制“崩溃”。如果您想修复此解决方案,您必须让交换机以某种方式了解或知道 mrouter 端口。本文档的解决方案部分解释了该过程。但是,交换机上的 mrouter 端口如何解决这种情况呢?

基本上,当交换机学习或静态知道一个 mrouter 端口时,会发生两件关键的事情:

  • 交换机将 IGMP 报告从接收器“中继”到 mrouter 端口,这意味着 IGMP 报告将发送到多播路由器。交换机不会中继所有 IGMP 报告。相反,交换机只向 mrouter 发送少量报告。就本次讨论而言,报告的数量并不重要。多播路由器只需要知道是否有至少一个接收者对下游的多播仍然感兴趣。为了做出决定,多播路由器接收周期性的 IGMP 报告以响应其 IGMP 查询。
  • 在只有源的多播场景中,没有接收器“加入”,交换机仅将多播流发送到其 mrouter 端口。

当交换机知道它们的 mrouter 端口时,交换机 2 将交换机从接收器 2 收到的 IGMP 报告中继到其 mrouter 端口。此端口是快速以太网 1/0/33。交换机 1 在交换机端口 Gigabit Ethernet 2/46 上获取此 IGMP 报告。从交换机 1 的角度来看,交换机只是收到了另一个 IGMP 报告。交换机将该端口添加到其 IGMP 侦听表中,并开始在该端口上发送多播流量。此时,两个接收器都接收到请求的多播流量,并且应用程序按预期工作。

但是交换机如何识别它们的 mrouter 端口,以便 IGMP 侦听像预期的那样在这样的简单环境中工作?解决方案部分提供了一些答案。

惠普对问题的解释:

当交换机收到 IGMP 加入时,它会接受主机请求并开始转发 IGMP 流量。这意味着未加入组且未连接到路由器或 IGMP 查询器的端口将不会接收组的多播流量。

看来您可以将交换机设置为 IGMP 查询器:

使用交换机作为查询器

查询器操作

IGMP 查询器的功能是轮询启用 IGMP 的 VLAN 中的其他启用 IGMP 的设备,以获取组成员信息。如果 VLAN 中没有其他设备(例如组播路由器)充当查询器,则交换机执行此功能。尽管交换机在启用 IGMP 的 VLAN 中检测到另一个查询器时会自动停止查询器操作,但您也可以使用命令提示符禁用该 VLAN 的查询器功能。

注意正确的 IGMP 操作需要查询器。因此,如果您在交换机上禁用查询器功能,请确保在同一 VLAN 上存在可用的 IGMP 查询器(最好是备用查询器)。

如果交换机成为特定 VLAN 的查询器(例如 DEFAULT_VLAN),随后检测到从同一 VLAN 上的另一台设备传输的查询,则交换机将停止作为该 VLAN 的查询器运行。如果发生这种情况,交换机事件日志会列出一对类似于以下的消息:

I 01/15/01 09:01:13 igmp: DEFAULT_VLAN: Other Querier detected
I 01/15/01 09:01:13 igmp: DEFAULT_VLAN: This switch is no longer Querier

在上述场景中,如果其他设备不再作为默认 VLAN 上的查询器运行,则交换机会检测到这种变化,只要它没有被 VLAN 上的其他 IGMP 查询器抢占,它就可以成为查询器。在这种情况下,交换机事件日志会列出类似以下的消息,表明交换机已成为 VLAN 上的查询器:

I 01/15/01 09:21:55 igmp: DEFAULT_VLAN: Querier Election in process
I 01/15/01 09:22:00 igmp: DEFAULT_VLAN: This switch has been elected as Querier

推荐阅读