最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

p2p打洞源碼,p2p內(nèi)網(wǎng)穿透源碼,NAT內(nèi)網(wǎng)穿透源碼,NAT穿透源碼

2023-06-09 17:27 作者:bili_45795611610  | 我要投稿

一、p2p是什么?

p2p是點(diǎn)對(duì)點(diǎn)的縮寫(peer-to-peer networking),其可以定義為:端對(duì)端的資源共享,每一端即可是服務(wù)端,也可以是客戶端。既可以是資源的提供者,也可以是資源的共享者。傳統(tǒng)C/S模型需要實(shí)現(xiàn)端和端的資源共享, 需要將資源上傳到服務(wù)器,然后另外一端再從轉(zhuǎn)服務(wù)器下載,如下圖所示:

而P2P則不需要將資源上傳到服務(wù)器,它是端對(duì)端傳輸,每一個(gè)端點(diǎn)既可以是服務(wù)器,也可以是客戶端。采用p2p之后,端點(diǎn)之間的實(shí)時(shí)性最高,無需服務(wù)器中轉(zhuǎn),不占服務(wù)器寬帶,通信更加安全。在視頻直播,在線教育,視頻監(jiān)控,安防行業(yè)用的比較多。p2p架構(gòu)如下圖所示:

p2p模式支持同一個(gè)內(nèi)網(wǎng)的端點(diǎn)之間直接互傳數(shù)據(jù),如上圖的客戶端B和客戶端C,這種方式數(shù)據(jù)傳輸是最短最快的。


同時(shí)也支持不同內(nèi)網(wǎng)的端點(diǎn)之間直接互傳數(shù)據(jù),如上圖的客戶端A與 客戶端B、客戶端A客戶端C之間,這時(shí)數(shù)據(jù)首先會(huì)到達(dá)NAT1,然后再到NAT2,最后到達(dá)客戶端B或客戶端C。


二、NAT是什么

NAT全稱是網(wǎng)絡(luò)地址轉(zhuǎn)換,它是一種把內(nèi)部私有網(wǎng)絡(luò)地址(IP地址)轉(zhuǎn)換成公網(wǎng)網(wǎng)絡(luò)IP地址的技術(shù)。比如我們電腦里面網(wǎng)卡地址是192.168.1.10,但是我們?cè)侔俣人阉鳌拔业腎P”卻顯示210.12.214.53,這就是NAT的功能。NAT主要是部署在路由器或者交換機(jī)上。


三、為什么需要NAT

NAT是Network Address Translation的縮寫,也就是網(wǎng)絡(luò)地址轉(zhuǎn)換的意思?,F(xiàn)在大多數(shù)設(shè)備的網(wǎng)絡(luò)采用的是ipv4網(wǎng)絡(luò),ipv4中ip的定義為x.x.x.x,其中每一位為0-255,所以全球的ip總數(shù)256^4,這個(gè)數(shù)量是不足夠全球使用的,為了保證每個(gè)人都能有ip使用,NAT技術(shù)誕生了。


使用NAT將有助于減緩可用的IP地址空間的枯竭。比如你有一個(gè)路由器(家用的那種就可以)這個(gè)路由器本身連接了公網(wǎng)(被分配到了一個(gè)公網(wǎng)的IP地址)。路由器后面有接了N多個(gè)設(shè)備,每個(gè)設(shè)備都分配到了一個(gè)私有的地址(內(nèi)網(wǎng)地址),這些地址可以通過這個(gè)路由器和外網(wǎng)交互。使用NAT還有能避免來自網(wǎng)絡(luò)外部的攻擊,隱藏并保護(hù)網(wǎng)絡(luò)內(nèi)部的計(jì)算機(jī)。


四、NAT有哪些類型

NAT有4個(gè)類型,它們分別是:NAT1、NAT2、NAT3、NAT4。從 NAT1 至 NAT4 限制越來越多。


1. 完全圓錐形NAT(Full Cone NAT)


完全圓錐型NAT把一個(gè)來自內(nèi)部IP地址和端口的所有請(qǐng)求,始終映射到相同的外網(wǎng)IP地址和端口;同時(shí),任意外部主機(jī)向該映射的外網(wǎng)IP地址和端口發(fā)送報(bào)文,都可以實(shí)現(xiàn)和內(nèi)網(wǎng)主機(jī)進(jìn)行通信,就像一個(gè)向外開口的圓錐形一樣,故得名。

這種模式很寬松,限制小,只要內(nèi)網(wǎng)主機(jī)的IP地址和端口與公網(wǎng)IP地址和端口建立映射關(guān)系,所有互聯(lián)網(wǎng)上的主機(jī)都可以訪問該NAT之后的內(nèi)網(wǎng)主機(jī)。


2. 地址限制式圓錐形NAT(Address Restricted Cone NAT)


