【发布时间】:2018-03-26 09:15:41
【问题描述】:
发送 UDP 多播时,您可以使用IP_MULTICAST_TTL 设置 TTL。但否则你会使用IP_TTL。为什么setsockopt() 和getsockopt() 眼中这两个不同的选项?有没有什么情况可以分开设置?
在我看来,他们最终在 IP 标头中设置了相同的值。
【问题讨论】:
标签: c sockets multicast ttl setsockopt
发送 UDP 多播时,您可以使用IP_MULTICAST_TTL 设置 TTL。但否则你会使用IP_TTL。为什么setsockopt() 和getsockopt() 眼中这两个不同的选项?有没有什么情况可以分开设置?
在我看来,他们最终在 IP 标头中设置了相同的值。
【问题讨论】:
标签: c sockets multicast ttl setsockopt
这些选项实际上功能不同。
设置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)上得到确认。
【讨论】: