Surge 原理與實現

ErvinChurch 8年前發布 | 23K 次閱讀 網絡技術 HTTP Cache

來自: https://medium.com/@Blankwonder/surge-原理與實現-8aa3304fb3bb

Surge 原理與實現

為了方便各位購買了 Surge 的用戶更好的理解 Surge 的功能,能夠自己通過靈活修改配置以應對不同的需求,我寫了這篇中文的 Surge 原理與實現供各位參考。

從 Surge 的幾大核心組件分別說起吧:

1. Surge Proxy Server

這是 Surge 最核心的部分,用于處理所有的 HTTP/HTTPS 請求。用 Proxy 去處理請求而不是用 TUN,有很多原因,主要是因為 TUN 是工作在 IP Layer 的:

  • Proxy 可以直接收到包含域名 / URL 的請求,從而使基于域名的規則過濾成為可能(甚至 URL,之后版本可能考慮加入支持)
  • Proxy 可以省略不必要的 DNS 請求,對首次訪問的速度提升相當明顯
  • Surge 的 Proxy 支持全局的 HTTP Connection Keep Alive 機制,極大的減少了 TCP 握手產生的開銷(跨應用間也能共享一個 TCP Connection,但由于內存限制在 iOS 版本上超時時間很短,之后 Mac 版本上的效果會明顯一些)
  • 準確的記錄下每個請求的 header 和 body(從 TCP 層面直接抓,可能會有誤)
  • 使得之后的高級功能(如修改 header,rewrite URL)成為可能
  • 減少了不必要的 IP Packet 相關開銷
  • 這樣 Surge iOS 版本與 Mac 版本可以共享核心代碼

這是 Surge 中最復雜的組件,基本上等同于一個不帶 cache 的 squid,其中的難點一方面是調度問題,另一方面是怎么樣去判斷一個 HTTP 請求是否完成(比如 chunked transfer encoding),本身 HTTP RFC 在這方面就有非常多的細節問題,再加上很多自制的 HTTP Server 不是特別的遵守規范,所以只能通過大量的時間去積累經驗完成。

2. DNS Client

最早的版本中,Surge 也是使用 getaddrinfo 這類的系統調用去進行 DNS 解析的,但是后來越來越不能滿足需求,所以就又造了個輪子,有這些好處:

  • 可以完全自定義 upstream DNS 服務器地址,無視系統設置
  • 可以并發的向多個 DNS 服務器發出 question
  • 可以自定義超時和重發的策略
  • getaddrinfo 等方法本身不支持 cache
  • 為之后的 Local DNS Map 功能提供了基礎

這部分的功能差不多是個 mini 版本的 dnsmasq 吧。由于是自己實現的,以后要做 TCP DNS 或者非 53 端口的支持都是很簡單的事。

3. Surge TUN Interface

最早的版本沒有這個組件,但有部分應用使用的是 HTTP/HTTPS 以外的 TCP 協議 (如 SPDY、IMAP),沒有遵從代理設置,因此無法被 Surge 接管流量。為了解決這個問題,才加入了這個組件。

核心原理就是通過一個 Surge 內部的 TCP stack,將 IP Packet 中的 TCP 數據提取出來,再重新用 Proxy 進行請求(或者直接連接對應的服務器),再將返回的數據重新封裝成 IP Packet。

正如前面提到的,用 TUN 處理請求會有一些問題,最大的問題是,由 TUN Interface 處理的流量,DOMAIN 相關的 Rule 會無效,除非使用了 force-remote-dns 選項。

這是由 TCP/IP 協議的特性所決定的,App 會先發出一個 DNS question,獲取要連接的服務器的 IP 地址,然后直接向這個 IP 地址發起連接,所以有了第 4 個組件。

4. IP Layer DNS Forwarder

這個組件配合 TUN Interface 使用,會將收到 DNS 的 IP Packet,進行簡單改動后直接轉發給 upstream DNS。

但是在轉發前,該組件會檢查需要解析的域名,是否匹配上了帶有 force-remote-dns 選項的規則,如果是,不進行轉發,直接返回一個 240.1.x.x 的 fake IP。當 TUN Interface 收到一個發往 240.1.x.x 的包的時候,反向查出真正的域名是什么,然后直接以域名的形式轉交給 Proxy,避免本地的 DNS 查詢動作。

force-remote-dns 選項主要是為了解決有些域名在本地查詢會有障礙的問題(如公司內網域名),然而因為返回了一個 fake IP,且 Surge 沒有權限去強制清除系統或者應用的 DNS cache,所以在 Surge 關閉后可能導致一些問題,所以請謹慎的只給確實需要的域名開啟這個選項。

其余還有一系列的 homemade 小組件(如各個協議的 client),就不一一描述了,之后想到什么再補充。

所以,看起來 $9.99 超值吧(大霧)

 本文由用戶 ErvinChurch 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!