为什么IP_TTL和IP_MULTICAST_TTL是单独的套接字选项?

Joh*_*nck 5 c sockets multicast ttl setsockopt

发送UDP多播时,您可以使用IP_MULTICAST_TTL设置TTL.但否则你会用IP_TTL.为什么这两种不同的选择在setsockopt()getsockopt()?是否有任何情况下单独设置它们是否有意义?

在我看来,他们最终在IP头中设置了相同的值.

dbu*_*ush 7

这些选项实际上的功能不同

设置IP_MULTICAST_TTL仅影响传出的多播数据报,而不影响单播数据报.相反,设置IP_TTL选项(至少在Linux上)仅影响传出的单播数据报.这允许您使用一个TTL进行多播,使用一个TTL进行单播.

IPv6有类似的标志,即IPV6_MULTICAST_HOPSIPV6_UNICAST_HOPS.

最好将多播数据包的TTL设置得尽可能低.这可以防止它们被广泛传播到比需要更广泛的范围并充斥网络段.对于单播数据报而言,这不是一个真正的问题,因为它们仅用于单个机器.

因此,如果您计划从同一个套接字发送多播和单播数据报,则使用它可能是有意义的.

在CentOS 7.2(内核3.10)和Ubuntu 16.04(内核4.4)上确认了这种行为.

  • 我不能同意多播 TTL 的“尽可能低”。事情是:多播不是广播,所以如果没有人在这里订阅它,那么就不会发出数据包。同时,也可以让多网段可访问的组播组到达感兴趣的用户。再说一次:多播不是广播(尽管它们都是 UDP 驱动的)。 (2认同)