地址限制式圓錐形NAT同樣把一個(gè)來自內(nèi)部IP地址和端口的所有請(qǐng)求,始終映射到相同的外網(wǎng)IP地址和端口;與完全圓錐型NAT不同的是,當(dāng)內(nèi)網(wǎng)主機(jī)向某公網(wǎng)主機(jī)發(fā)送過報(bào)文后,只有該公網(wǎng)主機(jī)才能向內(nèi)網(wǎng)主機(jī)發(fā)送報(bào)文,故得名。相比NAT1,NAT2 增加了地址限制,也就是IP受限,而端口不受限。


如下圖所示,地址限制圓錐型NAT(Address Restricted Cone NAT)會(huì)將客戶機(jī)地址{X:y}轉(zhuǎn)換成公網(wǎng)地址{A:b}并綁定,只有來自主機(jī){P}的包才能和主機(jī){X:y}通信。

3. 端口限制式圓錐形NAT(Port Restricted Cone NAT)


端口限制式圓錐形NAT更加嚴(yán)格,在上述條件下,只有該公網(wǎng)主機(jī)該端口才能向內(nèi)網(wǎng)主機(jī)發(fā)送報(bào)文,故得名。相比NAT2,NAT3 又增加了端口限制,也就是說IP、端口都受限。

端口限制圓錐型NAT(Port Restricted Cone NAT)會(huì)將客戶機(jī)地址{X:y}轉(zhuǎn)換成公網(wǎng)地址{A:b}并綁定,只有來自主機(jī){P,q}的包才能和主機(jī){X:y}通信。如下圖所示:


4. 對(duì)稱式NAT(Symmetric NAT)


對(duì)稱式NAT把內(nèi)網(wǎng)IP和端口到相同目的地址和端口的所有請(qǐng)求,都映射到同一個(gè)公網(wǎng)地址和端口;同一個(gè)內(nèi)網(wǎng)主機(jī),用相同的內(nèi)網(wǎng)IP和端口向另外一個(gè)目的地址發(fā)送報(bào)文,則會(huì)用不同的映射(比如映射到不同的端口)。如下圖所示:

對(duì)稱型NAT(Symmetric NAT)會(huì)將客戶機(jī)地址{X:y}轉(zhuǎn)換成公網(wǎng)地址{A:b}并綁定為{X:y}|{A:b}<->{P:q}。對(duì)稱型NAT只接受來自{P:q}的incoming packet,將它轉(zhuǎn)給{X:y} ,每次客戶機(jī)請(qǐng)求一個(gè)不同的公網(wǎng)地址和端口,NAT會(huì)新分配一個(gè)端口號(hào){C,d} 。


和端口限制式NAT不同的是,端口限制式NAT是所有請(qǐng)求映射到相同的公網(wǎng)IP地址和端口,而對(duì)稱式NAT是為不同的請(qǐng)求建立不同的映射。


它具有端口受限錐型的受限特性,內(nèi)部地址每一次請(qǐng)求一個(gè)特定的外部地址,都可能會(huì)綁定到一個(gè)新的端口號(hào)。也就是請(qǐng)求不同的外部地址映射的端口號(hào)是可能不同的。


五.如何穿透NAT

目前主流的幾種解決方式有ALG、STUN、TURN、ICE,我們分別來介紹它們的工作原理及工作流程


1、ALG

ALG是指能識(shí)別特定應(yīng)用層協(xié)議(如SIP、H.323或MGCP協(xié)議)的防火墻。它不是簡單地查看分組首部信息來解決數(shù)據(jù)分組是否可以通過,而是更深層地分析負(fù)載內(nèi)容的數(shù)據(jù),也就是應(yīng)用層的數(shù)據(jù)。SIP和H.323協(xié)議都在負(fù)載中放了重要的控制信息。通過分析哪一個(gè)端口需要打開。防火墻動(dòng)態(tài)的打開那些被應(yīng)用的端口,而所有別的端口依然安全地保持關(guān)閉狀態(tài)。ALG是支持VOIP應(yīng)用最簡單的一種方式,但該方案的缺點(diǎn)非常明顯:每增加一種新的應(yīng)用都將需要對(duì) NAT/Firewall進(jìn)行升級(jí)。在安全要求上還需要作一些折衷,因?yàn)锳LG 不能識(shí)別加密后的報(bào)文內(nèi)容,所以必須保證報(bào)文采用明文傳送,這使得報(bào)文在公網(wǎng)中傳送時(shí)有很大的安全隱患。SIP響應(yīng)消息用于對(duì)請(qǐng)求消息進(jìn)行響應(yīng),指示呼叫或注冊(cè)的成功或失敗狀態(tài)。在請(qǐng)求與響應(yīng)報(bào)文中需要進(jìn)行ALG處理的地址字段類型主要有:Via、Record_Route、Contact、SDP。


