【问题标题】:Why are IP_TTL and IP_MULTICAST_TTL separate socket options?为什么 IP_TTL 和 IP_MULTICAST_TTL 是单独的套接字选项?
【发布时间】:2018-03-26 09:15:41
【问题描述】:

发送 UDP 多播时,您可以使用IP_MULTICAST_TTL 设置 TTL。但否则你会使用IP_TTL。为什么setsockopt()getsockopt() 眼中这两个不同的选项?有没有什么情况可以分开设置?

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

【问题讨论】:

    标签: c sockets multicast ttl setsockopt


    【解决方案1】:

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

    设置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 驱动的)。
    • 根据我的经验,使用同一个套接字发送单播和多播 UDP 是非常不寻常的。任何想要为多播使用单独的 TTL 的人都可以为其创建单独的套接字。我知道 IP_MULTICAST_TTL 会影响多播数据包,但归根结底,多播和单播的 IP 标头是相同的,那有什么意义呢?也许关键是实现者希望为多播(1)和单播(64)设置不同的默认值……尽管这不是一个好主意(请参阅不知道多播默认 TTL 的人的问题)是 1)。
    • @JohnZwinck 在基于 NAK 的可靠多播传输中,您希望同时执行这两种操作的示例。作为守护进程运行的多播传输的接收者可以通过单播仅向发送者发送 NAK,也可以将它们多播到整个组,并且可以在每个会话的基础上配置该行为。
    • @YurySchkatula 虽然不太可能,但路由器有可能拥有静态多播路由,即使没有明确订阅也允许转发多播。诚然,公共 Internet 上通常不允许多播,但如果您使用特定的多播地址,即限制 TTL 保护措施,则可能会发生这种情况。
    • @JohnZwinck 是的,这两个选项确实在 IP 标头中设置了相同的字段,但是有两个单独的选项允许套接字实现决定何时以及如何发生。
    猜你喜欢
    • 2012-01-04
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2014-04-26
    • 2013-01-24
    • 2011-06-13
    相关资源
    最近更新 更多