Protocols

在 HTTP、HTTPS、SOCKS4 與 SOCKS5 Proxy 之間做選擇

3 min read Published Updated 540 words

標示為「代理」的四種協定除了名稱之外幾乎沒有共通點。HTTP 代理會解析第七層並改寫標頭;SOCKS 代理則完全不會讀取你的流量。這個區別決定了哪種代理適合瀏覽、爬蟲以及原始隧道傳輸。

HTTP 代理

HTTP 代理預期使用 HTTP 語義。它會開啟請求、讀取 URL、可以附加像 ViaX-Forwarded-For 這類標頭,並拒絕任何非有效 HTTP 請求的內容。瀏覽器、curl 以及大多數爬蟲函式庫預設使用 HTTP 代理,因為設定幾乎零成本——只需設定一個環境變數或傳遞一個旗標。

這種簡潔性的代價是可見性。代理會看到完整的 URL,包括路徑與查詢字串,而在明文 HTTP 中它也會看到請求主體。快取代理可以改寫回應;透明代理則可以移除 Cookie。請將任何 HTTP 代理視為擁有完整權限的中介者,且絕不要透過明文傳送憑證。

HTTPS 代理與 CONNECT 方法

「HTTPS 代理」這個標籤有點誤導。它指的是額外實作了 CONNECT 方法的 HTTP 代理。CONNECT 告訴代理開啟一條到目標主機的原始 TCP 隧道,並在雙向傳輸位元組;接著客戶端與目的地會協商 TLS,彷彿代理不存在一樣。代理只會看到目的地主機與埠號,以及位元組的總量,但看不到酬載。

因此,「支援 HTTPS」的代理是指支援隧道傳輸 TLS 的代理,而不是本身透過 TLS 運作的代理。從你的機器到代理之間的連線可以獨立地使用明文或加密。如果你在意這段連線的保護,請使用 SOCKS5-over-TLS 實作,或是有公開 TLS 端點的付費商業代理。

SOCKS4

SOCKS4 是 1994 年的最低標準:僅限 TCP、僅限 IPv4、無 UDP、無 IPv6、無認證、代理不解析主機名稱。交握過程為六個位元組加上一個位元組的回應碼。它之所以仍在實際環境中存在,是因為該協定非常小,幾乎任何支援 TCP 的工具都能正確實作。如果某個列表標榜 SOCKS4,預期它只提供到 IPv4 位址的原始 TCP 轉發——除此之外別無其他。

SOCKS5

SOCKS5 定義於 RFC 1928(1996),是大多數現代工具所使用的版本。它新增了 UDP 轉發、IPv6 位址、GSSAPI 認證,以及可選擇在代理端而非客戶端解析主機名稱。由於 SOCKS5 不對上層的應用層做任何假設,因此對於非 HTTP 的工作負載(如 SSH、IRC、BitTorrent、自訂 RPC)來說,它是最靈活的選擇。

效能與開銷

SOCKS 代理的每次請求開銷較低,因為它們不解析任何內容。HTTP 與 HTTPS 代理則在每次連線時付出完整請求解析的代價。對於 CONNECT 內部單一長效 TLS 工作階段而言,差異微不足道。但對於數千個短請求,且代理每次都要開啟新連線的情況,SOCKS5 有明顯優勢——通常解析路徑每次請求可節省 2–5 毫秒。

匿名性:實務觀點

一個未移除你標頭的 HTTP 代理可能會透過 ViaX-Forwarded-ForForwarded 洩漏你的客戶端 IP。SOCKS 代理沒有這類標頭,因為它們根本沒有標頭的概念。這與其說是匿名功能,不如說是缺乏洩漏面。在 CONNECT 隧道傳輸的 HTTPS 內部,目的地只會看到 TLS 交握,因此代理端任何 HTTP 層級的洩漏都無關緊要。

埠號慣例

你會在目錄中看到這些:80808031288888 用於 HTTP;443 用於明確支援 CONNECT 的端點;1080 用於 SOCKS。許多提供者會暴露非標準的高埠(高於 10,000)以規避隨意的埠號掃描。埠號本身與品質無關——它只表示營運者選擇暴露什麼。