P2P之UDP穿透的簡單實現方式

2021-06-29 06:26:22 字數 2349 閱讀 3674

full cone nat:

內網主機建立乙個udpsocket(localip:localport) 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網(publicip:publicport),以後用這個socket向外面任何主機傳送資料都將使用這對(publicip:publicport)。此外,任何外部主機只要知道這個(publicip:publicport)就可以傳送資料給(publicip:publicport),內網的主機就能收到這個資料報

restricted cone nat:

內網主機建立乙個udpsocket(localip:localport) 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網(publicip:publicport),以後用這個socket向外面任何主機傳送資料都將使用這對(publicip:publicport)。此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(publicip:publicport)並且內網主機之前用這個socket曾向這個外部主機ip傳送過資料。只要滿足這兩個條件,這個外部主機就可以用自己的(ip,任何埠)傳送資料給(publicip:publicport),內網的主機就能收到這個資料報

port restricted cone nat:

內網主機建立乙個udpsocket(localip:localport) 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網(publicip:publicport),以後用這個socket向外面任何主機傳送資料都將使用這對(publicip:publicport)。此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(publicip:publicport)並且內網主機之前用這個socket曾向這個外部主機(ip,port)傳送過資料。只要滿足這兩個條件,這個外部主機就可以用自己的(ip,port)傳送資料給(publicip:publicport),內網的主機就能收到這個資料報

symmetric nat:

內網主機建立乙個udpsocket(localip,localport),當用這個socket第一次發資料給外部主機1時,nat為其對映乙個(publicip-1,port-1),以後內網主機傳送給外部主機1的所有資料都是用這個(publicip-1,port-1),如果內網主機同時用這個socket給外部主機2傳送資料,第一次傳送時,nat會為其分配乙個(publicip-2,port-2), 以後內網主機傳送給外部主機2的所有資料都是用這個(publicip-2,port-2).如果nat有多於乙個公網ip,則publicip-1和publicip-2可能不同,如果nat只有乙個公網ip,則port-1和port-2肯定不同,也就是說一定不能是publicip-1等於 publicip-2且port-1等於port-2。此外,如果任何外部主機想要傳送資料給這個內網主機,那麼它首先應該收到內網主機發給他的資料,然後才能往回傳送,否則即使他知道內網主機的乙個(publicip,port)也不能傳送資料給內網主機,這種nat無法實現udp-p2p通訊。

此處我將nat分為兩類,conenat和symmetricnat。

設定a為內網裝置,s為公網伺服器,s開放兩個埠a1和a2用於nat檢測,檢測實現過程如下:

1)   a向s1傳送udp訊息,s1記錄收到udp訊息的a1(ip,port),將udp訊息ip和port傳送給a

2)   a向s2傳送udp訊息,s2記錄收到udp訊息的a2(ip,port),將udp訊息ip和port傳送給a

3)   比較a1和a2,若相同,則為conenat;不同,則為symmetricnat

nat型別判斷成功之後,就可按照下面的方式進行通訊了

a.   conenat借助伺服器採用p2p方式

設定a和b為不同內網裝置,s為公網伺服器,p2p實現過程如下:

1)   a,b定時向s傳送心跳包,間隔為50秒,s取得a和b的網路資訊a(ip:port),b(ip,port)

2)   a向b傳送udp訊息(此訊息b無法收到)

3)   b向a傳送udp訊息(此訊息a可以收到)

4)   a,b通訊建立,保持50秒內有相互的udp資訊交流,即需要建立a和b之間的心跳

b.   symmetricnat採用伺服器中轉方式

設定a和b為內網裝置,s為中轉伺服器,中轉實現方式如下

1)   a,b定時向s傳送心跳包,間隔為50秒,s取得a和b的網路資訊a(ip:port),b(ip,port)

2)   a傳送udp資訊給s,s傳送到b(ip,port)

3)   b傳送udp資訊給s,s傳送到a(ip:port)

4)   通訊成功

P2P 之 UDP穿透NAT的原理與實現

原創 shootingstars 參考 http midcom p2p.sourceforge.net draft ford midcom p2p 01.txt 論壇上經常有對p2p原理的討論,但是討論歸討論,很少有實質的東西產生 源 呵呵,在這裡我就用自己實現的乙個源 來說明udp穿越nat的原理...

P2P之UDP穿透NAT的原理與實現

nat network address translators 網路位址轉換 網路位址轉換是在ip位址日益缺乏的情況下產生的,它的主要目的就是為了能夠位址重用。nat分為兩大類,基本的nat和napt network address port translator 最開始nat是執行在路由器上的乙個...

P2P之UDP穿透NAT的原理與實現 補充)

這是另乙個位作者的補充 p2p原理的解釋與實現 關鍵字 p2p nat 打洞 關於採用udp協議進行打洞以進行p2p會話的原理,我本來想寫一篇文章作說明,但是現在已經有一篇文章把原理性的東西解釋清楚了,我在這裡不再作這部分的重複,可以參見這裡 p2p 之 udp穿透nat的原理與實現 附源 下面解釋...