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

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            P2P原理的解釋與實現

            關鍵字:P2P NAT? 打洞

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

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

            如果明白了上面的東西,下面進入我們的代碼,在這里解釋一下關鍵部分的實現:

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

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

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

            posted on 2006-09-02 20:30 那誰 閱讀(6383) 評論(2)  編輯 收藏 引用 所屬分類: 網絡編程

            評論

            # re: P2P原理的解釋與實現  回復  更多評論   

            呵 學習學習
            2008-10-08 16:54 | 浪跡天涯

            # re: P2P原理的解釋與實現  回復  更多評論   

            簡單的東西被你說復雜了,估計不懂的人看了你的文章還是不懂.

            你畫個圖就直觀多了
            2008-11-21 13:05 | lipingtababa
            久久国产免费观看精品| 一日本道伊人久久综合影| 无码人妻精品一区二区三区久久久 | 久久精品国产亚洲av影院| 久久国产欧美日韩精品| 99久久精品免费| 精品国产乱码久久久久久人妻 | 久久精品国产亚洲AV忘忧草18| 亚洲精品乱码久久久久久| 精品久久久久久久久中文字幕| 亚洲第一永久AV网站久久精品男人的天堂AV| 无码人妻久久一区二区三区蜜桃| 狠狠色婷婷久久一区二区三区| 大香网伊人久久综合网2020| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 国产精品久久永久免费| 亚州日韩精品专区久久久| 久久精品国产免费| 久久狠狠爱亚洲综合影院| 狠狠色伊人久久精品综合网| 97久久综合精品久久久综合| 久久亚洲AV成人无码软件| 久久久久亚洲爆乳少妇无| 国产精品久久久久影院色| 99精品久久久久久久婷婷| 理论片午午伦夜理片久久 | 久久人妻少妇嫩草AV蜜桃| 青青草国产精品久久久久| 亚洲国产精品久久电影欧美| 国内精品久久久久久麻豆| 2020最新久久久视精品爱| 国产亚洲欧美成人久久片 | 97精品伊人久久久大香线蕉| 久久99国产综合精品| 国内精品伊人久久久久777| 亚洲国产精品无码久久久久久曰 | 国产精品99久久精品| 国产精品禁18久久久夂久 | 少妇久久久久久被弄高潮| 中文字幕日本人妻久久久免费| 久久久久亚洲精品日久生情 |