2011-11-04 96 views
0

大多數代理服務器執行作業將數據轉發到適當的「真實」服務器。但是,我正在設計一個分佈式系統,其中當「代理」接收到TCP/IP套接字連接時,遠程系統實際上是連接到代理提名的真實服務器。所有後續數據從遠程服務器流向真實服務器。套接字連接重新路由

那麼是否有可能「轉發」套接字連接請求,以便遠程系統與真實服務器連接?

(我現在假設遠程系統沒有進一步的工作,即代理無法通過發送實際服務器的IP地址和遠程連接來響應連接。)

這將在香草Windows(不是服務器)下,所以不能使用TCPCP等狡猾的東西。

回答

-1

聽起來像路由問題,比TCP/IP低一層;
你實際上是在尋找ARP like proxy: 我說你需要管理ARP報文,chekcing的ARP請求:

CLIENT - > WHOIS PROXY.MAC
PROXY - > PROXY.IP是SERVER.IP

然後通過TCP/IP從客戶端到服務器的正常套接字連接。

+0

我不明白這與ARP有什麼關係。 ARP用於解析*本地* IP地址的MAC地址。當你想選擇一個特定的*互聯網* IP地址時,這是沒用的 - 這可以通過路由器來完成,而不涉及ARP。 –

0

我假設你的「遠程系統」是啓動連接嘗試的那個,即代理的客戶端。

如果我得到這個權利:當「遠程系統」想要連接某個地方時,您希望「代理服務器」決定連接將在哪裏真的去(「真正的服務器」)。做出決定後,您不希望進一步涉及代理服務器 - 連接的數據不應該通過代理,而是直接在「遠程系統」和「真實服務器」之間。

問題是,如果你想連接到真正直接,「遠程系統」 必須知道IP地址的「真正的服務器」的,反之亦然。

(我假設的,沒有什麼可以進一步與 完成遠程系統的時刻。即代理無法連接通過 發送實際服務器的IP地址和遠程連接 迴應)

就像我說的,不可能的。爲什麼讓「代理」發回實際的IP地址是個問題?

它是否安全 - 您想確保連接真的去哪裏代理想要?如果是這樣的話,你沒有選擇 - 你必須妥協。代理可以轉發所有數據,並知道數據在哪裏發生,也可以讓客戶端自行連接,但您無法控制連接的位置。

只要您完全控制整個網絡,大部分網絡問題都可以解決。在這裏,例如,您可以在「遠程系統」和「真實客戶端」之間的路徑上使用路由器,以確保連接是直接的,並且它代表代理需要的地方。但是這很複雜,在實踐中可能不是一個選項(因爲你可能無法控制這些路由器)。

妥協可能是在網絡周圍分佈幾個「中繼服務器」,它們將轉發連接,而​​不是讓實際的代理服務器轉發它們。當一個代理做出決定時,它會找到最好的(最接近的)中繼服務器,告訴它有關連接,然後命令客戶端連接到中繼服務器,這可以確保連接到代理希望去的地方。

+0

我把約束放在遠程客戶端上的原因是它是一個硬件,而不是一臺計算機,因此固件中的固定連接策略可能會或可能無法更新。我的問題是「如果這樣的話,有沒有辦法解決這個問題?」你在說「不」。對我來說這是有用的信息。 正在解決的問題的一部分是創建一個分佈式系統,以便我們可以擴展我們處理的連接數量。傳統代理成爲數據瓶頸和單點故障。我們的系統需要更好的可擴展性和健壯性。 –

+0

那麼,如果你把代理放到遠程客戶端(例如同一個局域網),它應該不成問題。我想你會有多個代理(分佈式的,對吧?),這應該不成問題。 –

+0

遠程客戶端是移動設備(不是電話,但他們可能會在專用網絡上通話GPRS),因此它不能局域網。 –

0

可能有這樣做的方法,但您需要使用Windows驅動程序來實現它。當連接來自localhost之外的IP時,我還沒有嘗試過,但它可能工作。

看看NetFilter SDK。有一個試用版可以完全實現100000個TCP和UDP連接。另一種可能性是自己編寫一個Windows驅動程序,但這不是微不足道的。

http://www.netfiltersdk.com

基本上它的工作原理如下:

1)創建從NF_EventHandler繼承的類。在那裏你可以提供你自己的方法實現,比如tcpConnectRequest,讓你可以在別的地方重定向TCP連接。

2)通過調用nf_init來初始化庫。這提供了驅動程序和代理之間的鏈接,因爲您向其提供了NF_EventHandler實現的實例。

還有一些示例程序讓你看到發生重定向。例如,重定向從進程ID 214 127.0.0.0:8081在端口80的連接,則可以運行:

TcpRedirector.exe -p 80 -pid 214 -r 127.0.0.1:8081

爲您的代理,這將使用如下:

1)從您的客戶端應用程序連接到代理。

2)連接請求被NetFilterSDK(tcpConnectRequest)攔截,連接端點被修改爲連接到代理選擇的服務器。這是至關重要的一點,因爲你的連接來自外部,這是可能無法工作的部分。

+0

對此稍加思考後,我的方法將無法使用。 NetFilter SDK API將僅攔截從驅動程序所在機器發出的TCP/UDP連接請求。所以,當您從代理外部連接時,我懷疑連接是否可以修改。所以你必須改用透明代理。 – rushman