
所以我了解基本代理,以及它們如何透明地將連接轉發到目的地。我只是無法理解連結代理是如何工作的。
例如我有這個鏈:proxy1 -> proxy2 -> proxy3 -> proxy4 -> destination
。
與普通的單一代理一樣,我們的請求被發送到代理,然後代理將其轉發到目的地,並發迴回應。但在代理鏈中,如何proxy1
知道它必須將請求轉發到proxy2
等等,而不是直接轉發到目的地?
是否是因為我們發送到代理鏈的請求中存在某種標頭,它適當地告訴代理將請求轉發到下一個代理?
答案1
我認為這是關於“CONNECT”HTTP 方法。
在此機制中,用戶端請求 HTTP 代理伺服器將 TCP 連線轉送至所需的目的地。然後,伺服器繼續代表客戶端建立連線。伺服器建立連線後,代理伺服器將繼續代理往返客戶端的 TCP 流。請注意,只有初始連線請求是 HTTP - 此後,伺服器僅代理已建立的 TCP 連線。
最後一句話是關鍵。您要求proxy1
代理連接到proxy2
.然後接下來的所有內容都會轉到proxy2
through proxy1
,它不再解釋,因此您要求代理到,proxy3
並且該請求被捕獲並解釋proxy2
。下一個 CONNECT 請求(代理到proxy4
)將通過proxy1
和proxy2
,它將被proxy3
- 解釋,依此類推。鏈中的每個代理都會解釋正好一個CONNECT請求,然後就變透明了。
透過初始資料包序列正確設定所有代理程式後,任何使用雙向 TCP 連線的內容都可以透過 CONNECT 隧道傳遞。
當心
並非所有 HTTP 代理伺服器都支援此功能,即使支援的伺服器也可能會限制該行為。
最後注意:在實驗時,如果您執行的程式使用 GET 而不是 CONNECT,您可能會在連結代理時遇到問題。 GET 不允許鏈接,這已被覆蓋這裡。您對代理連結的困惑可能是因為您更熟悉(即您認為的)GET 機制。