发送 UDP 多播时,您可以使用IP_MULTICAST_TTL
设置 TTL。但否则你会使用IP_TTL
. 为什么这两个不同的选项在 和 的setsockopt()
眼中getsockopt()
?在任何情况下单独设置它们是有意义的吗?
在我看来,他们最终在 IP 标头中设置了相同的值。
发送 UDP 多播时,您可以使用IP_MULTICAST_TTL
设置 TTL。但否则你会使用IP_TTL
. 为什么这两个不同的选项在 和 的setsockopt()
眼中getsockopt()
?在任何情况下单独设置它们是有意义的吗?
在我看来,他们最终在 IP 标头中设置了相同的值。
这些选项实际上功能不同。
设置IP_MULTICAST_TTL
只影响传出的多播数据报,不影响单播数据报。相反,设置该IP_TTL
选项(至少在 Linux 上)只影响传出的单播数据报。这允许您将一个 TTL 用于多播,一个 TTL 用于单播。
IPv6 也有类似的标志,即IPV6_MULTICAST_HOPS
和IPV6_UNICAST_HOPS
。
最好将多播数据包的 TTL 设置得尽可能低。这可以防止它们被传播得比需要的范围更广,并淹没网络段。这对于单播数据报来说并不是一个真正的问题,因为它们只用于一台机器。
因此,如果您计划从同一个套接字发送多播和单播数据报,使用它可能是有意义的。
此行为在 CentOS 7.2(内核 3.10)和 Ubuntu 16.04(内核 4.4)上得到确认。