【问题标题】:Difference binding to INADDR_ANY and a specific IP绑定到 INADDR_ANY 和特定 IP 的差异
【发布时间】:2013-09-17 10:37:51
【问题描述】:

我对绑定套接字时 INADDR_ANY 的使用和后果感到困惑。当然,INADDR_ANY 监听所有本地接口。我的问题是这会产生什么后果。

我记得读过绑定到特定 IP 地址允许内核处理多路分离,但无法再找到引用。

使用 INADDR_ANY 会产生这种后果,还是我只是从所有本地 IP 接收数据?使用各种装订有什么好处和问题?

讨论此问题的其他问题:

bind with INADDR_ANY

Question about INADDR_ANY

编辑:找到参考。 It's from Unix Network Programming (Stevens)

绑定非通配符 IP 地址的一个优点是 将给定的目标 IP 地址多路分解到给定的服务器 然后由内核完成该过程。

这到底是什么意思?

【问题讨论】:

  • 如果你有一个 TCP 服务器,在一台有四个网络接口卡的计算机上运行,​​每个卡在不同的网络上,并且你想监听来自所有网络的连接,你宁愿每个创建四个套接字绑定到单独的网络,或者使用一个套接字并使用INADDR_ANY绑定到所有?
  • 好吧,如果它没有任何性能或其他可能产生负面影响的后果,我想绑定所有这些。该问题试图找出是否存在此类后果。
  • 至于解复用,无论如何都必须完成,要么由您使用select等,要么由内核自动完成(如果您使用select或类似的,它将完成无论如何由内核)。
  • 找到了参考,不确定它是否改变了什么。
  • 性能不是这里的问题。如果有任何区别,我会说您手动多路复用连接会更慢。这里的问题是您对程序有什么要求:它应该只接收来自单个网络的连接吗?在这种情况下,仅绑定到该网络。它应该接收来自所有网络的连接吗?绑定到INADDR_ANY。它应该只接收来自一些网络的连接吗?然后由您决定您认为最好的方法,但性能不会成为问题。

标签: c sockets


【解决方案1】:

绑定到特定接口仅在非常特殊的情况下使用,当应用程序需要“知道”本地 IP 地址和即时网络布局时。路由守护程序可能是最好的例子。

另一个更简单的示例:如果您有一台多宿主计算机(即一台具有多个 Internet 连接的计算机,可能是不同的 ISP),您可以绑定到特定接口以确保连接通过给定的连接。分别绑定到每个网络接口,应用程序可以检测链接断开等。

需要“知道”本地 IP 地址的协议(臭名昭著的例子:FTP、SIP、UPnP)的实现倾向于将套接字绑定到特定接口。 (我认为它们是糟糕的协议,因为它们违反了传输层和应用层之间的隔离)。

除了这些情况外,绑定到特定接口通常是过度设计,因为地址和接口可能会改变,程序必须检测这些条件以更新相应的套接字。

【讨论】:

    【解决方案2】:

    您将无法衡量使用特定 IP 或所有 IP 之间的任何性能差异。您可能希望根据应用程序的需要使用特定的连接...例如,如果您知道永远不应该从面向外部的 IP 建立(合法)连接,则您不希望接收来自它的输入,因为安全原因。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2011-11-28
      • 1970-01-01
      • 2012-03-14
      • 2012-04-16
      • 2021-04-06
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多