【问题标题】:How to let different processes use different network interfaces?如何让不同的进程使用不同的网络接口?
【发布时间】:2015-05-20 18:12:06
【问题描述】:

我在客户端。有多个网络接口。如何让不同的进程使用不同的网络接口进行通信?由于我想连接到同一台服务器,路由似乎在这里不起作用。此外,connect() 没有像 bind() 那样指定本地地址或接口的参数。

【问题讨论】:

  • 为什么你认为你需要他们对同一个服务器使用不同的接口?是什么让您认为“路由在这里不起作用”?当 bind() 已经这样做时,为什么 connect() 允许您指定本地地址?有什么问题?
  • 我想通过多个网络接口与同一台服务器通信,以利用客户端上的所有带宽。

标签: sockets networking network-programming


【解决方案1】:

如果您的目标是通过并行使用多个网络接口来增加服务器的带宽,那么这可能不是您可以(或不应该)在应用程序级别做的事情。相反,您应该学习Link Aggregation,然后配置您的计算机和网络堆栈以使用它。一旦正常工作,您将自动获得所需的并行化加速,而客户端应用程序无需执行任何特殊操作即可启用它。

【讨论】:

    【解决方案2】:

    "bind() 系统调用经常被误解。它用于 绑定到特定的 IP 地址。仅发往该 IP 的数据包 地址将被接收,并且任何传输的数据包都将携带该地址 IP 地址作为其来源。 bind() 不控制任何关于 传输数据包的路由。例如,如果您绑定到 IP eth0 的地址,但您将数据包发送到 内核的最佳路由出去 eth1,它会愉快地发送数据包 eth1 的源 IP 地址为 eth0。这对于 TCP/IP,数据包可以在到达的途中穿越不相关的网络 目的地。”

    更多信息,例如here.

    这就是为什么你可能误解了 bind() 调用。

    绑定到物理拓扑(到某些特定接口)的适当方法是使用SO_BINDTODEVICE 套接字选项。这是通过setsockopt() 调用完成的。

    【讨论】:

      【解决方案3】:

      Source Policy Routing 可能会有所帮助。

      尝试以下步骤:

      • 使用iptables为来自不同进程的数据包赋予不同的标记。
      • 使用iproute2将带有不同标记的数据包路由到不同的表。
      • 在不同的表中,设置默认路由到不同的上行链路。

      整个过程需要对linux网络有一定的了解。

      以下示例显示了如何通过一个特定的上行链路为用户路由所有流量:http://www.niftiestsoftware.com/2011/08/28/making-all-network-traffic-for-a-linux-user-use-a-specific-network-interface/

      您可以尝试采用类似的方法,通过使用不同的用户运行不同的进程并将流量从一个用户路由到一个上行链路。

      你也可以让进程与不同端口的服务器通信,并通过端口标记流量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-04
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 2021-09-25
        • 2017-03-30
        • 2016-10-26
        相关资源
        最近更新 更多