Muduo 網路編程樣本(十)socks4a Proxy 伺服器

來源:互聯網
上載者:User

本文介紹用 muduo 實現一個簡單的 socks4a Proxy 伺服器,代碼見 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/ 。

TCP 中繼器

在實現 socks4a proxy 之前,我們先寫一個功能更簡單的網路程式—— TCP 中繼器 (TCP relay),或者叫做窮人的 tcpdump (poor man's tcpdump)。

一般情況下,用戶端程式直接 串連服務端,如下圖。有時候,我們想在 client 和 server 之間放一個中繼器 (relay),把 client 與 server 之間的通訊內容記錄下來。這時用 tcpdump 是最方便省事的,但是 tcpdump 需要 root 權 限,萬一沒有 root 密碼呢?窮人有窮人的辦法,自己寫一個 relay,讓 client 串連 relay,再讓 relay 串連 server,如下圖中的 T 型結構,relay 扮演了類似 proxy 的角色。

TcpRelay 是我們自己寫的,可以動動手腳。除了記錄通訊內容,還可以製造延時,或者故意 翻轉 1 bit 資料以類比 router 硬體故障。

TcpRelay 的功能(商務邏輯)看上去很簡單,無 非是把串連 C 上收到的資料發給串連 S,同時把串連 S 上收到的資料發給串連 C。但仔細考慮起來, 細節其實不那麼簡單:

建立串連。為了真實類比 client,TcpRelay 在 accept 串連 C 之後才向 server 發起串連 S,那 麼在 S 建立起來之前,從 C 收到資料怎麼辦?要不要暫存起來?

並發串連的管理。上圖中只畫出了一個 client,實際上 TcpRelay 可以服務多個 clients,左右兩 邊這些並發串連如何管理,如何防止串話(cross talk)?

串連斷開。Client 和 Server 都可能主動中斷連線。當 Client 主動中斷連線 C 時,TcpRelay 應 該立刻斷開 S。當 Server 主動中斷連線 S 時,TcpRelay 應立刻斷開 C。這樣才能比較精確地類比 Client 和 Server 的行為。在關閉串連的刹那,又有新的 client 串連進來,複用了剛剛 close 的 fd 號碼,會不會造成串話? 萬一 Client 和 Server 幾乎同時主動中斷連線,TcpRelay 如何應對?

速度不匹配。如果串連 C 的頻寬是 100KB/s,而串連 S 的頻寬是 10MB/s,不巧 Server 是個 chargen 服務,會全速發送資料,那麼會不會撐爆 TcpRelay 的 buffer?如何限速?特別是在使用 non-blocking IO 和 level-trigger polling 的時候如何限制讀取資料的速度?

在看 muduo 的實現之前,請讀者思考:如果用 Sockets API 來實現 TcpRelay,如何解決以上這些 問題。

TcpRelay 的實現很簡單,只有幾十行代碼 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/tcprelay.cc,主要邏輯 都在 Tunnel class 裡

http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/tunnel.h 。這個 實現解決了前三個問題,第四個留給將來吧。

Socks4a Proxy 伺服器

Socks4a 的功能與 TcpRelay 非常相似,也是把串連 C 上收到的資料發給串連 S,同時把串連 S 上收到的資料發給串連 C。它與 TcpRelay 的區別在於,TcpRelay 固定連到某個 server 地址,而 socks4a 允許 client 指 定要連哪個 server。在 accept 串連 C 之後,Socks4a server 會讀幾個位元組,以瞭解 server 的地 址,再發起串連 S。

Socks4a 的協議非常簡單,請參考維基百科 http://en.wikipedia.org/wiki/SOCKS#SOCKS_4a 。

muduo 的 socks4a Proxy 伺服器的實現在 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/socks4a.cc,它也使用了 Tunnel class。與 TcpRelay 相比,只多瞭解析 server 地址這一步驟。

muduo 這個 socks4a 是個標準的網路服務,可以供 網頁瀏覽器使用(我正是這麼測試它的)。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。