代理檢測原理:網站如何用延遲差判斷你的連線經過了代理中轉
網站用延遲做代理檢測,靠的是同一次訪問裡兩段時間對不上:伺服器從 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 往返放在一起。看結果時注意三點:
- 兩個數分別是多少,差值大約多少。
- 頁面保持在前臺,別同時開下載;必要時重新整理兩三次,看結論是否穩定。
- 和同一頁面上的 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 版)。