ALG處理流程為如下三個(gè)步驟:


首先,ALG根據(jù)會(huì)話標(biāo)識(shí)的協(xié)議類型對(duì)報(bào)文進(jìn)行解碼,若解碼發(fā)現(xiàn)報(bào)文為不需要做ALG或解碼發(fā)現(xiàn)為錯(cuò)誤字段時(shí)退出,解碼發(fā)現(xiàn)需進(jìn)行字段轉(zhuǎn)換時(shí)進(jìn)一步處理;其次,ALG查找接口上的NAT配置,根據(jù)NAT配置轉(zhuǎn)換報(bào)文中的IP地址、端口、call-id等信息并建立關(guān)聯(lián)表,關(guān)聯(lián)表記錄了載荷地址的轉(zhuǎn)換關(guān)系;最后,ALG調(diào)整報(bào)文載荷中的長度字段,如sip message header的content-length字段標(biāo)識(shí)message body的長度,ALG對(duì)message body中的地址轉(zhuǎn)換后,message body長度可能變化,content-length字段值需要置為變化后的值。


2、STUN

STUN的全稱是Simple Traversal of UDP Through NAT,即UDP對(duì)NAT的簡單穿越方式。是一種網(wǎng)絡(luò)協(xié)議它允許位于NAT(或多重NAT)后的客戶端找出自己的公網(wǎng)地址,查出自己位于哪種類型的NAT之后以及NAT為某一個(gè)本地端口所綁定的Internet端端口。這些信息被用來在兩個(gè)同時(shí)處于NAT 路由器之后的主機(jī)之間建立UDP通信。該協(xié)議由RFC 3489定義。 應(yīng)用程序(即STUN CLIENT)向NAT外的STUN SERVER通過UDP發(fā)送請(qǐng)求STUN 消息詢問自身的轉(zhuǎn)換后地址,


STUN SERVER收到請(qǐng)求消息,產(chǎn)生響應(yīng)消息,響應(yīng)消息中攜帶請(qǐng)求消息的源端口,即STUN CLIENT在NAT上對(duì)應(yīng)的外部端口。響應(yīng)消息通過NAT發(fā)送給STUN CLIENT,


STUN CLIENT通過響應(yīng)消息體中的內(nèi)容得知其在NAT上對(duì)應(yīng)的外部地址,并且將其填入以后呼叫協(xié)議的UDP負(fù)載中,告知對(duì)端,同時(shí)還可以在終端注冊(cè)時(shí)直接注冊(cè)這個(gè)轉(zhuǎn)換后的公有IP地址,這樣就解決SIP穿越NAT的通信建立問題以及作為被叫時(shí)的問題。


本端的接收地址和端口號(hào)為NAT外的地址和端口號(hào)。由于通過STUN協(xié)議已在NAT上預(yù)先建立媒體流的NAT映射表項(xiàng),故媒體流可順利穿越NAT。

3、TURN

TURN的全稱為Traversal Using RelayNAT,即通過Relay方式穿越NAT,TURN應(yīng)用模型通過分配TURNServer的地址和端口作為客戶端對(duì)外的接受地址和端口,即私網(wǎng)用戶發(fā)出的報(bào)文都要經(jīng)過TURNServer進(jìn)行Relay轉(zhuǎn)發(fā)。這種方式又稱SPAN(Simple Protocol for Augmenting NATs)方式. TURN方式解決NAT問題的思路與STUN相似,也是基于私網(wǎng)接入用戶通過某種機(jī)制預(yù)先得到其私有地址對(duì)應(yīng)在公網(wǎng)的地址(STUN方式得到的地址為出口NAT上的地址,TURN方式得到地址為TURNServer上的地址),然后在報(bào)文負(fù)載中所描述的地址信息直接填寫該公網(wǎng)地址的方式,實(shí)際應(yīng)用原理也是一樣的。這種方式除了具有STUN方式的優(yōu)點(diǎn)外,還解決了STUN應(yīng)用無法穿透對(duì)稱NAT(Symmetric NAT)以及類似的Firewall設(shè)備的缺陷,即無論企業(yè)網(wǎng)/駐地網(wǎng)出口為哪種類型的NAT/FW,都可以實(shí)現(xiàn)NAT的穿透,同時(shí)TURN支持基于TCP的應(yīng)用,如H323協(xié)議。此外TURN Server控制分配地址和端口,能分配RTP/RTCP地址對(duì)(RTCP端口號(hào)為RTP端口號(hào)加1)作為私網(wǎng)終端用戶的接受地址,避免了STUN方式中出口NAT對(duì)RTP/RTCP地址端口號(hào)的任意分配,使得客戶端無法收到對(duì)端發(fā)來的RTCP報(bào)文(對(duì)端發(fā)RTCP報(bào)文時(shí),目的端口號(hào)缺省按RTP端口號(hào)加 1發(fā)送)。

