2016-03-13 44 views

回答

0

這取決於協議的一些光,這取決於代理,它依賴於透明度是否是一個目標。詳盡地解決所有這些問題將會花費很長時間,所以讓我們考慮一個簡單的案例。

網絡連接是軟件通常由某種句柄(無論是文件描述符還是其他資源)來表示。在POSIX系統上的C程序中,我們可以簡單地保持相互關聯的兩個文件描述符:

struct proxy_session { 
    int client_fd; 
    int server_fd; 
} 

這是裸最低要求。

當客戶端連接時,我們分配其中一個結構。可能有一個協議讓我們知道我們應該使用什麼後端,或者我們可能會做負載平衡和自己挑選後端。

一旦我們選擇了一個後端(無論是通過解析協議還是通過做出一些表單路由決定),我們都會啓動一個連接。簡單地說,代理(作爲中介)只是在客戶端和服務器之間轉發數據包。

我們可以使用任意數量的接口將這兩件事綁在一起。例如,在Linux上,epoll(2)允許我們將指針關聯到文件描述符上的事件。我們可以爲它提供一個指向我們的proxy_session結構的指針,用於客戶端和服務器端。當數據進入這些文件描述符時,我們知道在哪裏映射它。我們必須有一種區分連接句柄的手段(不管它們是文件描述符,指針還是其他表示形式),因此缺少這樣的接口是不夠的。然後,我們可以使用像散列表這樣的結構來查找句柄的目的地。通過簡單地區分彼此之間的連接,並保持一些將兩個連接「粘合」在一起的狀態,就可以找到解決方案。

+0

感謝您的詳細信息。所以基本上這意味着,對於每個傳入客戶端連接代理,它將打開一個到後端服務器的新連接並保持一對一映射。如果它打開到後端的單個連接,那麼除了檢查數據包本身外,沒有辦法區分。 – Sammy

+0

如果您多路複用,代理協議必須提供一些區分手段。請求序列化就是這樣的一種方法。 – dho