• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            陳碩的Blog

            Muduo 網(wǎng)絡(luò)編程示例之十:socks4a 代理服務(wù)器

            Muduo 網(wǎng)絡(luò)編程示例之十:socks4a 代理服務(wù)器

            陳碩 (giantchen_AT_gmail)

            Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

            這是《Muduo 網(wǎng)絡(luò)編程示例》系列的第十篇文章,本系列暫告一段落。

            Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

            本文介紹用 muduo 實(shí)現(xiàn)一個簡單的 socks4a 代理服務(wù)器,代碼見 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/

            TCP 中繼器

            在實(shí)現(xiàn) socks4a proxy 之前,我們先寫一個功能更簡單的網(wǎng)絡(luò)程序—— TCP 中繼器 (TCP relay),或者叫做窮人的 tcpdump (poor man's tcpdump)。

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

            relay

            TcpRelay 是我們自己寫的,可以動動手腳。除了記錄通信內(nèi)容,還可以制造延時,或者故意翻轉(zhuǎn) 1 bit 數(shù)據(jù)以模擬 router 硬件故障。

            TcpRelay 的功能(業(yè)務(wù)邏輯)看上去很簡單,無非是把連接 C 上收到的數(shù)據(jù)發(fā)給連接 S,同時把連接 S 上收到的數(shù)據(jù)發(fā)給連接 C。但仔細(xì)考慮起來,細(xì)節(jié)其實(shí)不那么簡單:

            • 建立連接。為了真實(shí)模擬 client,TcpRelay 在 accept 連接 C 之后才向 server 發(fā)起連接 S,那么在 S 建立起來之前,從 C 收到數(shù)據(jù)怎么辦?要不要暫存起來?
            • 并發(fā)連接的管理。上圖中只畫出了一個 client,實(shí)際上 TcpRelay 可以服務(wù)多個 clients,左右兩邊這些并發(fā)連接如何管理,如何防止串話(cross talk)?
            • 連接斷開。Client 和 Server 都可能主動斷開連接。當(dāng) Client 主動斷開連接 C 時,TcpRelay 應(yīng)該立刻斷開 S。當(dāng) Server 主動斷開連接 S 時,TcpRelay 應(yīng)立刻斷開 C。這樣才能比較精確地模擬 Client 和 Server 的行為。在關(guān)閉連接的剎那,又有新的 client 連接進(jìn)來,復(fù)用了剛剛 close 的 fd 號碼,會不會造成串話? 萬一 Client 和 Server 幾乎同時主動斷開連接,TcpRelay 如何應(yīng)對?
            • 速度不匹配。如果連接 C 的帶寬是 100KB/s,而連接 S 的帶寬是 10MB/s,不巧 Server 是個 chargen 服務(wù),會全速發(fā)送數(shù)據(jù),那么會不會撐爆 TcpRelay 的 buffer?如何限速?特別是在使用 non-blocking IO 和 level-trigger polling 的時候如何限制讀取數(shù)據(jù)的速度?

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

            TcpRelay 的實(shí)現(xiàn)很簡單,只有幾十行代碼 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 。這個實(shí)現(xiàn)解決了前三個問題,第四個留給將來吧。

            Socks4a 代理服務(wù)器

            Socks4a 的功能與 TcpRelay 非常相似,也是把連接 C 上收到的數(shù)據(jù)發(fā)給連接 S,同時把連接 S 上收到的數(shù)據(jù)發(fā)給連接 C。它與 TcpRelay 的區(qū)別在于,TcpRelay 固定連到某個 server 地址,而 socks4a 允許 client 指定要連哪個 server。在 accept 連接 C 之后,Socks4a server 會讀幾個字節(jié),以了解 server 的地址,再發(fā)起連接 S。

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

            muduo 的 socks4a 代理服務(wù)器的實(shí)現(xiàn)在 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/socks4a.cc,它也使用了 Tunnel class。與 TcpRelay 相比,只多了解析 server 地址這一步驟。

            muduo 這個 socks4a 是個標(biāo)準(zhǔn)的網(wǎng)絡(luò)服務(wù),可以供 Web 瀏覽器使用(我正是這么測試它的)。

            n:1 與 1:n 連接轉(zhuǎn)發(fā)

            云風(fēng)在《寫了一個 proxy 用途你懂的》中寫了一個 TCP 隧道 tunnel,程序由三部分組成:n:1 連接轉(zhuǎn)發(fā)服務(wù),1:n 連接轉(zhuǎn)發(fā)服務(wù),socks 代理服務(wù)。

            我仿照他的思路,用 muduo 實(shí)現(xiàn)了這三個程序。不同的是,我沒有做數(shù)據(jù)混淆,所以不能用來翻傳說中的墻。

            有興趣的讀者可以把這三個程序級聯(lián)起來試一試。

            Muduo 編程示例系列告一段落

            Muduo 網(wǎng)絡(luò)編程示例》從今年2月初開始寫,到今天正好是四個月,我寫了十一篇博客,基本按計(jì)劃完成了任務(wù)。這個系列暫告一段落。

            這個系列基本涵蓋了 muduo 為編寫單線程服務(wù)端和客戶端 TCP 網(wǎng)絡(luò)程序提供的功能,muduo 的能力不止于此:

            • 多線程,muduo::net::TcpServer 內(nèi)置了一個簡單但適應(yīng)性很強(qiáng)的線程模型。目前博客上的例子涉及的業(yè)務(wù)邏輯很簡單,沒有復(fù)雜的運(yùn)算,瓶頸通常在 IO 上,多線程的優(yōu)勢發(fā)揮不出來。
            • 高級應(yīng)用。比方說用 muduo::net::Channel 配合 signalfd 來處理信號;其他非阻塞網(wǎng)絡(luò)客戶端庫(例如 ZooKeeper 的 C 客戶端,PostgreSQL 的客戶端 libpq)與 muduo EventLoop 的集成。

            以上兩點(diǎn)在以后的文章里會提及,不會明珠暗藏。

            Muduo 在 2010 年 8 月底發(fā)布 0.1.0 版,隨著這個編程示例系列文章的發(fā)表,迄今已發(fā)布了 14 次小升級,下載地址: http://code.google.com/p/muduo/downloads/list

            接下來的計(jì)劃

            接下來,我還會寫一系列博客,目前想到的有:

            1. 談一談我的網(wǎng)絡(luò)編程學(xué)習(xí)經(jīng)驗(yàn)。文章已經(jīng)完成大半,端午節(jié)之后可以發(fā)布。
            2. muduo 設(shè)計(jì)與實(shí)現(xiàn)系列,介紹如何一步步實(shí)現(xiàn)一個非阻塞網(wǎng)絡(luò)庫。代碼已經(jīng)準(zhǔn)備得差不多了,在 https://github.com/chenshuo/recipes/tree/master/reactor
            3. 用 muduo 實(shí)現(xiàn)一些稍微復(fù)雜一些的網(wǎng)絡(luò)程序,比如小規(guī)模的分布式系統(tǒng)。計(jì)劃有:利用 Paxos 算法實(shí)現(xiàn)一個高可用的 in-memory key value 存儲,在此基礎(chǔ)上實(shí)現(xiàn) naming service,然后實(shí)現(xiàn)我以前多次提到的簡單機(jī)群管理系統(tǒng)等等。目前 muduo 的示例程序都是簡單獨(dú)立的網(wǎng)絡(luò)程序,下半年我想多寫一寫由多個程序組成的系統(tǒng),具體談一談分布式系統(tǒng)細(xì)節(jié)設(shè)計(jì)。

            另外,我會逐步把已有的博客文章整理成 PDF 合集,方便下載保存,地址是: http://blog.csdn.net/Solstice/archive/2011/02/24/6206154.aspx

            posted on 2011-06-02 23:02 陳碩 閱讀(2936) 評論(0)  編輯 收藏 引用 所屬分類: muduo

            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類

            隨筆檔案

            相冊

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲人AV永久一区二区三区久久| 久久婷婷五月综合国产尤物app| 久久久久久毛片免费播放| 久久精品国产亚洲AV无码娇色 | 久久亚洲欧美国产精品| 国产精品美女久久久m| 久久九九免费高清视频| 午夜不卡久久精品无码免费| 国产69精品久久久久9999| 亚洲精品乱码久久久久久自慰| 一级做a爰片久久毛片16| 亚洲AV无码久久精品色欲| 久久无码AV中文出轨人妻| .精品久久久麻豆国产精品| 国产午夜福利精品久久| 亚洲狠狠久久综合一区77777| 色综合久久天天综线观看| 久久久精品人妻一区二区三区蜜桃 | 亚洲AV无码久久精品狠狠爱浪潮 | 99久久精品免费看国产| 人人狠狠综合久久88成人| 久久久久亚洲av毛片大| 91精品国产91久久久久久蜜臀| 色综合久久无码五十路人妻| 色综合久久88色综合天天 | 激情久久久久久久久久| 国产A级毛片久久久精品毛片| 久久免费视频观看| 中文字幕久久欲求不满| 9191精品国产免费久久| 国产成人精品久久| 国产毛片久久久久久国产毛片 | 热99re久久国超精品首页| 亚洲欧美日韩久久精品第一区| 久久福利资源国产精品999| 欧美一级久久久久久久大片| 久久最新免费视频| 久久久久精品国产亚洲AV无码| 狠狠色综合网站久久久久久久高清| 久久精品亚洲AV久久久无码| 亚洲伊人久久精品影院|