• <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>

            那誰的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            P2P原理的解釋與實(shí)現(xiàn)

            關(guān)鍵字:P2P NAT? 打洞

            關(guān)于采用UDP協(xié)議進(jìn)行打洞以進(jìn)行P2P會(huì)話的原理,我本來想寫一篇文章作說明,但是現(xiàn)在已經(jīng)有一篇文章把原理性的東西解釋清楚了,我在這里不再作這部分的重復(fù),可以參見這里:
            P2P 之 UDP穿透NAT的原理與實(shí)現(xiàn)(附源代碼)--http://www.cnpaf.net/Class/hack/0512182034513804825.htm

            下面解釋一下上面的文章中沒有提及或者說我覺得比較欠缺的地方.
            私有地址/端口和公有地址/端口:我們知道,現(xiàn)在大部分網(wǎng)絡(luò)采用的都是NAPT(Network Address/Port Translator)了,這個(gè)東東的作用是一個(gè)對(duì)外的對(duì)話在經(jīng)過NAT之后IP地址和端口號(hào)都會(huì)被改寫,在這里把一次會(huì)話中客戶自己認(rèn)為在使用的IP地址和端口號(hào)成為私有地址/端口,而把經(jīng)過NAPT之后被改寫的IP地址和端口號(hào)稱為公有地址/端口.或者可以這么理解,私有地址/端口是你家里人對(duì)你的昵稱而公有地址/端口則是你真正對(duì)外公開的名字.如何獲得用戶的私用地址/端口號(hào),這個(gè)很簡(jiǎn)單了,而要得到公有地址/端口號(hào)就要在連接上另一臺(tái)機(jī)器之后由那臺(tái)機(jī)器看到的IP地址和端口號(hào)來表示.

            如果明白了上面的東西,下面進(jìn)入我們的代碼,在這里解釋一下關(guān)鍵部分的實(shí)現(xiàn):

            客戶端首先得到自己的私有地址/終端,然后向server端發(fā)送登陸請(qǐng)求,server端在得到這個(gè)請(qǐng)求之后就可以知道這個(gè)client端的公有地址/終端,server會(huì)為每一個(gè)登陸的client保存它們的私有地址/端口和公有地址/端口.

            OK,下面開始關(guān)鍵的打洞流程.假設(shè)client A要向client B對(duì)話,但是A不知道B的地址,即使知道根據(jù)NAT的原理這個(gè)對(duì)話在第一次會(huì)被拒絕,因?yàn)閏lient B的NAT認(rèn)為這是一個(gè)從沒有過的外部發(fā)來的請(qǐng)求.這個(gè)時(shí)候,A如果發(fā)現(xiàn)自己沒有保存B的地址,或者說發(fā)送給B的會(huì)話請(qǐng)求失敗了,它會(huì)要求server端讓B向A打一個(gè)洞,這個(gè)B->A的會(huì)話意義在于它使NAT B認(rèn)為A的地址/端口是可以通過的地址/端口,這樣A再向B發(fā)送對(duì)話的時(shí)候就不會(huì)再被NAT B拒絕了.打一個(gè)比方來說明打洞的過程,A想來B家做客,但是遭到了B的管家NAT B的拒絕,理由是:我從來沒有聽我家B提過你的名字,這時(shí)A找到了A,B都認(rèn)識(shí)的朋友server,要求server給B報(bào)一個(gè)信,讓B去跟管家說A是我的朋友,于是,B跟管家NAT B說,A是我認(rèn)識(shí)的朋友,這樣A的訪問請(qǐng)求就不會(huì)再被管家NAT B所拒絕了.簡(jiǎn)而言之,UDP打洞就是一個(gè)通過server保存下來的地址使得彼此之間能夠直接通信的過程,server只管幫助建立連接,在建立間接之后就不再介入了.

            好了,原理性的東西解釋到這里,附件中有一個(gè)完整的P2P演示程序,命令行模式下,包括server端和client端,在運(yùn)行的時(shí)候首先啟動(dòng)server端,然后打開幾個(gè)client端分別登陸,之后彼此之間就可以相互通信了.程序在本機(jī)上測(cè)試通過,也就是測(cè)試的環(huán)境server和client都是一臺(tái)機(jī)器,還沒有在不同的機(jī)器上測(cè)試過,不知道會(huì)不會(huì)有問題:)
            下載地址:
            http://www.shnenglu.com/Files/converse/P2PDemo.rar
            參考資料:
            1)P2P 之 UDP穿透NAT的原理與實(shí)現(xiàn)(附源代碼)-http://www.cnpaf.net/Class/hack/0512182034513804825.htm
            2)王艷平<<Windows網(wǎng)絡(luò)與通信程序設(shè)計(jì)>>

            posted on 2006-09-02 20:30 那誰 閱讀(6397) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程

            評(píng)論

            # re: P2P原理的解釋與實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            呵 學(xué)習(xí)學(xué)習(xí)
            2008-10-08 16:54 | 浪跡天涯

            # re: P2P原理的解釋與實(shí)現(xiàn)  回復(fù)  更多評(píng)論   

            簡(jiǎn)單的東西被你說復(fù)雜了,估計(jì)不懂的人看了你的文章還是不懂.

            你畫個(gè)圖就直觀多了
            2008-11-21 13:05 | lipingtababa
            久久久无码人妻精品无码| 一级做a爰片久久毛片毛片| 久久夜色精品国产噜噜麻豆 | 精品熟女少妇aⅴ免费久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 狠狠色丁香久久综合五月| 久久这里有精品| 久久伊人精品青青草原高清| 伊人久久国产免费观看视频| 久久精品成人国产午夜| 日韩人妻无码一区二区三区久久| 久久精品国产黑森林| 99久久精品毛片免费播放| 久久最新免费视频| 久久国产精品成人免费| 色诱久久久久综合网ywww| 亚洲精品成人久久久| 国内精品久久久久久久coent| 久久亚洲春色中文字幕久久久| 久久噜噜久久久精品66| 97久久精品人人澡人人爽| 韩国免费A级毛片久久| 丁香色欲久久久久久综合网| 亚洲精品午夜国产va久久| 国产成人无码精品久久久久免费 | 国产综合久久久久久鬼色| 久久无码专区国产精品发布| 久久久久亚洲av成人无码电影| 久久综合综合久久狠狠狠97色88| 亚洲午夜无码久久久久| 亚洲AV日韩精品久久久久久| 欧美成人免费观看久久| 久久笫一福利免费导航| 亚洲AⅤ优女AV综合久久久| 久久久久国产日韩精品网站| 久久人人爽人人澡人人高潮AV | 久久久噜噜噜久久中文字幕色伊伊| 国产精品嫩草影院久久| 久久国产成人| 中文成人无码精品久久久不卡 | 久久久久亚洲AV成人网人人软件 |