代理檢測原理:網站如何用延遲差判斷你的連線經過了代理中轉

部落格 / IP 與隱私

代理檢測原理:網站如何用延遲差判斷你的連線經過了代理中轉

網站用延遲做代理檢測,靠的是同一次訪問裡兩段時間對不上:伺服器從 TCP 連線上量到的往返時間,只覆蓋"代理出口到伺服器"這一段;頁面裡的指令碼量到的往返時間,覆蓋的是"你的裝置到伺服器"的完整路徑。直連時兩者接近,中間多了一層中轉,後者會明顯大於前者。這是一個機率訊號,通常要和 IP 型別、DNS、時區等其他線索一起看,單獨拿出來並不能下結論。

本文是隱私科普,幫你理解自己的網路在別人眼裡是什麼樣子,不討論如何繞過任何平臺的檢測或風控;使用各類服務時請遵守其服務條款和當地法規。

伺服器能量到哪一段延遲?

建立 TCP 連線要三次握手:客戶端發 SYN,伺服器回 SYN-ACK,客戶端再回 ACK。伺服器從發出 SYN-ACK 到收到 ACK 的間隔,就是一次往返時間(RTT)。之後的資料傳輸中,核心也會持續根據確認包更新 RTT 估計值。

要看的是這條 TCP 連線的另一端是誰:

  • 直連時,TCP 的另一端就是你的電腦或手機,伺服器量到的是你到它的往返。
  • 經過代理時,TCP 連線由代理出口發起,伺服器量到的是"代理出口 ↔ 伺服器"的往返。你的裝置到代理之間那一段,伺服器在 TCP 層看不到。

很多 CDN 和邊緣平臺會把這個值暴露給業務程式碼。例如 Cloudflare Workers 的請求物件裡有客戶端 TCP RTT 欄位(request.cf.clientTcpRtt,見 Cloudflare 官方文件),網站不需要自己抓包,就能拿到"連過來的那個 IP 離我多遠"。

瀏覽器裡又能量到哪一段?

頁面載入後,指令碼可以自己計時:連續發幾個小請求(fetch 或 WebSocket 訊息),記錄發出到收到響應的時間,取中位數。這是應用層往返,路徑是:

你的裝置 → 本地網路 → 代理入口 → 代理出口 → 伺服器 → 原路返回

它包含了 TCP 層看不到的那一段,還會多出一些應用層開銷:瀏覽器排程、TLS 記錄處理、代理軟體本身的轉發耗時。

所以網站手裡有兩個數:

測量位置量到的路徑是否包含"裝置到代理"這一段
伺服器 TCP 層代理出口 ↔ 伺服器不包含
瀏覽器應用層裝置 ↔ 代理 ↔ 伺服器包含

為什麼中轉會把差距拉大?

假設一個例子(數字僅作示意):你在上海,代理出口在美國西海岸,伺服器的邊緣節點也在美國西海岸。

  • 伺服器 TCP 層看到:出口和邊緣節點在同一個城市,往返只有幾毫秒。
  • 瀏覽器應用層看到:資料要先從上海跨太平洋到出口,再到伺服器,往返一兩百毫秒。

一邊幾毫秒,一邊一兩百毫秒,這個差距用"應用層開銷"解釋不了。直連的情況下,兩段測的是同一條路徑,差值通常只來自瀏覽器和 TLS 的額外處理,量級小得多。

背後是物理限制:光在光纖裡大約每毫秒走 200 公里,實際線路還要繞路和經過路由器排隊。一個自稱在某城市的 IP,如果從瀏覽器量出的往返遠超這個城市到伺服器的合理範圍,就說明資料在別處"多走了一段"。

一些網站還會做反向推算:已知出口 IP 的地理位置,再用應用層往返估算"真實裝置大概離伺服器多遠"。資料只夠畫一個大致的圈,但圈和 IP 宣稱的位置差太遠,同樣是疑點。

延遲差一定說明在用代理嗎?

不一定。下面這些情況都會讓應用層往返偏大,屬於常見誤判來源:

  • 行動網路和弱 Wi-Fi:空口重傳、訊號切換會讓應用層往返抖動很大,而 TCP 初次握手可能恰好量在空閒時刻。
  • 緩衝區膨脹(bufferbloat):家裡有人在下載大檔案時,路由器佇列塞滿,應用層請求排隊變慢。
  • 企業閘道器、安全軟體:公司出口的透明代理、防毒軟體的 HTTPS 檢查,本身就是一層中轉,會產生和代理類似的特徵,但使用者主觀上並沒有"用代理"。
  • 衛星網路和偏遠地區線路:本身往返就大。
  • 瀏覽器後臺限流:頁面在後臺標籤時,計時器和網路請求可能被降速,測出的值不準。

所以比較認真的檢測方會多測幾次、取中位數,再把延遲差作為一項加權訊號,而不是單獨據此封禁。這也是為什麼同一個網路在不同網站上的檢測結論可能不同,原因和為什麼不同網站測出的 IP 純淨度不一樣類似:樣本、閾值、權重都不一樣。

