導航:首頁 > 操作系統 > androidudp穿透

androidudp穿透

發布時間:2022-11-21 10:26:03

android 基於UDP的Socket通信

1、連接DatagramSocket的服務端(ip和port):開啟非同步線程和socket
2、發送數據(DatagramPacket):非同步
3、接收數據(DatagramPacket):注意連接狀態,非同步讀取
4、關閉連接:關閉DatagramSocket和對應線程

1、異常:android.os.NetworkOnMainThreadException。 socket需要在線程中使用
2、前後端統一傳輸或者接收協議 [requestcode size d1 d2 d3 ... ],在解析時候用得到
3、實施監控socket的連接狀態,還是用心跳包發過去,然後返回數據,一段時間沒有的話則代表socket連接失敗。
4、注意receive接收數據後的有效長度(一個是預存的buffer,一個是有效結果buffer)
5、客戶端連上去後不知道為何一定要先發送一次,才能接收?
6、UDP不安全,有長度限制64K

2019 (* ̄(oo) ̄) 諸事順利!

❷ UDP 做穿透後P2P傳輸實時視頻丟包,求助

udp丟包是必然的,既然你有成功的時候說明打孔是能夠成功的,一般情況下udp數據包都會有重傳機制。比如rtcp協議就是對rtp協議的重傳處理。如果你不想搞這么麻煩,那麼比較簡單的一種方式就是打孔數據包隔1秒重發一次,2次的丟失概率總比1次小。

❸ android接收不到udp包嗎

1、有的手機不能直接接收UDP包,可能是手機廠商在定製Rom的時候把這個功能給關掉了。 2、在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。

❹ android udp內網穿透過程中怎麼獲得內網的ip與埠

sub————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————1825909621918259096219

❺ udp協議怎麼穿透Symmetric NAT

這個穿透是指,當設備檢測到報文是udp時,會建立一個port mapping埠映射,以便於區分內網的用戶,這個映射同樣會指向外網ip的一個埠

❻ 網路人無需做埠映射,採用UDP協議可穿透內網,是什麼原理高手指教

是雙方都要安裝軟體,,,等於被控端會告訴你對方的IP。輸入即可,或者輸入會員號就可以進行遠程式控制制,可以看對方的屏幕,控制對方的滑鼠鍵盤,也可以開對方的攝象頭進行監控。軟體使用UDP協議穿透內網,不用做埠映射,用戶就能在任何一台可以上網的電腦都連接遠端電腦,進行遠程辦公和遠程管理。它是正規合法的軟體,不會被殺毒軟體當作病毒查殺,不會影響系統的穩定性

❼ 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穿透(UDP打洞)

NAT有兩大類,基本NAT和NAPT。

靜態NAT:一個公網IP對應一個內部IP,一對一轉換

動態NAT:N個公網IP對應M個內部IP,不固定的一對一轉換關系

現在基本使用這種,又分為對稱和錐型NAT。

錐型NAT ,有完全錐型、受限制錐型、埠受限制錐型三種:

對稱NAT

把所有來自相同內部IP地址和埠號,到特定目的IP地址和埠號的請求映射到相同的外部IP地址和埠。如果同一主機使用不同的源地址和埠對,發送的目的地址不同,則使用不同的映射。只有收到了一個IP包的外部主機才能夠向該內部主機發送回一個UDP包。對稱的NAT不保證所有會話中的(私有地址,私有埠)和(公開IP,公開埠)之間綁定的一致性。相反,它為每個新的會話分配一個新的埠號。

對稱NAT是一個請求對應一個埠,非對稱NAT是多個請求對應一個埠(象錐形,所以叫Cone NAT)。

連接伺服器為A,NAT檢測伺服器為B。

第一步:當一個接收客戶端(Endpoint-Receiver ,簡稱 EP-R)需要接收文件信息時,在其向連接伺服器發送文件請求的同時緊接著向檢測伺服器發送NAT檢測請求。此處再次強調是「緊接著」,因為對於對稱型NAT來說,這個操作可以直接算出其地址分配的增量(⊿p)。

