P2P nat 穿透

        最近對p2p(peer to peer)技術十分感興趣,以前用VB的時候曾嘗試過學習穿透NAT方面的知識,很可惜那時候並沒有成功(由於我當時的興趣並不大),現在大學開始教 C++,突然間對p2p技術產生興趣,這有很多方面的原因
        現在基本上很多網絡應用的軟件都涉及p2p技術(QQ,PPS,對戰平臺...),p2p技術旨在於摒棄以前只能從服務器獲得資源的觀念,每臺電腦都是一個peer,都可以從其他peer上獲取自己想要的資源,而同時自己也在向他人共享自己的資源.這裏有一個很大的優勢就是可以極大程度節省服務器的帶寬.
        打個比喻,優酷和pps,一個是基於服務器->客戶端的模式,一個是p2p技術,優酷要想爲用戶提供高清視頻只能通過優化視頻壓縮(例如最新的H.264)和增大自身服務器帶寬.而pps完全不用擔心帶寬問題,只要用戶數量多的話基本上可以滿速觀看視頻. 在這裏在停停,pps採用的是rmvb壓縮封裝,體積比h264flv大上十倍,但是pps依然可以流暢觀看.這就是p2p技術的優勢.
        當然,我感興趣的不是p2p在網絡視頻方面的應用,而是他的穿透NAT的技術,只需要提供一個服務器(當然在p2p下服務端本身可以是客戶端)就能令兩臺或多臺處於不同局域網內的電腦通信.另一方面這也算是我學習C++網絡編程的入門口.
        在中國大部分用戶都使用路由器或交換器之類的其他NAT設備來共享網絡,這使得不同內網的用戶之間的交流變得十分困難,p2p技術的出現確實另其變得可行和簡便.

第二篇:

        首先,在寫這第二篇文章時我對現今的p2p技術的成熟度仍不完全瞭解,基於udp協議的p2p技術可以很確定的說已經完全成熟了,但基於tcp協議的p2p技術是否成熟在我這幾天的搜索資料中仍然未能得知.雖然最近得到了一份通過p2p使用tcp協議傳輸文件的源碼,但其真實性仍然未檢測,由於有許多可能會影響實驗成敗的干擾因素(例如NAT設備類型的不同,其結果可能不同),我想我會在接下來的時間主要去驗證tcp應用於p2p的可行性.

        可能有很多人問,現在不是有很多軟件採用p2p技術傳輸文件麼.這說明tcp用於p2p是可以的.但至少我搜索的資料中很少這方面的消息.我想現在用於文件可靠傳輸有兩個方法(就我知道而言,聽說還有raw等其他方法),一個或許就是tcp,這是傳輸協議上實現的,另一個就是利用udp模仿tcp的確保文件準確完整傳輸的功能(大概是什麼滑動窗口?).

        當然這是我日後的工作,現在我要探討的是我目前的成果,就是基於udp協議的穿透nat的方法. 

        或許還有人不知道NAT是什麼,NAT是英文Network Address Translators的縮寫,翻譯過來就是網絡地址轉化器,爲什麼會出現NAT呢?主要是因爲ipv4提供的全球唯一ip已經日漸枯竭,也就是ipv4提供的(x.x.x.x)的地址已經不足以讓全球每一臺電腦都擁有唯一的ip地址,所以就有NAT的出現(當然,是先出現了NAT纔開始慢慢枯竭,因爲人們已經預料到ip遲早會用完),NAT可使多臺電腦使用同一個全球唯一ip,(當然最近ipv6就要出了).

        而且,類似路由等NAT設備還可以防止內網主機受到外網的攻擊,這也就是我們需要穿透NAT的原因,,因爲路由只允許內網用戶主動連接外網用戶,而不允許外網用戶主動連接內網用戶

        現在按順序講下內網於外網連接的步驟(這是理解穿透NAT的阻礙因素的重要部分!!):

        1.內網用戶(192.168.1.100)(端口:123)向外網用戶(123.123.123.123)(端口:321)發送數據包

        2.數據包經過NAT,NAT將數據包的ip地址改爲外網地址(55.55.55.55),並修改端口爲另一個數,例如:6000

        3,此時的數據包變成這樣: 55.55.55.55: 6000-> 123.123.123.123:321

        4.最後NAT會留下一條記錄,表明如下指向 123.123.123.123:123 -> 55.55.55.55:6000 ->192.168.1.100:321

        需注意的是隻有留下記錄後外網特定方向的數據包(上面第四條的方向)纔可以傳給內網機器,而且這條記錄只能由內網用戶先向外網發送第一個數據包纔可以產生.最重要的是這條記錄只能用於123.123.123.123:123,其他地址發來的數據包NAT是會拋棄掉的! 

        還有一點:就是這條記錄具有生命週期,過了一定時間會自動刪除!

        瞭解到這點就可以知道外網和內網的通訊的十分簡單的,只要內網用戶事先知道服務器的地址,而且先向服務器請求服務就可以建立連接了!

        但是內網與內網的用戶該如何實現通訊??? 試想一下,就算你事先知道對方的外網ip,但是你發過去的消息會被對方NAT拋棄掉,好吧,你說可以兩個人同時向對方發包,但你畫出圖來看看會發現也是實現不了的!

         試想一下,如果clientA和clientB都同時向對方的 520端口發送數據包(當然,兩邊的NAT都會拋棄掉他),雖然兩邊都會留下記錄,但是由於NAT修改了端口號爲某個數,這樣導致下面兩條記錄:

        clientA的NAT: 44.44.44.44:520 -> 55.55.55.55:62000 -> 192.168.1.47:520

        clientB的NAT: 55.55.55.55:520 -> 44.44.44.44:75000 -> 192.168.1.5:520

        這兩條記錄明顯不能使clientA和clientB建立起連接,因爲雙方的NAT都將只接收對方來自520端口的數據包,而對方發送數據包時NAT都會將原始的端口改爲62000,75000(這兩個數是隨機的),這樣當然不會建立起連接!

        再回過來想想,如果有一個處在外網的服務器可以同時記錄下雙方的端口號的話,這樣A與B的通訊不是可以建立了麼!!!!

發佈了28 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章