除了延遲,代理檢測還看哪些訊號?

延遲只是其中一類。實際的代理檢測一般會把下面幾類訊號疊在一起看:

IP 本身的屬性

  • IP 型別和 ASN:出口屬於雲廠商、託管機房,還是家庭寬頻、行動網路。機房段被標記為"可能是代理"的機率天然更高,詳見機房 IP 和家寬 IP 有什麼區別。
  • 信譽記錄:是否出現在公開的代理列表、Tor 出口列表、DNS 黑名單裡。cdnping 的 /ip 彙總了 14 個信譽來源,每項命中都公開權重,計算方式見 IP 純淨度怎麼算。

網路層特徵

  • TCP/IP 協議棧指紋:SYN 包裡的 TTL、視窗大小、選項順序等,會帶出作業系統特徵。瀏覽器 User-Agent 說是 Windows,TCP 指紋卻像 Linux 伺服器,就說明連線可能由另一臺機器發起。cdnping 的 /ip 裡有一項“核心版本反推”(23 項特徵),可以和瀏覽器自報的系統對照著看。
  • MSS/MTU 偏小:隧道協議要加封裝頭,留給資料的空間變小,握手裡通告的 MSS 往往低於常見乙太網值。
  • 多個出口不一致:同一個瀏覽器訪問不同站點時出口 IP 不同,或者 IPv4 和 IPv6 走了不同路徑。雙棧場景的細節可以看 IPv6 代理不生效。

洩漏類訊號

  • DNS 洩漏:網頁裡觸發的 DNS 查詢由哪個解析器發出,和出口 IP 是否在同一個國家或網路。
  • WebRTC 洩漏:瀏覽器透過 STUN 暴露的本地或公網地址,和 HTTP 出口不一致。原理見 /learn/dns-leak-webrtc-leak,各瀏覽器裡的相關設定見 WebRTC 洩漏怎麼關。

環境一致性

  • 時區、語言、字型:系統時區和 IP 所在地對不上、語言列表和地區不搭,單項意義有限,多項疊加時權重會上升。逐項解釋見瀏覽器指紋與環境檢測。

還有一類比較特別:國內網站能透過自家 CDN 拿到你訪問國內資源時的客戶端 IP,和訪問境外資源的出口一對比,就能看出是否分流。這部分在國內網站如何看到你的真實 IP裡單獨講過。

自己怎麼看這項指標?

下面幾步只用來了解自己的網路狀況,不涉及任何繞過手段。

第一步:在 cdnping 上看延遲特徵

開啟 /ip,找到"延遲特徵"一項。它做的事情就是本文描述的對比:瀏覽器裡測得的往返,和 Cloudflare 在邊緣測得的出口 TCP 往返放在一起。看結果時注意三點:

  1. 兩個數分別是多少,差值大約多少。
  2. 頁面保持在前臺,別同時開下載;必要時重新整理兩三次,看結論是否穩定。
  3. 和同一頁面上的 IP 型別、DNS 洩漏、WebRTC 結果對照著看,而不是隻看這一項。

檢測口徑和資料處理方式寫在 /methodology。

第二步:用 curl 粗看連線各階段耗時

在終端裡執行:

curl -o /dev/null -s -w 'dns: %{time_namelookup}s\ntcp: %{time_connect}s\ntls: %{time_appconnect}s\nttfb: %{time_starttransfer}s\n' https://cdnping.org/
  • tcp 減去 dns,大致是你本機看到的一次 TCP 往返。
  • 如果系統層面配置了代理,curl 預設可能會讀取環境變數 https_proxy。這時 TCP 握手是和代理建立的,tcp 那一項會很小,而 tls、ttfb 才反映完整路徑。這正好可以直觀感受"連線另一端是誰"決定了你量到什麼。

想進一步理解連線建立、閘道器往返和首 token 的區別,可以看 AI API 延遲拆解。

第三步:對照下表理解結果

你看到的情況更可能的解釋建議下一步
瀏覽器往返與出口 TCP 往返接近直連,或代理出口離你很近結合 IP 型別確認
瀏覽器往返明顯大於出口 TCP 往返,多次一致存在中轉(個人代理、公司閘道器或安全軟體)確認自己是否在公司網路、是否裝了 HTTPS 檢查類軟體
差值時大時小,結論來回變網路抖動、Wi-Fi 或移動訊號不穩換有線或空閒時段再測
延遲正常但 DNS 或 WebRTC 顯示另一個地區分流或洩漏,與延遲無關看 /learn/split-tunneling 瞭解分流

延遲檢測的侷限

延遲對比只回答一個問題:連過來的 IP 離伺服器多近,你本人離伺服器多遠,兩個距離對不對得上。它只靠計時,不讀取本地資訊,頁面層面沒有開關可關;同時它受網路質量影響大,誤判場景不少。

排查"某個網站覺得我的網路環境異常"時,把 IP 屬性、洩漏、環境一致性和延遲幾類結果放在一起看。完整的自檢順序可以參考開發者網路自檢清單(2026 版)。

相關文章

繼續閱讀