udp穿透nat源碼
『壹』 udp協議怎麼穿透Symmetric NAT
把4種類型分別標為1234,有兩台主機A:portA和B:portB(port都為外網埠,是與打洞伺服器通信的埠),以及打洞伺服器S,情景是B拿到了A:portA的信息,要與A通信。
(1)、A為類型1;無論B為哪種類型,都可以直接與A:portA tcp連接;
(2)、A為類型2;無論B為哪種類型,在A知道B之前都無法直接連接,B給S發一個打洞請求,S轉發該請求到A。若B的類型為1,則A:portA可直接tcp連接到B:portB;若B的類型為2或3,則A:portA和B:portB各自向對方發送一個一位元組的udp包,分別在自己的路由器上打洞,從此A:portA和B:portB可進行udp通信;若B為類型4,則portB在與不同的ip:port通信時會不一樣,所以A:portA先向B發送一個一位元組的udp包,在路由器上打洞,然後等待B:portB先發送數據,A:portA接收到B:portB的數據後,即知道portB,也可互通數據了;
(3)、A為類型3;無論B為哪種類型,在A知道B之前都無法直接連接,B給S發一個打洞請求,S轉發該請求到A。若B的類型為1,則A:portA可直接tcp連接到B:portB;若B的類型為2或3,則A:portA和B:portB各自向對方發送一個一位元組的udp包,分別在自己的路由器上打下洞,從此A:portA和B:portB可進行udp通信;若B為類型4,則portB在與不同的ip:port通信時會不一樣,而A又要求知道portB的才可讓B:portB連進來,所以這種情況A只能猜測與A:portA通信的portB,通信概率小;
(4)、A為類型4;無論B為哪種類型,在A知道B之前都無法直接連接,B給S發一個打洞請求,S轉發該請求到A。若B的類型為1,則A:portA可直接tcp連接到B:portB;若B的類型為2,則B:portB先向A發送一個一位元組的udp包,在路由器上打洞,然後等待A:portA先發送數據,B:portB接收到A:portA的數據後,即知道portA,也可互通數據了;若B的類型為3,見(3)中B為類型4的描述;若B為4,雙方無法知道對方的埠,無法通信。
希望可以幫到你
『貳』 TCP、UDP穿透NAT
A與B如果IP相同,則用內網方案。
A與B的IP不相同的話,
A請求伺服器讓B給A發個打洞消息。如果能接收到B的應答,就說明通了。(在這里是通過線程,有一個最大嘗試次數)
A -> 發送打洞請求給C
C -> 發送命令給B,B接到命令後
B -> 發送打洞回應消息給A,一直嘗試N次
如果A能接受到B的回應,就通了。
不知道描述的對不對。
『叄』 udp協議怎麼穿透Symmetric NAT
http://blog.csdn.net/jq0123/article/details/840302
NAT大致分為下面四類
1)
Full
Cone
這種NAT內部的機器A連接過外網機器C後,NAT會打開一個埠.然後外網的任何發到這個打開的埠的UDP數據報都可以到達A.不管是不是C發過來的.
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000)
->
NAT(202.100.100.100
:
8000)
->
C(292.88.88.88:2000)
任何發送到
NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)
2)
Restricted
Cone
這種NAT內部的機器A連接過外網的機器C後,NAT打開一個埠.然後C可以用任何埠和A通信.其他的外網機器不行.
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000)
->
NAT(202.100.100.100
:
8000)
->
C(292.88.88.88:2000)
任何從C發送到
NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)
3)
Port
Restricted
Cone
這種NAT內部的機器A連接過外網的機器C後,NAT打開一個埠.然後C可以用原來的埠和A通信.其他的外網機器不行.
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000)
->
NAT(202.100.100.100
:
8000)
->
C(292.88.88.88:2000)
C(202.88.88.88:2000)發送到
NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)
以上三種NAT通稱Cone
NAT.我們只能用這種NAT進行UDP打洞.
4)
Symmetic
對於這種NAT.連接不同的外部目標.原來NAT打開的埠會變化.而Cone
NAT不會.雖然可以用埠猜測.但是成功的概率很小.因此放棄這種NAT的UDP打洞.
『肆』 NAT C#,要用C#寫的、UDP穿越NAT的源碼、源碼
UDP穿越NAT的話,需要對端配合的,否則沒辦法穿越,只能對方先在子網後面對公網地址發起UDP呼叫,公網計算機才能在一定時間里回應,回應的UDP包可以穿越nat到達源機器。
如果兩邊都在子網後面,那就需要作一個狀態伺服器,維護兩方的NAT映射信息。
很簡單。我從前做過實驗。
你要是已經懂了原理,怎麼會做不出程序?
『伍』 udp協議怎麼穿透Symmetric NAT
這個穿透是指,當設備檢測到報文是udp時,會建立一個port mapping埠映射,以便於區分內網的用戶,這個映射同樣會指向外網ip的一個埠
『陸』 C#UDP穿越NAT,UDP打洞,UDP Hole Punching源代碼,該怎麼處理
首先要有一個沒有nat的公網伺服器,
每個用戶使用一個埠與伺服器通訊 ,伺服器在收到用戶連入請求後把用戶的標識符跟用戶的埠號匹配保存起來
當另一個用戶請求該用戶時把該用戶對應的埠號返回 然後用戶之間互相用指定埠號聯系 就是打洞了
伺服器要維系連接要定時發心跳包
『柒』 TCP穿透NAT
談談我的理解:
首先,tcp不同於udp,tcp天生就是不對等的連接,因此穿透nat就顯得很困難。
最為簡單的一種方式:
客戶端:a,b
伺服器端(公網)c
a發送消息給c,同時c拿到a的ip埠等信息,將a提出的請求轉發給已與c連接的b,b表示同意後發送消息給c,c將消息反饋給a,同時為a和b的通信做准備(分配埠等等),整個過程是客戶端到伺服器再到客戶端,c起中轉作用,a與b建立連接實際是a與c,b與c建立的連接。
一般對於可靠性要求較低的應用會使用udp實現。
優點:適用於所有類型網路,簡單;
缺點:佔用帶寬,速度慢。
早期的msn就是這種方式。
第二種方式:TCP的p2p技術。
這種方式是目前最熱門的,我也正在看。
轉一下來自cmu(卡耐基梅隆)牛人們的研究:
××××××××××××××××
原文:http://www.andrew.cmu.e/user/ggw/WBFD.pdf
由於工作需要,在網上找了很長時間P2P的資料,好像只有《P2P 之 UDP穿透NAT的原理與實現(附源代碼)》比較有實際意義,可惜又是用UDP實現的,無奈只好找了份英文資料啃,發現很有參考價值,就根據理解翻譯了一部分,分享給大家,由於水平有限,有錯望多多包涵。如果有人能夠繼續翻譯下去別忘了通知我哦呵呵,[email protected],感謝。
摘要
防火牆和網路地址轉換(NAT)設備對於傳統的P2P協議存在一定的問題。一些中間設備抑制了來自外部網路到內部網路的TCP請求,這篇文章的目的就是尋找一個能夠在兩個NAT設備內部的主機間建立TCP連接的方法。我們已經在兩個普通的硬體條件下實現了這個功能。
1.入門
由於32位IP地址的減少,現在出現了很多通過一個internet地址代理內部網路上網的設備,這就是NAT技術。這些設備對於INTERNET已經越來越重要了,但是它們的獨立發展因為缺乏標准而對現在的internet協議造成危害。
2.技術
典型的NAT和防火牆設備都是不允許外部地址主動請求而進入內部網路的,如果用戶的程序需要在兩個內部網路間建立直接性的連接,那麼兩個內部設備之間必須是相互信任的。如果A和B兩個部分都初始化了TCP連接,NAT設備就會認為它們之間是相互信任的,也就允許它們之間的連接了。
圖1是一個例子,目標是能夠讓A和B(分別在NATA和NATB後)建立TCP連接。
我們討論了多種在特定的NAT設備環境下的TCP連接方案。
如果我們的情況如下:
1、可預測NA的埠,可預測NB的埠,可指定源IP的特定路由
2、可預測NA的埠,可預測NB的埠,不可指定源IP的特定路由
3、隨機的NA埠,可預測NB的埠,可指定源IP的特定路由
4、隨機的NA埠,可預測NB的埠,不可指定源IP的特定路由
5、隨機的NA埠,隨機的NB埠,可指定源IP的特定路由
6、隨機的NA埠,隨機的NB埠,不可指定源IP的特定路由
我們必須作出這4種假設:
1、 兩個主機都不受NAT設備所限制;
2、 我們可以配置網路設備使得主機看不到來自外部網路的ICMP包(TTL超過限制),因為這些ICMP數據包無論被任何一方接收到都是中斷TCP連接。我們討論的一些解決方案就依賴通過發送一個初始TTL很小的SYN包來建立TCP連接。一旦SYN包被路由器丟棄,ICMP TTL 超時包就會被傳送到NAT設備,我們不允許NAT設備將這個超時TTL的返回包傳送到內部網路,即使NAT會將這個包傳送到內部,也需要通過配置防火牆來限制這個包到達主機;
3、 即使NAT設備看到ICMP超時的數據包,設備本身的映射表將不會作任何改動;
4、 內部網路的其它主機不會佔用搶占這個埠,因為如果網路特別繁忙,這個埠可能會無效。
3.1第一種情況
我們可以通過圖2表示的順序解決問題:
1)A和B可以設定LSR(IP報頭中的一個選項)通過X路由發送SYN數據包.
2)X可以緩存它們的數據包並且發送欺騙的SYN+ACKS給NA和NB.
3)A和B可以通過由X發送來的數據進行應答.
4)X丟棄這兩個ACK包,因為它已經可以確定A和B相互應答成功.
圖2是假設A和B都事先彼此的NAT的通信埠,A知道B的通信埠是NB:5000,B知道A的是NA:4000,並且要求X不在任何NAT設備的後面.實際中這兩個埠是預測得到的,預測過程如圖3:
3.2第二種情況
第一種情況依賴與自由設定路由,但是現在很多路由器大多都限制這樣做,並且會丟棄這樣的服務請求包。因此在實際應用中,這種方案失敗的可能性很大。如果自由設定路由不可行,我們可以通過out-of-band通道(他們預先與X連接好的TCP連接)來傳送原本必須將數據包路由到X才能看到的包。注意在圖二的第二步X已經知道了TCP的序號Q和P,因為X已經收到了這兩個SYN包,但是如果數據包沒有路由經過X就不可能收到它們。為了初始化這個連接,兩個主機發送初始SYN包,並且他們都知道是不可能到達目標的,但是它們都可以記住自己的SYN號(個人看法,通過鉤子獲得發送的數據SYN包)並且可以發送給X,X得到了它們的SYN包,就可以欺騙它們發送ACK包了。有兩種方法可以發送無法到達目標的數據包。簡單的方法就是每個主機發送一個SYN給對方,要求應答包不會到達內部網路.如果NAT(防火牆)會將應答包傳回給內部網路,通常是發送TCP的reset包(RST),如果NAT生成RST包,A和B就不能簡單地發送一個向圖2中SYN給彼此,因為如果這樣NA和NB就無法打洞了呵呵,如果NAT不發送RST包,那麼這個TCP連接就不會被中斷。另外一個發送無法到達目標網路的SYN包的方法是減小TTL值,使它們無法彼此到達。如果用戶無法配置防火牆丟棄這個ICMP應答包,或者NAT不繼續傳送這個ICMP,這個TCP就不會立即關閉。這個解決方案不能使用一種簡單的欺騙,因為我們必須保證源地址的SYN包發送者不會沒有收到ICMP的RST包,否則會導致中間設備建立錯誤路由.僅僅依靠SYN包,NAT就可以建立從internet IP和埠到外部IP和埠的路由.由於欺騙的SYN包是錯誤的源IP(並非發出者X),這個路由將不會發送到X而是發送到NA或者NB。另外,這種方案都需要設置TTL到足夠小,以便於對方的NAT不會收到到各自發出的初始SYN包,否則就無法完成打洞。(圖4)
3.3第三種情況
比前兩種簡單,但是X將無法預見NA或者NB的埠。B將先給X發送一個SYN包告訴以便於X知道它所選用的埠號,然後X將這個信息發送到A,A就可以向這個確定的地址和埠發送SYN,圖5是第一種情況的變形::
1)X向圖3一樣預測埠,但是它不能預測到NA的下一個埠號,但是可以預測NB的下一個埠號是5000,並且可以通知A和B這個節點已經建立了連接;
2)A和B同步節點X;
3)X可以欺騙A和B;
4)A和B相互發送ACK;
5)X丟棄發給它的ACK,因為它已經可以確認它們已經建立連接。
××××××××××××××××
第三種:實現vpn,通過安全的虛擬連接實現,而這樣的話就不存在穿透問題,因為vpn是個虛擬網路,tcp在其中是被信任的。
『捌』 UDP P2P 穿越 NAT 的問題
AB已經通了,你又把AC和BC都打通了,當然是三者都通了。
如果AB通後只把AC或者BC其中一組打通,那麼根據Cone NAPT的原則:
只要本地綁定的UDP埠相同, 發出的目的地址不管是否相同, 都使用同一個Session.三者也是通的。
希望你不要碰到Symmetric NAPT
『玖』 廣域網實現p2p文件傳輸 如何實現nat穿透 求java或C++源代碼
假設有兩台分別處於各自的私有網路中的主機:A和B;N1和N2是兩個NAT設備;S是一個使用了一個眾所周知的、從全球任何地方都能訪問得到的IP地址的公共伺服器
步驟一:A和B分別和S建立UDP連接;NAT設備N1和N2創建UDP轉換狀態並分配臨時的外部埠號
步驟二:S將這些埠號傳回A和B
步驟三:A和B通過轉換好的埠直接聯繫到對方的NAT設備;NAT設備則利用先前創建的轉換狀態將分組發往A和B
源碼已發送請查收
『拾』 TCP 可以像UDP那樣穿透NAT嗎 為什麼
tcp可靠性保證來源於它的滑動窗口
udp也可以在高層實現類似機制
tcp和udp 都是基於ip 而ip是不可靠協議(盡最大努力傳輸)。
所以我們在傳輸層看到tcp 源源不斷的將數據傳過來 ,其實在網路層說不定有很大一部分包都經過了重傳的。
轉載的!!!!!!!!!!!!!!!!!!