2012-11-27 18 views
4

我在客戶端。有多個網絡接口。我如何讓不同的進程使用不同的網絡接口進行通信?由於我想連接到同一臺服務器,路由在這裏似乎不起作用。另外,connect()不具有用於指定本地地址或接口的參數,如bind()所做的那樣。如何讓不同的進程使用不同的網絡接口?

+3

爲什麼你認爲你需要他們使用不同的接口到同一臺服務器?是什麼讓你覺得'路由不在這裏工作'?爲什麼connect()允許你在bind()已經這樣做時指定一個本地地址?問題是什麼? – EJP

+0

我想通過多個網絡接口與同一服務器進行通信,以利用客戶端上的所有帶寬。 – Aerodonkey

回答

6

如果您的目標是通過並行使用多個網絡接口來增加服務器的帶寬,那麼在應用程序級別上可能(或應該)做的事情可能不是這樣。相反,您應該研究Link Aggregation,然後配置您的計算機和網絡堆棧以使用它。一旦這個工作正常,你就可以自動獲得你想要的並行化速度,而不需要客戶端應用程序做任何特殊的事情來啓用它。

4

「的bind()系統調用時經常被誤解。它被用來 綁定到特定IP地址,只發往該IP 地址將被接收的數據包,和任何傳輸的數據包將攜帶 IP地址作爲他們的來源,bind()不控制任何有關傳輸數據包的路由,例如,如果你綁定了eth0的IP地址,但你發送了一個數據包到內核的最佳路由出去的目的地eth1,它會很高興地將數據包eth0和eth0的源IP地址發送出去,這對於TCP/IP是 完全有效,其中pac Kets可以在去往目的地的 的途中穿越不相關的網絡。「

更多資料例如here

這就是爲什麼你可能會誤解bind()調用。

綁定到物理拓撲(適用於某些特定接口)的適當方法是使用SO_BINDTODEVICE套接字選項。這是通過撥打setsockopt()來完成的。

2

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/

你可以嘗試通過從一個用戶運行不同的用戶和流量路由的不同過程的一個上行遵循類似的方法。

此外,您可以讓進程與具有不同端口的服務器進行通信,並通過端口標記流量。

相關問題