第二步:當EP-R收到A或B的反饋信息時發現其外部地址與自身地址不同時就可以確定自己在NAT後面;否則,就是公網IP。

第三步:由伺服器A向B發送其獲得的EP-R的外部映射地址(IPa/Porta),伺服器B獲得後進行比較,如果埠不同,則說明這是對稱型NAT,同時可以直接計算出其分配增量:

⊿p=Portb-Porta

第四步:如果埠號相同,則由B向EP-R的Porta發送連接請求,如果EP-R有響應,則說明EP-R沒有IP和Port的限制,屬於全ConeNAT類型。

第五步:如果沒有響應,則由伺服器B使用其新埠b』向EP-R的Portb埠發送連接請求,如果有響應,則說明EP-R只對IP限制,屬於限制性ConeNAT類型;否則就是對IP和port都限制,屬於埠限制性ConeNAT類型。

通過上述五步基本可以全部檢測出EP-R是否在公網,還是在某種NAT後面。

這也是一項可選配置任務,可根據需要為NAT 地址映射表配置老化時間,以控制用戶對NAT 配置的使用,確保內、外網的通信安全。

配置NAT 地址映射表項老化時間的方法也很簡單,只須在系統視圖下使用firewall-nat session { dns | ftp | ftp-data | http | icmp | tcp | tcp-proxy | udp | sip | sip-media | rtsp |rtsp-media }aging-time time-value 命令配置即可。參數 time-value的取值范圍為1~65 535的整數秒。如果要配置多個會話表項的超時時間需要分別用本命令配置。

預設情況下,各協議的老化時間為:DNS(120 s)、ftp(120 s)、ftp-data(120 s)、HTTP(120 s)、icmp(20 s)、tcp(600 s)、tcp-proxy(10 s)、udp(120 s)、sip(1 800 s)、sip-media ( 120 s )、rtsp ( 60 s )、rtsp-media ( 120 s ), 可用undo firewall-natsession { all | dns | ftp | ftp-data | http | icmp | tcp | tcp-proxy | udp | sip | sip-media | rtsp |rtsp-media } aging-time 命令恢復對應會話表項的超時時間為預設值。

1、 中間伺服器保存信息、並能發出建立UDP隧道的命令

2、 網關均要求為Cone NAT類型。Symmetric NAT不適合。

3、 完全圓錐型網關可以無需建立udp隧道,但這種情況非常少,要求雙方均為這種類型網關的更少。

4、 假如X1網關為Symmetric NAT, Y1為Address Restricted Cone NAT 或Full Cone NAT型網關,各自建立隧道後,A1可通過X1發送數據報給Y1到B1(因為Y1最多隻進行IP級別的甄別),但B2發送給X1的將會被丟棄(因為發送來的數據報中埠與X1上存在會話的埠不一致,雖然IP地址一致),所以同樣沒有什麼意義。

5、 假如雙方均為Symmetric NAT的情形,新開了埠,對方可以在不知道的情況下嘗試猜解,也可以達到目的,但這種情形成功率很低,且帶來額外的系統開支,不是個好的解決辦法。

6、 不同網關型設置的差異在於,對內會採用替換IP的方式、使用不同埠不同會話的方式,使用相同埠不同會話的方式;對外會採用什麼都不限制、限制IP地址、限制IP地址及埠。

7、 這里還沒有考慮同一內網不同用戶同時訪問同一伺服器的情形,如果此時網關採用AddressRestricted Cone NAT 或Full Cone NAT型,有可能導致不同用戶客戶端可收到別人的數據包,這顯然是不合適的。

為什麼網上講到的P2P打洞基本上都是基於UDP協議的打洞?難道TCP不可能打洞?還是TCP打洞難於實現?
假設現在有內網客戶端A和內網客戶端B,有公網服務端S。
如果A和B想要進行UDP通信,則必須穿透雙方的NAT路由。假設為NAT-A和NAT-B。

