我在客户端。有多个网络接口。如何让不同的进程使用不同的网络接口进行通信?由于我想连接到同一台服务器,路由似乎在这里不起作用。此外,connect()
没有参数来指定本地地址或接口bind()
。
3 回答
如果您的目标是通过并行使用多个网络接口来增加服务器的带宽,那么这可能不是您可以(或不应该)在应用程序级别做的事情。相反,您应该研究Link Aggregation,然后配置您的计算机和网络堆栈以使用它。一旦正常工作,您将自动获得所需的并行化加速,而客户端应用程序无需执行任何特殊操作即可启用它。
“bind() 系统调用经常被误解。它用于绑定到特定的 IP 地址。只有发往该 IP 地址的数据包才会被接收,并且任何传输的数据包都将以该 IP 地址作为其源。bind() 确实对传输数据包的路由没有任何控制。例如,如果您绑定到 eth0 的 IP 地址,但您将数据包发送到内核的最佳路由到 eth1 的目的地,它会很高兴地将数据包发送到 eth1 并带有eth0 的源 IP 地址。这对于 TCP/IP 非常有效,其中数据包可以在到达目的地的途中穿越不相关的网络。
更多信息,例如这里。
这就是为什么您可能误解了 bind() 调用。
绑定到物理拓扑(到某些特定接口)的适当方法是使用SO_BINDTODEVICE
套接字选项。这是通过setsockopt()
调用完成的。
Source Policy Routing
可能会有所帮助。
尝试以下步骤:
- 用于
iptables
为来自不同进程的数据包赋予不同的标记。 - 用于
iproute2
将具有不同标记的数据包路由到不同的表。 - 在不同的表中,将默认路由设置为不同的上行链路。
整个过程需要对linux网络有一定的了解。
下面是一个示例,展示了如何通过一个特定的上行链路为用户路由所有流量:http: //www.nifiestsoftware.com/2011/08/28/making-all-network-traffic-for-a-linux-user-使用特定网络接口/
您可以尝试通过使用不同的用户运行不同的进程并将流量从一个用户路由到一个上行链路来遵循类似的方法。
您还可以让进程与具有不同端口的服务器通信,并按端口标记流量。