<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 33,  comments - 70,  trackbacks - 0

    P2P之UDP穿透NAT的原理與實(shí)現(xiàn) - 增強(qiáng)篇(附修改過的源代碼)


    ------------------------------------------------------------------------------------------------------------

    NAT(The IP Network Address Translator) 的概念和意義是什么?

    NAT, 中文翻譯為網(wǎng)絡(luò)地址轉(zhuǎn)換。具體的詳細(xì)信息可以訪問RFC 1631 - http://www.faqs.org/rfcs/rfc1631.html, 這是對(duì)于NAT的定義和解釋的最權(quán)威的描述。網(wǎng)絡(luò)術(shù)語都是很抽象和艱澀的,除非是專業(yè)人士,否則很難從字面中來準(zhǔn)確理解NAT的含義。

    要想完全明白NAT 的作用,我們必須理解IP地址的兩大分類,一類是私有IP地址,在這里我們稱作內(nèi)網(wǎng)IP地址。一類是非私有的IP地址,在這里我們稱作公網(wǎng)IP地址。關(guān)于IP地址的概念和作用的介紹參見我的另一篇文章: http://hwycheng.blogchina.com/2402121.html

    內(nèi)網(wǎng)IP地址: 是指使用A/B/C類中的私有地址, 分配的IP地址在全球不懼有唯一性,也因此無法被其它外網(wǎng)主機(jī)直接訪問。
    公網(wǎng)IP地址: 是指具有全球唯一的IP地址,能夠直接被其它主機(jī)訪問的。

    NAT 最初的目的是為使用內(nèi)網(wǎng)IP地址的計(jì)算機(jī)提供通過少數(shù)幾臺(tái)具有公網(wǎng)的IP地址的計(jì)算機(jī)訪問外部網(wǎng)絡(luò)的功能。NAT 負(fù)責(zé)將某些內(nèi)網(wǎng)IP地址的計(jì)算機(jī)向外部網(wǎng)絡(luò)發(fā)出的IP數(shù)據(jù)包的源IP地址轉(zhuǎn)換為NAT自己的公網(wǎng)的IP地址,目的IP地址不變, 并將IP數(shù)據(jù)包轉(zhuǎn)發(fā)給路由器,最終到達(dá)外部的計(jì)算機(jī)。同時(shí)負(fù)責(zé)將外部的計(jì)算機(jī)返回的IP數(shù)據(jù)包的目的IP地址轉(zhuǎn)換為內(nèi)網(wǎng)的IP地址,源IP地址不變,并最 終送達(dá)到內(nèi)網(wǎng)中的計(jì)算機(jī)。
    ????????????????????????????????????????????????
    ??????? ----------------------?????????????????????????? ----------------------??????????????
    ??????? | 192.168.0.5??????? |? Internat host??????????? | 192.168.0.6??????? |? Internat host
    ??????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????? ^ port:2809????????????????????????????????????? ^port: 1827???????????????????????????
    ??????????????? |??????????????????????????????????????????????? |???????????????????????????
    ??????????????? V??????????????????????????????????????????????? V???????????????????????????
    ??????? ----------------------?????????????????????????? ----------------------??????????????
    ??????? | 192.168.0.1??????? | NAT device??????????????? | 192.168.0.2??????? | NAT device???
    ??????? | 61.51.99.86??????? |?????????????????????????? | 61.51.77.66??????? |??????????????
    ??????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????? ^??????????????????????????????????????????????? ^???????????????????????????
    ??????????????? |??????????????????????????????????????????????? |???????????????????????????
    ??????????????? V port:80??????????????????????????????????????? V port: 80??????????????????????????
    ??????? ----------------------?????????????????????????? ----------------------??????????????
    ??????? | 61.51.202.88?????? | Internet host???????????? | 61.51.76.102?????? | Internet host
    ??????? ----------------------?????????????????????????? ----------------------??????????????
    ???????????????????????????????????????????????????????????
    ????????????????????????????? 圖一: NAT 實(shí)現(xiàn)了私有IP的計(jì)算機(jī)分享幾個(gè)公網(wǎng)IP地址訪問Internet的功能。
    ?????????????????????????????
    隨 著網(wǎng)絡(luò)的普及,IPv4的局限性暴露出來。公網(wǎng)IP地址成為一種稀缺的資源,此時(shí)NAT 的功能局限也暴露出來,同一個(gè)公網(wǎng)的IP地址,某個(gè)時(shí)間只能由一臺(tái)私有IP地址的計(jì)算機(jī)使用。于是NAPT(The IP Network Address/Port Translator)應(yīng)運(yùn)而生,NAPT實(shí)現(xiàn)了多臺(tái)私有IP地址的計(jì)算機(jī)可以同時(shí)通過一個(gè)公網(wǎng)IP地址來訪問Internet的功能。這在很大程度上暫 時(shí)緩解了IPv4地址資源的緊張。

    NAPT 負(fù)責(zé)將某些內(nèi)網(wǎng)IP地址的計(jì)算機(jī)向外部網(wǎng)絡(luò)發(fā)出的TCP/UDP數(shù)據(jù)包的源IP地址轉(zhuǎn)換為NAPT自己的公網(wǎng)的IP地址,源端口轉(zhuǎn)為NAPT自己的一個(gè)端 口。目的IP地址和端口不變, 并將IP數(shù)據(jù)包發(fā)給路由器,最終到達(dá)外部的計(jì)算機(jī)。同時(shí)負(fù)責(zé)將外部的計(jì)算機(jī)返回的IP數(shù)據(jù)包的目的IP地址轉(zhuǎn)換內(nèi)網(wǎng)的IP地址,目的端口轉(zhuǎn)為內(nèi)網(wǎng)計(jì)算機(jī)的 端口,源IP地址和源端口不變,并最終送達(dá)到內(nèi)網(wǎng)中的計(jì)算機(jī)。

    ????????????????????????????????????????????????
    ??????????????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????? | 192.168.0.5??????? |? Internat host??????????? | 192.168.0.6??????? |? Internat host
    ??????????????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????????????? port: 2809????? ^?????????????????? ^ port: 1827
    ???????????????????????????????????????? \???????????????? /
    ????????????????????????????????????????? v?????????????? v????????????????????????????
    ??????????????????????????????????????? ----------------------???????????
    ??????????????????????????????????????? | 192.168.0.1??????? | NAT device
    ??????????????????????????????????????? | 61.51.99.86??????? |???????????
    ??????????????????????????????????????? ----------------------?????????????????????????????????
    ??????? map port:9882 to 192.168.0.5:2809 ^????????????? ^ map port: 9881 to 192.168.0.6:1827
    ???????????????????????????????????????? /??????????????? \
    ???????????????????????????? port:80??? v????????????????? v??? port:80????????????????????????
    ??????????????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????? | 61.51.202.88?????? | Internet host???????????? | 61.51.76.102?????? | Internet host
    ??????????????? ----------------------?????????????????????????? ----------------------????????????????????????????????
    ???????????????????????????????
    ????????????????????????????? 圖二: NAPT 實(shí)現(xiàn)了私有IP的計(jì)算機(jī)分享一個(gè)公網(wǎng)IP地址訪問Internet的功能。????????????????????????????????????????????
    ?
    在 我們的工作和生活中, NAPT的作用隨處可見,絕大部分公司的網(wǎng)絡(luò)架構(gòu),都是通過1至N臺(tái)支持NAPT的路由器來實(shí)現(xiàn)公司的所有計(jì)算機(jī)連接外部的Internet網(wǎng)絡(luò)的。包括 本人在寫這篇文章的時(shí)候,也是在家中使用一臺(tái)IBM筆記本通過一臺(tái)寬帶連接的臺(tái)式機(jī)來訪問Internet的。我們本篇文章主要討論的NAPT的問題。

    NAPT(The IP Network Address/Port Translator) 為何阻礙了P2P軟件的應(yīng)用?

    通 過NAPT 上網(wǎng)的特點(diǎn)決定了只能由NAPT內(nèi)的計(jì)算機(jī)主動(dòng)向NAPT外部的主機(jī)發(fā)起連接,外部的主機(jī)想直接和NAPT內(nèi)的計(jì)算機(jī)直接建立連接是不被允許的。IM(即 時(shí)通訊)而言,這意味著由于NAPT內(nèi)的計(jì)算機(jī)和NAPT外的計(jì)算機(jī)只能通過服務(wù)器中轉(zhuǎn)數(shù)據(jù)來進(jìn)行通訊。對(duì)于P2P方式的下載程序而言,意味著NAPT內(nèi) 的計(jì)算機(jī)不能接收到NAPT外部的連接,導(dǎo)致連接數(shù)用過少,下載速度很難上去。因此P2P軟件必須要解決的一個(gè)問題就是要能夠在一定的程度上解決NAPT 內(nèi)的計(jì)算機(jī)不能被外部連接的問題。

    NAT(The IP Network Address Translator) 進(jìn)行UDP穿透的原理是什么?

    TCP/IP 傳輸時(shí)主要用到TCP和UDP協(xié)議。TCP協(xié)議是可靠的,面向連接的傳輸協(xié)議。UDP是不可靠的,無連接的協(xié)議。根據(jù)TCP和UDP協(xié)議的實(shí)現(xiàn)原理,對(duì)于 NAPT來進(jìn)行穿透,主要是指的UDP協(xié)議。TCP協(xié)議也有可能,但是可行性非常小,要求更高,我們此處不作討論,如果感興趣可以到Google上搜索, 有些文章對(duì)這個(gè)問題做了探討性的描述。下面我們來看看利用UDP協(xié)議來穿透NAPT的原理是什么:

    ??????????????????????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????????????? | 192.168.0.5??????? |? Internat host??????????? | 192.168.0.6??????? |? Internat host
    ??????????????????????? ----------------------?????????????????????????? ----------------------??????????????
    ????????????????????????? UDP port: 2809??????? ^?????????????????? ^ UDP port: 1827
    ???????????????????????????????????????????????? \???????????????? /
    ????????????????????????????????????????????????? v?????????????? v????????????????????????????
    ??????????????????????????????????????????????? ----------------------???????????
    ??????????????????????????????????????????????? | 192.168.0.1??????? | NAT device
    ??????????????????????????????????????????????? | 61.51.99.86??????? |???????????
    ??????????????????????????????????????????????? ----------------------?????????????????????????????????
    ? Session(192.168.0.6:1827 <-> 61.51.76.102:8098) ^????????????? ^ Session(192.168.0.6:1827 <-> 61.51.76.102:8098)
    ?????????????? map port:9882 to 192.168.0.5:2809 /??????????????? \map port: 9881 to 192.168.0.6:1827
    ????????????????????????????????? UDP port:8098 v????????????????? v??? UDP port:8098??????????????????????????
    ??????????????????????? ----------------------?????????????????????????? ----------------------??????????????
    ??????????????????????? | 61.51.202.88?????? | Internet host???????????? | 61.51.76.102?????? | Internet host
    ??????????????????????? ----------------------?????????????????????????? ----------------------????????????????
    ???????????????????????????????????????????????????????
    ???????????????????????????????????????
    ????????????????????????????????????? 圖三: NAPT 是如何將私有IP地址的UDP數(shù)據(jù)包與公網(wǎng)主機(jī)進(jìn)行透明傳輸?shù)摹?/p>

    UDP協(xié)議包經(jīng)NAPT透明傳輸?shù)恼f明:

    NAPT 為每一個(gè)Session分配一個(gè)NAPT自己的端口號(hào),依據(jù)此端口號(hào)來判斷將收到的公網(wǎng)IP主機(jī)返回的TCP/IP數(shù)據(jù)包轉(zhuǎn)發(fā)給那臺(tái)內(nèi)網(wǎng)IP地址的計(jì)算 機(jī)。在這里Session是虛擬的,UDP通訊并不需要建立連接,但是對(duì)于NAPT而言,的確要有一個(gè)Session的概念存在。NAPT對(duì)于UDP協(xié)議 包的透明傳輸面臨的一個(gè)重要的問題就是如何處理這個(gè)虛擬的Session。我們都知道TCP連接的Session以SYN包開始,以FIN包結(jié)束, NAPT可以很容易的獲取到TCP Session的生命周期,并進(jìn)行處理。但是對(duì)于UDP而言,就麻煩了,NAPT并不知道轉(zhuǎn)發(fā)出去的UDP協(xié)議包是否到達(dá)了目的主機(jī),也沒有辦法知道。而 且鑒于UDP協(xié)議的特點(diǎn),可靠很差,因此NAPT必須強(qiáng)制維持Session的存在,以便等待將外部送回來的數(shù)據(jù)并轉(zhuǎn)發(fā)給曾經(jīng)發(fā)起請(qǐng)求的內(nèi)網(wǎng)IP地址的計(jì) 算機(jī)。NAPT具體如何處理UDP Session的超時(shí)呢?不同的廠商提供的設(shè)備對(duì)于NAPT的實(shí)現(xiàn)不近相同,也許幾分鐘,也許幾個(gè)小時(shí),些NAPT的實(shí)現(xiàn)還會(huì)根據(jù)設(shè)備的忙碌狀態(tài)進(jìn)行智能 計(jì)算超時(shí)時(shí)間的長短。

    ????????????????? [192.168.0.6:1827]
    ??????????????????????????? | UDP Packet[src ip:192.168.0.6 src port:1827 dst ip:61.51.76.102 dst port 8098]
    ??????????????????????????? v
    ??????? [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
    ??????????????????????????? | UDP Packet[src ip:61.51.99.86 src port:9881 dst ip:61.51.76.102 dst port 8098]
    ??????????????????????????? v??????????????????
    ????????????????? [61.51.76.102:8098]
    ?????????????????
    ??????????????????????????????????? 圖四: NAPT 將內(nèi)部發(fā)出的UDP協(xié)議包的源地址和源端口改變傳輸給公網(wǎng)IP主機(jī)。
    ???????????????????????????????????
    ???????????????????????????????????
    ????????????????? [192.168.0.6:1827]
    ??????????????????????????? ^
    ??????????????????????????? | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:192.168.0.6 dst port 1827]
    ??????? [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
    ??????????????????????????? ^??
    ??????????????????????????? | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:61.51.99.86 dst port 9881]???
    ????????????????? [61.51.76.102:8098]
    ?????????????????
    ??????????????????????????????????? 圖五: NAPT 將收到的公網(wǎng)IP主機(jī)返回的UDP協(xié)議包的目的地址和目的端口改變傳輸給內(nèi)網(wǎng)IP計(jì)算機(jī)。???????????????????????????????
    現(xiàn)在我們大概明白了NAPT如何實(shí)現(xiàn)內(nèi)網(wǎng)計(jì)算機(jī)和外網(wǎng)主機(jī)間的透明通訊?,F(xiàn)在來看一下我們最關(guān)心的問題,就是NAPT是依據(jù)什么策略來判斷是否要為一個(gè)請(qǐng)求發(fā)出的UDP數(shù)據(jù)包建立Session的呢?主要有一下幾個(gè)策略:

    A. 源地址(內(nèi)網(wǎng)IP地址)不同,忽略其它因素, 在NAPT上肯定對(duì)應(yīng)不同的Session
    B. 源地址(內(nèi)網(wǎng)IP地址)相同,源端口不同,忽略其它的因素,則在NAPT上也肯定對(duì)應(yīng)不同的Session
    C. 源地址(內(nèi)網(wǎng)IP地址)相同,源端口相同,目的地址(公網(wǎng)IP地址)相同,目的端口不同,則在NAPT上肯定對(duì)應(yīng)同一個(gè)Session
    D. 源地址(內(nèi)網(wǎng)IP地址)相同,源端口相同,目的地址(公網(wǎng)IP地址)不同,忽略目的端口,則在NAPT上是如何處理Session的呢?

    D的情況正式我們關(guān)心和要討論的問題。依據(jù)目的地址(公網(wǎng)IP地址)對(duì)于Session的建立的決定方式我們將NAPT設(shè)備劃分為兩大類:

    Symmetric NAPT:
    對(duì)于到同一個(gè)IP地址,任意端口的連接分配使用同一個(gè)Session; 對(duì)于到不同的IP地址, 任意端口的連接使用不同的Session.
    我們稱此種NAPT為 Symmetric NAPT. 也就是只要本地綁定的UDP端口相同, 發(fā)出的目的IP地址不同,則會(huì)建立不同的Session.

    ??????? [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]
    ??????????????? ^?????????????? ^?????????????????????? ^
    ??????????????? |?????????????? |?????????????????????? |
    ??????????????? v?????????????? v?????????????????????? v
    ?????????????? 9883??????????? 9882??????????????????? 9881
    ???????????????????????????????? |
    ???????????????????????????? \ [NAT] /
    ???????????????????????????????? ^
    ???????????????????????????????? |
    ???????????????????????????????? v???????????????????????
    ????????????????????????? [192.168.0.6:1827]
    ?????????????????????????
    ????????????????????????? 圖六: Symmetric 的英文意思是對(duì)稱。多個(gè)端口對(duì)應(yīng)多個(gè)主機(jī),平行的,對(duì)稱的!
    ?????????????????
    Cone NAPT:
    對(duì)于到同一個(gè)IP地址,任意端口的連接分配使用同一個(gè)Session; 對(duì)于到不同的IP地址,任意端口的連接也使用同一個(gè)Session.
    我們稱此種NAPT為 Cone NAPT. 也就是只要本地綁定的UDP端口相同, 發(fā)出的目的地址不管是否相同, 都使用同一個(gè)Session.

    ??????? [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]

    ??????????????????????? ^????????? ^???????? ^
    ???????????????????????? \???????? |??????? /
    ????????????????????????? v??????? v?????? v
    ???????????????????????????????? 9881
    ???????????????????????????????? [NAT]
    ?????????????????????????????????? ^
    ?????????????????????????????????? |
    ?????????????????????????????????? v?????????????????????
    ????????????????????????? [192.168.0.6:1827]
    ?????????????????????????
    ????????????????????????? 圖七: Cone 的英文意思是錐。一個(gè)端口對(duì)應(yīng)多個(gè)主機(jī),是不是像個(gè)錐子?

    現(xiàn) 在絕大多數(shù)的NAPT屬于后者,即Cone NAT。本人在測(cè)試的過程中,只好使用了一臺(tái)日本的Symmetric NAT。還好不是自己的買的,我從不買日貨, 希望看這篇文章的朋友也自覺的不要購買日本的東西。Win9x/2K/XP/2003系統(tǒng)自帶的NAPT也是屬于 Cone NAT的。這是值的慶幸的,因?yàn)槲覀円龅腢DP穿透只能在Cone NAT間進(jìn)行,只要有一臺(tái)不是Cone NAT,對(duì)不起,UDP穿透沒有希望了,服務(wù)器轉(zhuǎn)發(fā)吧。后面會(huì)做詳細(xì)分析!

    下面我們?cè)賮矸治鲆幌翹APT 工作時(shí)的一些數(shù)據(jù)結(jié)構(gòu),在這里我們將真正說明UDP可以穿透Cone NAT的依據(jù)。這里描述的數(shù)據(jù)結(jié)構(gòu)只是為了說明原理,不具有實(shí)際參考價(jià)值,真正感興趣可以閱讀Linux的中關(guān)于NAT實(shí)現(xiàn)部分的源碼。真正的NAT實(shí)現(xiàn) 也沒有利用數(shù)據(jù)庫的,呵呵,為了速度!

    Symmetric NAPT 工作時(shí)的端口映射數(shù)據(jù)結(jié)構(gòu)如下:

    內(nèi)網(wǎng)信息表:

    [NAPT 分配端口] [ 內(nèi)網(wǎng)IP地址 ] [ 內(nèi)網(wǎng)端口 ] [ 外網(wǎng)IP地址 ] [ SessionTime 開始時(shí)間 ]

    PRIMARY KEY( [NAPT 分配端口] ) -> 表示依據(jù)[NAPT 分配端口]建立主鍵,必須唯一且建立索引,加快查找.
    UNIQUE( [ 內(nèi)網(wǎng)IP地址 ], [ 內(nèi)網(wǎng)端口 ] ) -> 表示這兩個(gè)字段聯(lián)合起來不能重復(fù).
    UNIQUE( [ 內(nèi)網(wǎng)IP地址 ], [ 內(nèi)網(wǎng)端口 ], [ 外網(wǎng)IP地址 ] ) -> 表示這三個(gè)字段聯(lián)合起來不能重復(fù).

    映射表:

    [NAPT 分配端口] [ 外網(wǎng)端口 ]

    UNIQUE( [NAPT 分配端口], [ 外網(wǎng)端口 ] ) -> 表示這兩個(gè)字段聯(lián)合起來不能重復(fù).

    Cone NAPT 工作時(shí)的端口映射數(shù)據(jù)結(jié)構(gòu)如下:

    內(nèi)網(wǎng)信息表:

    [NAPT 分配端口] [ 內(nèi)網(wǎng)IP地址 ] [ 內(nèi)網(wǎng)端口 ] [ SessionTime 開始時(shí)間 ]

    PRIMARY KEY( [NAPT 分配端口] ) -> 表示依據(jù)[NAPT 分配端口]建立主鍵,必須唯一且建立索引,加快查找.
    UNIQUE( [ 內(nèi)網(wǎng)IP地址 ], [ 內(nèi)網(wǎng)端口 ] ) -> 表示這兩個(gè)字段聯(lián)合起來不能重復(fù).

    外網(wǎng)信息表:

    [ wid 主鍵標(biāo)識(shí) ] [ 外網(wǎng)IP地址 ] [ 外網(wǎng)端口 ]

    PRIMARY KEY( [ wid 主鍵標(biāo)識(shí) ] ) -> 表示依據(jù)[ wid 主鍵標(biāo)識(shí) ]建立主鍵,必須唯一且建立索引,加快查找.
    UNIQUE( [ 外網(wǎng)IP地址 ], [ 外網(wǎng)端口 ] ) -> 表示這兩個(gè)字段聯(lián)合起來不能重復(fù).

    映射表: 實(shí)現(xiàn)一對(duì)多,的

    [NAPT 分配端口] [ wid 主鍵標(biāo)識(shí) ]

    UNIQUE( [NAPT 分配端口], [ wid 主鍵標(biāo)識(shí) ] ) -> 表示這兩個(gè)字段聯(lián)合起來不能重復(fù).
    UNIQUE( [ wid 主鍵標(biāo)識(shí) ] ) -> 標(biāo)識(shí)此字段不能重復(fù).

    看完了上面的數(shù)據(jù)結(jié)構(gòu)是更明白了還是更暈了? 呵呵! 多想一會(huì)兒就會(huì)明白了。通過NAT,內(nèi)網(wǎng)計(jì)算機(jī)計(jì)算機(jī)向外連結(jié)是很容易的,NAPT會(huì)自動(dòng)處理,我們的應(yīng)用程序根本不必關(guān)心它是如何處理的。那么外部的計(jì)算機(jī)想訪問內(nèi)網(wǎng)中的計(jì)算機(jī)如何實(shí)現(xiàn)呢?我們來看一下下面的流程:

    c 是一臺(tái)在NAPT后面的內(nèi)網(wǎng)計(jì)算機(jī),s是一臺(tái)有外網(wǎng)IP地址的計(jì)算機(jī)。c 主動(dòng)向 s 發(fā)起連接請(qǐng)求,NAPT依據(jù)上面描述的規(guī)則在自己的數(shù)據(jù)結(jié)構(gòu)中記錄下來,建立一個(gè)Session. 然后 c 和 s 之間就可以實(shí)現(xiàn)雙向的透明的數(shù)據(jù)傳輸了。如下面所示:

    ?? c[192.168.0.6:1827] <-> [priv ip: 192.168.0.1]NAPT[pub ip: 61.51.99.86:9881] <-> s[61.51.76.102:8098]

    由 此可見,一臺(tái)外網(wǎng)IP地址的計(jì)算機(jī)想和NAPT后面的內(nèi)網(wǎng)計(jì)算機(jī)通訊的條件就是要求NAPT后面的內(nèi)網(wǎng)計(jì)算機(jī)主動(dòng)向外網(wǎng)IP地址的計(jì)算機(jī)發(fā)起一個(gè)UDP數(shù) 據(jù)包。外網(wǎng)IP地址的計(jì)算機(jī)利用收到的UDP數(shù)據(jù)包獲取到NAPT的外網(wǎng)IP地址和映射的端口,以后就可以和內(nèi)網(wǎng)IP的計(jì)算機(jī)透明的進(jìn)行通訊了。
    ???
    現(xiàn) 在我們?cè)賮矸治鲆幌挛覀冏铌P(guān)心的兩個(gè)NAPT后面的內(nèi)網(wǎng)計(jì)算機(jī)如何實(shí)現(xiàn)直接通訊呢? 兩者都無法主動(dòng)發(fā)出連接請(qǐng)求,誰也不知道對(duì)方的NAPT的公網(wǎng)IP地址和NAPT上面映射的端口號(hào)。所以我們要靠一個(gè)公網(wǎng)IP地址的服務(wù)器幫助兩者來建立 連接。當(dāng)兩個(gè)NAPT后面的內(nèi)網(wǎng)計(jì)算機(jī)分別連接了公網(wǎng)IP地址的服務(wù)器后,服務(wù)器可以從收到的UDP數(shù)據(jù)包中獲取到這兩個(gè)NAPT設(shè)備的公網(wǎng)IP地址和這 兩個(gè)連接建立的Session的映射端口。兩個(gè)內(nèi)網(wǎng)計(jì)算機(jī)可以從服務(wù)器上獲取到對(duì)方的NAPT設(shè)備公網(wǎng)IP地址和映射的端口了。

    我們假設(shè)兩個(gè)內(nèi)網(wǎng)計(jì)算機(jī)分別為A和B,對(duì)應(yīng)的NAPT分別為AN和BN, 如果A在獲取到B對(duì)應(yīng)的BN的IP地址和映射的端口后,迫不急待的向這個(gè)IP
    地 址和映射的端口發(fā)送了個(gè)UDP數(shù)據(jù)包,會(huì)有什么情況發(fā)生呢?依據(jù)上面的原理和數(shù)據(jù)結(jié)構(gòu)我們會(huì)知道,AN會(huì)在自己的數(shù)據(jù)結(jié)構(gòu)中生成一條記錄,標(biāo)識(shí)一個(gè)新 Session的存在。BN在收到數(shù)據(jù)包后,從自己的數(shù)據(jù)結(jié)構(gòu)中查詢,沒有找到相關(guān)記錄,因此將包丟棄。B是個(gè)慢性子,此時(shí)才慢吞吞的向著AN的IP地址 和映射的端口發(fā)送了一個(gè)UDP數(shù)據(jù)包,結(jié)果如何呢?當(dāng)然是我們期望的結(jié)構(gòu)了,AN在收到數(shù)據(jù)包后,從自己的數(shù)據(jù)結(jié)構(gòu)中查找到了記錄,所以將數(shù)據(jù)包進(jìn)行處理 發(fā)送給了A。A 再次向B發(fā)送數(shù)據(jù)包時(shí),一切都時(shí)暢通無阻了。OK, 大工告成!且慢,這時(shí)對(duì)于Cone NAPT而言,對(duì)于Symmetric NAPT呢?呵呵,自己分析一下吧...

    NAPT(The IP Network Address/Port Translator) 進(jìn)行UDP穿透的具體情況分析!

    首先明確的將NAPT設(shè)備按照上面的說明分為: Symmetric NAPT 和 Cone NAPT, Cone NAPT 是我們需要的。Win9x/2K/XP/2003 自帶的NAPT也為Cone NAPT。

    第一種情況, 雙方都是Symmetric NAPT:

    此情況應(yīng)給不存在什么問題,肯定是不支持UDP穿透。

    第二種情況, 雙方都是Cone NAPT:

    此情況是我們需要的,可以進(jìn)行UDP穿透。

    第三種情況, 一個(gè)是Symmetric NAPT, 一個(gè)是Cone NAPT:

    此情況比較復(fù)雜,但我們按照上面的描述和數(shù)據(jù)機(jī)構(gòu)進(jìn)行一下分析也很容易就會(huì)明白了, 分析如下,

    假設(shè): A -> Symmetric NAT, B -> Cone NAT

    1. A 想連接 B, A 從服務(wù)器那兒獲取到 B 的NAT地址和映射端口, A 通知服務(wù)器,服務(wù)器告知 B A的NAT地址和映射端口, B 向 A 發(fā)起連接,A 肯定無法接收到。此時(shí) A 向 B 發(fā)起連接, A 對(duì)應(yīng)的NAT建立了一個(gè)新的Session,分配了一個(gè)新的映射端口, B 的 NAT 接收到UDP包后,在自己的映射表中查詢,無法找到映射項(xiàng),因此將包丟棄了。

    2. B 想連接 A, B 從服務(wù)器那兒獲取到 A 的NAT地址和映射端口, B 通知服務(wù)器, 服務(wù)器告知 A B的NAT地址和映射端口,A 向 B 發(fā)起連接, A 對(duì)應(yīng)的NAT建立了一個(gè)新的Session,分配了一個(gè)新的映射端口B肯定無法接收到。此時(shí) B 向 A 發(fā)起連接, 由于 B 無法獲取 A 建立的新的Session的映射端口,仍是使用服務(wù)器上獲取的映射端口進(jìn)行連接, 因此 A 的NAT在接收到UDP包后,在自己的映射表中查詢,無法找到映射項(xiàng), 因此將包丟棄了。

    根據(jù)以上分析,只有當(dāng)連接的兩端的NAT都為Cone NAT的情況下,才能進(jìn)行UDP的內(nèi)網(wǎng)穿透互聯(lián)。


    NAPT(The IP Network Address/Port Translator) 進(jìn)行UDP穿透如何進(jìn)行現(xiàn)實(shí)的驗(yàn)證和分析!

    需要的網(wǎng)絡(luò)結(jié)構(gòu)如下:

    三個(gè)NAT后面的內(nèi)網(wǎng)機(jī)器,兩個(gè)外網(wǎng)服務(wù)器。其中兩臺(tái)Cone NAPT,一臺(tái) Symmetric NAPT。

    驗(yàn)證方法:

    可 以使用本程序提供的源碼,編譯,然后分別運(yùn)行服務(wù)器程序和客戶端。修改過后的源碼增加了客戶端之間直接通過IP地址和端口發(fā)送消息的命令,利用此命令,你 可以手動(dòng)的驗(yàn)證NAPT的穿透情況。為了方便操作,推薦你使用一個(gè)遠(yuǎn)程登陸軟件,可以直接在一臺(tái)機(jī)器上操作所有的相關(guān)的計(jì)算機(jī),這樣很方便,一個(gè)人就可以 完成所有的工作了。呵呵,本人就是這么完成的。歡迎有興趣和經(jīng)驗(yàn)的朋友來信批評(píng)指正,共同進(jìn)步。



    原始作者: Hwycheng Leo(FlashBT@Hotmail.com)

    源碼下載: http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar
    參考:http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt
    ????? P2P之UDP穿透NAT的原理與實(shí)現(xiàn)(shootingstars)

    文章說明:

    關(guān) 于UDP穿透NAT的中文資料在網(wǎng)絡(luò)上是很少的,僅有<<P2P之UDP穿透NAT的原理與實(shí)現(xiàn)(shootingstars)> >這篇文章有實(shí)際的參考價(jià)值。本人近兩年來也一直從事P2P方面的開發(fā)工作,比較有代表性的是個(gè)人開發(fā)的BitTorrent下載軟件 - FlashBT(變態(tài)快車). 對(duì)P2P下載或者P2P的開發(fā)感興趣的朋友可以訪問軟件的官方主頁: http://www.hwysoft.com/chs/ 下載看看,說不定有收獲。寫這篇文章的主要目的是懶的再每次單獨(dú)回答一些網(wǎng)友的提問, 一次性寫下來, 即節(jié)省了自己的時(shí)間,也方便了對(duì)于P2P的UDP穿透感興趣的網(wǎng)友閱讀和理解。對(duì)此有興趣和經(jīng)驗(yàn)的朋友可以給我發(fā)郵件或者訪問我的個(gè)人Blog留言: http://hwycheng.blogchina.com.
    您可以自由轉(zhuǎn)載此篇文章,但是請(qǐng)保留此說明。

    再次感謝shootingstars網(wǎng)友的早期貢獻(xiàn). 表示謝意。

    posted on 2006-09-13 00:32 地獄男爵(hellboys) 閱讀(1215) 評(píng)論(1)  編輯  收藏 所屬分類: 系統(tǒng)綜合

    FeedBack:
    # re: P2P之UDP穿透NAT的原理與實(shí)現(xiàn)
    2007-05-19 22:16 | 而試
    難得一見的好文章  回復(fù)  更多評(píng)論
      
    <2006年9月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    隨筆分類

    隨筆檔案

    文章檔案

    相冊(cè)

    連接

    最新隨筆

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲国产成人久久综合野外| 国产精品亚洲va在线观看| 最新亚洲成av人免费看| 扒开双腿猛进入爽爽免费视频 | 最近中文字幕大全免费版在线| www.亚洲日本| 精品亚洲成a人片在线观看| 久久久久亚洲精品男人的天堂| 热久久精品免费视频| 国产一卡二卡四卡免费| 亚洲午夜免费视频| a毛片免费全部在线播放**| 日本精品久久久久久久久免费| 亚洲色中文字幕在线播放| 亚洲一区二区三区高清视频| 亚洲视频在线观看| 亚洲成a人片在线观看无码专区| 在线精品亚洲一区二区小说| jizzjizz亚洲| 免费精品国产自产拍观看| 四虎影视在线永久免费看黄| 日韩高清在线高清免费| 插B内射18免费视频| 成人毛片免费观看视频大全| 免费无码黄十八禁网站在线观看 | 亚洲国产精品lv| 亚洲国产高清在线| 日木av无码专区亚洲av毛片| 亚洲国产精品久久久久| 亚洲黄网在线观看| 亚洲成电影在线观看青青| 亚洲免费一级视频| 亚洲一级特黄特黄的大片 | 精品久久久久国产免费| 在线视频免费观看高清| 97无码免费人妻超级碰碰碰碰 | 亚洲一区二区三区国产精华液| 亚洲一卡二卡三卡| 亚洲成a∧人片在线观看无码| 337P日本欧洲亚洲大胆艺术图| 免费国产va在线观看|