S也和A B 分別建立了會話,由S發到NAT-A的數據包會被NAT-A直接轉發給A,
由S發到NAT-B的數據包會被NAT-B直接轉發給B,除了S發出的數據包之外的則會被丟棄。
所以:現在A B 都能分別和S進行全雙工通訊了,但是A B之間還不能直接通訊。

並轉發給A了(即B現在能訪問A了);再由S命令B向A的公網IP發送一個數據包,則
NAT-B能接收來自NAT-A的數據包並轉發給B了(即A現在能訪問B了)。

以上就是「打洞」的原理。

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word;">為了保證A的路由器有與B的session,A要定時與B做心跳包,同樣,B也要定時與A做心跳,這樣,雙方的通信通道都是通的,就可以進行任意的通信了。</pre>

API造成的。
UDP的socket允許多個socket綁定到同一個本地埠,而TCP的socket則不允許。
這是這樣一個意思:A B要連接到S,肯定首先A B雙方都會在本地創建一個socket,
去連接S上的socket。創建一個socket必然會綁定一個本地埠(就算應用程序裡面沒寫
埠,實際上也是綁定了的,至少java確實如此),假設為8888,這樣A和B才分別建立了到
S的通信信道。接下來就需要打洞了,打洞則需要A和B分別發送數據包到對方的公網IP。但是
問題就在這里:因為NAT設備是根據埠號來確定session,如果是UDP的socket,A B可以
分別再創建socket,然後將socket綁定到8888,這樣打洞就成功了。但是如果是TCP的
socket,則不能再創建socket並綁定到8888了,這樣打洞就無法成功。

**UDP打洞**的過程大致如此:

1、雙方都通過UDP與伺服器通訊後,網關默認就是做了一個外網IP和埠號 與你內網IP與埠號的映射,這個無需設置的,伺服器也不需要知道客戶的真正內網IP

2、用戶A先通過伺服器知道用戶B的外網地址與埠

3、用戶A向用戶B的外網地址與埠發送消息,

4、在這一次發送中,用戶B的網關會拒收這條消息,因為它的映射中並沒有這條規則。

5、但是用戶A的網關就會增加了一條允許規則,允許接收從B發送過來的消息

6、伺服器要求用戶B發送一個消息到用戶A的外網IP與埠號

7、用戶B發送一條消息,這時用戶A就可以接收到B的消息,而且網關B也增加了允許規則

8、之後,由於網關A與網關B都增加了允許規則,所以A與B都可以向對方的外網IP和埠號發送消息。

TCP打洞 技術:
tcp打洞也需要NAT設備支持才行。
tcp的打洞流程和udp的基本一樣,但tcp的api決定了tcp打洞的實現過程和udp不一樣。
tcp按cs方式工作,一個埠只能用來connect或listen,所以需要使用埠重用,才能利用本地nat的埠映射關系。(設置SO_REUSEADDR,在支持SO_REUSEPORT的系統上,要設置這兩個參數。)

連接過程:(以udp打洞的第2種情況為例(典型情況))
nat後的兩個peer,A和B,A和B都bind自己listen的埠,向對方發起連接(connect),即使用相同的埠同時連接和等待連接。因為A和B發出連接的順序有時間差,假設A的syn包到達B的nat時,B的syn包還沒有發出,那麼B的nat映射還沒有建立,會導致A的連接請求失敗(連接失敗或無法連接,如果nat返回RST或者icmp差錯,api上可能表現為被RST;有些nat不返回信息直接丟棄syn包(反而更好)),(應用程序發現失敗時,不能關閉socket,closesocket()可能會導致NAT刪除埠映射;隔一段時間(1-2s)後未連接還要繼續嘗試);但後發B的syn包在到達A的nat時,由於A的nat已經建立的映射關系,B的syn包會通過A的nat,被nat轉給A的listen埠,從而進去三次握手,完成tcp連接。