4、ICE

交互式連通建立方式ICE(Interactive Connectivity Establishment)并非一種新的協(xié)議,它不需要對(duì)STUN、TURN或RSIP進(jìn)行擴(kuò)展就可適用于各種NAT。ICE是通過綜合運(yùn)用上面某幾種協(xié)議,使之在最適合的情況下工作,以彌補(bǔ)單獨(dú)使用其中任何一種所帶來的固有缺陷。ICE跟STUN和TURN不一樣,ICE不是一種協(xié)議,而是一個(gè)framework,它整合了STUN和TURN。使用ICE方式穿透NAT,必須映射ICE定義的參數(shù)到SIP消息格式中,同時(shí)對(duì)其SDP屬性進(jìn)行簡單擴(kuò)展—在SDP的Media塊中定義一個(gè)新的屬性“alt”來支持ICE。它包含一個(gè)候選IP地址和端口,SDP的接受端可以用該地址來替換m和c中的地址。Media塊中可能會(huì)有多個(gè)alt屬性,這時(shí)每個(gè)alt應(yīng)該包括不重復(fù)的IP地址和端口。 對(duì)于SIP來說,ICE只需要定義一些SDP(Session Description Protocol)附加屬性即可,對(duì)于別的多媒體信令協(xié)議也需要制定一些相應(yīng)的機(jī)制來實(shí)現(xiàn)。其思想是:建立媒體流信道時(shí),發(fā)出很多種選擇,有本地端口,STUN端口,TURN端口,并給出這些端口的優(yōu)先級(jí),由被叫方自主選擇端口,根據(jù)一定的算法和聯(lián)通性測試,選出最好的端口來通信。

六.p2p打洞實(shí)測

下面通過兩個(gè)程序來測試p2p打洞并傳輸實(shí)時(shí)視頻流,一個(gè)作為播放端的p2pclient,另一個(gè)是提供rtsp視頻服務(wù)的p2pdevice,p2pclient和p2pdevice分別運(yùn)行于不同的內(nèi)網(wǎng)機(jī)器上。打洞成功后,p2pclient直接從p2pdevice獲取rtsp視頻流,并由vlc播放。


rtsp協(xié)議本身支持用udp或tcp傳輸實(shí)際的視頻流,由于我們的p2p底層是由udp實(shí)現(xiàn)的,因此為了簡單,我們這里配置vlc播放器使用tcp模式: 運(yùn)行VLC media player后 ,選擇工具—偏好設(shè)置—輸入/編解碼器。在最下面的live555流傳輸中選擇 RTP over RTSP (TCP), 如下圖:

下面先看程序p2pclient的代碼,以下示例代碼在windows下用vc2017或以上編譯并執(zhí)行。

CP2PHoleSink是一個(gè)回調(diào)類,打洞狀態(tài)發(fā)生變化時(shí)將回調(diào)此接口。

接著再看程序p2pdevice的代碼,以下示例代碼在windows下用vc2017或以上編譯并執(zhí)行。

CP2PHoleSink和p2pclient里面?定義一樣,是一個(gè)回調(diào)類,打洞狀態(tài)發(fā)生變化時(shí)將回調(diào)此接口。

p2pdevice編譯后運(yùn)行截圖:

p2pclient編譯后運(yùn)行截圖:


打洞成功后,就可以使用vcl media player來播放rtsp視頻了, 如有任何凝問,請(qǐng)加QQ群:384170753交流。


測試時(shí)必須先運(yùn)行p2pdevice程序,再運(yùn)行p2pclient程序,然后運(yùn)行vcl media player,打開vcl后,選擇 媒體—打開網(wǎng)絡(luò)串流—網(wǎng)絡(luò),輸入地址rtsp://127.0.0.1:49999/video/test.264,然后點(diǎn)“播放”按扭, 既可播放p2pdevice提供的視頻流。


p2p打洞源碼,p2p內(nèi)網(wǎng)穿透源碼,NAT內(nèi)網(wǎng)穿透源碼,NAT穿透源碼的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
信丰县| 纳雍县| 清苑县| 汝州市| 嘉义市| 郧西县| 嘉兴市| 兰西县| 固原市| 天柱县| 台中市| 普定县| 靖州| 福清市| 邻水| 岱山县| 福海县| 乌兰察布市| 长兴县| 杂多县| 汶川县| 淄博市| 龙州县| 满城县| 饶平县| 南江县| 保靖县| 宝兴县| 广灵县| 桐梓县| 鄂尔多斯市| 松溪县| 安丘市| 通州市| 阜阳市| 灵川县| 湘阴县| 剑阁县| 东明县| 海宁市| 海门市|