【问题标题】:JoinMulticastGroup with TTL使用 TTL 加入多播组
【发布时间】:2021-03-22 22:33:11
【问题描述】:

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

这是我的代码

        UdpClient udpClient = new UdpClient();
        // Creates an IPAddress to use to join and drop the multicast group.
        IPAddress multicastIpAddress = IPAddress.Parse("239.192.16.107");
        udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 10);
        udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
        udpClient.Ttl = 10;
        // The packet dies after 10 router hops.
        udpClient.JoinMulticastGroup(multicastIpAddress, 10);

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

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

更新: 我把 TTL 设置为 10,Wireshark 还是显示 TTL=1

【问题讨论】:

  • 我不确定您在加入多播组后是否调用 connect。做“加入”后,你是否直接进入“接收”模式。对于 TTL,我会从 10 或 20 开始。
  • 如果您将 TTL 设置为 10,然后在 wireshark 中看到 8 - 您的“pc”在到达 wireshark 之前将其递减 2。
  • 是的,加入后我有权接收模式。我不打算发送任何东西。
  • 我尝试了 TTL=10 和 20,但在 Wireshark 中都显示 TTL=1。我只是把它的截图放在原帖中
  • 只是我的直觉,在你的代码中有这一行 client.Connect(destEP); “禁用”连接上的多播。如果您可以设置一个更受控制的测试,这将有助于消除特定于环境的设置,那么您就可以信任您的代码并解决真正的问题。

标签: c# multicast multicastsocket igmp


【解决方案1】:

指定的 TTL 仅适用于传出的多播数据包。来自备注下的Microsoft Docs

timeToLive 参数指定多播数据报在被丢弃之前允许的路由器跃点数。

IGMP 消息的 TTL 始终为 1,因为它们只需要被本地路由器接收。然后,路由器将根据需要将自己的消息发送到其他路由器。详情请见https://networkengineering.stackexchange.com/questions/9636/why-ttl-value-1-in-igmp

【讨论】:

  • 您能否解释一下如果应用程序想要加入距离几跳远的多播组,事情是如何工作的?我们是否需要多个组播路由器并配置组播路由器来中继 IGMP 数据包?
  • @LexL 路由器不中继 IGMP。他们使用自己的内部协议来管理多播路由。但是是的,需要设置中间的路由器以允许多播转发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多