UDP穿透NAT的原理與實(shí)現(xiàn)(附源代碼)
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
UDP穿透NAT的原理與實(shí)現(xiàn)(附源代碼)
論壇上經(jīng)常有對(duì)P2P原理的討論,但是討論歸討論,很少有實(shí)質(zhì)的東西產(chǎn)生(源代碼)。呵呵,在這里我就用自己實(shí)現(xiàn)的一個(gè)源代碼來說明UDP穿越NAT的原理。
首先先介紹一些基本概念:
NAT(Network Address Translators),網(wǎng)絡(luò)地址轉(zhuǎn)換:網(wǎng)絡(luò)地址轉(zhuǎn)換是在IP
地址日益缺乏的情況下產(chǎn)生的,它的主要目的就是為了能夠地址重用。NAT分為兩大類,基本的NAT和NAPT(Network Address/Port Translator)。
最開始NAT是運(yùn)行在路由器上的一個(gè)功能模塊。最先提出的是基本的NAT,它的產(chǎn)生基于如下事實(shí):一個(gè)私有網(wǎng)絡(luò)(域)中的節(jié)點(diǎn)中只有很少的節(jié)點(diǎn)需要與外網(wǎng)連接(呵呵,這是在上世紀(jì)90年代中期提出的)。那么這個(gè)子網(wǎng)中其實(shí)只有少數(shù)的節(jié)點(diǎn)需要全球唯一的IP地址,其他的節(jié)點(diǎn)的IP地址應(yīng)該是可以重用的。
因此,基本的NAT實(shí)現(xiàn)的功能很簡(jiǎn)單,在子網(wǎng)內(nèi)使用一個(gè)保留的IP子網(wǎng)段,這些IP對(duì)外是不可見的。子網(wǎng)內(nèi)只有少數(shù)一些IP地址可以對(duì)應(yīng)到真正全球唯一的IP地址。如果這些節(jié)點(diǎn)需要訪問外部網(wǎng)絡(luò),那么基本NAT就負(fù)責(zé)將這個(gè)節(jié)點(diǎn)的子網(wǎng)內(nèi)IP轉(zhuǎn)化為一個(gè)全球唯一的IP然后發(fā)送出去。(基本的NAT會(huì)改變IP包中的原IP地址,但是不會(huì)改變IP包中的端口)關(guān)于基本的NAT可以參看RFC 1631
另外一種NAT叫做NAPT,從名稱上我們也可以看得出,NAPT不但會(huì)改變經(jīng)過這個(gè)NAT設(shè)備的IP數(shù)據(jù)報(bào)的IP地址,還會(huì)改變IP數(shù)據(jù)報(bào)的TCP/UDP端口?;綨AT的設(shè)備可能我們見的不多(呵呵,我沒有見到過),NAPT才是我們真正討論的主角。
看下圖:Server S1
18.181.0.31:1235
|
^ Session 1 (A-S1) ^ |
| 18.181.0.31:1235 | |
v 155.99.25.11:62000 v |
|
NAT
155.99.25.11
|
^ Session 1 (A-S1) ^ |
| 18.181.0.31:1235 | |
v
|
Client
10.0.0
有一個(gè)私有網(wǎng)絡(luò)10.*.*.*,Client A是其中的一臺(tái)計(jì)算機(jī),這個(gè)網(wǎng)絡(luò)的網(wǎng)關(guān)
(一個(gè)NAT設(shè)備)的外網(wǎng)IP是155.99.25.11(應(yīng)該還有一個(gè)內(nèi)網(wǎng)的IP地址,比如
Socket綁定1234端口)想訪問外網(wǎng)主機(jī)18.181.0.31的1235端口,那么當(dāng)數(shù)據(jù)包通
過NAT時(shí)會(huì)發(fā)生什么事情呢?
首先NAT會(huì)改變這個(gè)數(shù)據(jù)包的原IP地址,改為155.99.25.11。接著NAT會(huì)為這
個(gè)傳輸創(chuàng)建一個(gè)Session(Session是一個(gè)抽象的概念,如果是TCP,也許Session
是由一個(gè)SYN包開始,以一個(gè)FIN包結(jié)束。而UDP呢,以這個(gè)IP的這個(gè)端口的第一個(gè)
UDP開始,結(jié)束呢,呵呵,也許是幾分鐘,也許是幾小時(shí),這要看具體的實(shí)現(xiàn)了)
并且給這個(gè)Session分配一個(gè)端口,比如62000,然后改變這個(gè)數(shù)據(jù)包的源端口為
62000。所以本來是(10.0.0.1:1234->18.181.0.31:1235)的數(shù)據(jù)包到了互聯(lián)網(wǎng)
上變?yōu)榱耍?FONT face=宋體>155.99.25.11:62000->18.181.0.31:1235)。
一旦NAT創(chuàng)建了一個(gè)Session后,NAT會(huì)記住62000端口對(duì)應(yīng)的是10.0.0.1的
1234端口,以后從18.181.0.31發(fā)送到62000端口的數(shù)據(jù)會(huì)被NAT自動(dòng)的轉(zhuǎn)發(fā)到
非常好我支持^.^
(6) 100%
不好我反對(duì)
(0) 0%
下載地址
UDP穿透NAT的原理與實(shí)現(xiàn)(附源代碼)下載
相關(guān)電子資料下載
- Makefile簡(jiǎn)介和使用方法 530
- 當(dāng)一名高職生成為開源代碼頂級(jí)貢獻(xiàn)者 111
- git命令的基本使用 357
- 分享一套生產(chǎn)管理MES系統(tǒng)源碼,可以直接拿來搞錢的好項(xiàng)目 140
- C/c++源代碼qt軟件 svn版本管理開發(fā)如何防泄密? 48
- 為什么安秉信息的源代碼防泄密軟件這么穩(wěn)定? 76
- C語言必備知識(shí)編譯預(yù)處理 419
- 非常可靠的c#+svn或git服務(wù)器源代碼防泄密方案 全解析 82
- 極狐GitLab—新一代源代碼管理倉(cāng)庫 152
- 能夠生成java文檔注釋的命令 140