從應用程序角度看,連接成功的過程可能有兩種不同表現:(以上述假設過程為例)
1、連接建立成功表現為A的connect返回成功。即A端以TCP的同時打開流程完成連接。
2、A端通過listen的埠完成和B的握手,而connect嘗試持續失敗,應用程序通過accept獲取到連接,最終放棄connect(這時可closesocket(conn_fd))。
多數Linux和Windows的協議棧表現為第2種。

但有一個問題是,建立連接的client端,其connect綁定的埠號就是主機listen的埠號,或許這個peer後續還會有更多的這種socket。雖然理論上說,socket是一個五元組,埠號是一個邏輯數字,傳輸層能夠因為五元組的不同而區分開這些socket,但是是否存在實際上的異常,還有待更多觀察。

1、Windows XP SP2操作系統之前的主機,這些主機不能正確處理TCP同時開啟,或者TCP套接字不支持SO_REUSEADDR的參數。需要讓AB有序的發起連接才可能完成。

上述tcp連接過程,僅對NAT1、2、3有效,對NAT4(對稱型)無效。
由於對稱型nat通常採用規律的外部埠分配方法,對於nat4的打洞,可以採用埠預測的方式進行嘗試。

ALG(應用層網關) :它可以是一個設備或插件,用於支持SIP協議,主要類似與在網關上專門開辟一個通道,用於建立內網與外網的連接,也就是說,這是一種定製的網關。更多隻適用於使用他們的應用群體內部之間。

UpnP :它是讓網關設備在進行工作時尋找一個全球共享的可路由IP來作為通道,這樣避免埠造成的影響。要求設備支持且開啟upnp功能,但大部分時候,這些功能處於安全考慮,是被關閉的。即時開啟,實際應用效果還沒經過測試。

STUN(Simple Traversalof UDP Through Network): 這種方式即是類似於我們上面舉例中伺服器C的處理方式。也是目前普遍採用的方式。但具體實現要比我們描述的復雜許多,光是做網關Nat類型判斷就由許多工作,RFC3489中詳細描述了。

TURN(Traveral Using Relay NAT): 該方式是將所有的數據交換都經由伺服器來完成,這樣NAT將沒有障礙,但伺服器的負載、丟包、延遲性就是很大的問題。目前很多游戲均採用該方式避開NAT的問題。這種方式不叫p2p。

ICE(Interactive Connectivity Establishment): 是對上述各種技術的綜合,但明顯帶來了復雜性。

❾ 如何使 TCP包和 UDP包穿透網路防火牆

舉例如下:
A主機系統在防火牆之後,受防火牆保護,防火牆配置的訪問控制原則是只允許80埠的數據進出,B主機系統在防火牆之外,是開放的。現在假設需要從A系統Telnet到B系統上去,使用正常的telnet肯定是不可能了,但知道可用的只有80埠,那麼這個時候使用Httptunnel通道,就是一個好的辦法。
思路如下:
在A機器上起一個tunnel的client端,讓它偵聽本機的一個不被使用的任意指定埠,如1234,同時將來自1234埠上的數據指引到遠端(B機)的80埠上(注意,是80埠,防火牆允許通過),然後在B機上起一個server,同樣掛接在80埠上,同時指引80埠的來自client的轉發到本機的telnet服務埠23,這樣就可以了。
現在在A機上telnet本機埠1234,根據剛才的設置數據包會被轉發到目標埠為80的B機,因為防火牆允許通過80埠的數據,因此數據包暢通的穿過防火牆,到達B機。此時B機在80埠偵聽的進程收到來自A的數據包,會將數據包還原,再交還給telnet進程。當數據包需要由B到A返回時,將由80埠再回送,同樣可以順利的通過防火牆。

❿ 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,雙方無法知道對方的埠,無法通信。

閱讀全文

與androidudp穿透相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163