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

Why are IP_TTL and IP_MULTICAST_TTL separate socket options?

发送UDP组播时可以使用IP_MULTICAST_TTL设置TTL。但否则你会使用 IP_TTL。为什么这两个不同的选项在setsockopt()getsockopt()眼里?有什么情况下单独设置它们有意义吗?

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

这些选项实际上有不同的作用。

设置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)上得到确认。