使用 TTL 加入多播组

问题描述

我使用的是 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

Time to live: 1

解决方法

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

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

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