WebRTC | ICE詳解

目錄

一、Candidate種類與優先級

二、ICE策略

?1. iceServers?

2. iceTransportPolicy

三、P2P連接

1.Nat類型

(1)完全錐型NAT

(2)IP限制錐型NAT

(3)端口限制錐型NAT

(4)對稱型NAT

四、網絡中繼

1. TURN協議中轉數據

?(1)發送指令Send indication

(2)端對端傳輸數據


一、Candidate種類與優先級

????????ICE中使用的Candidate具有優先級次序,由高到低分別為host、srflx、prflx、relay。WebRTC進行一對一音視頻通信時,就是按照這個次序嘗試建立連接的。

????????不在同一局域網內,雙方嘗試host型Candidate連接時會失敗。不過,在雙方嘗試連接時,雙方Candidate的收集工作并未停止。Candidate收集線程還在收集其他類型的Candidate,如從STUN/TURN服務器收集srflx和relay類型的Candidate;當收集到srflx類型的Candidate時,ICE會嘗試NAT打洞,如果打洞成功,則雙方會通過P2P的方式傳輸數據;如果打洞失敗,則會通過TURN服務器中轉數據。

WebRTC通信時會按照內網、P2P、relay這樣的次序嘗試連接:

1. 內網連接對應host連接策略。host連接表示直接在本地設備上建立的連接,也就是在同一局域網內的設備之間的直接連接。
2. P2P連接對應srflx和prflx連接策略。srflx(server reflexive)和prflx(peer reflexive)連接都是通過STUN服務器獲取的公共IP地址,用于建立點對點連接。srflx連接是通過NAT后的公共IP地址建立的連接,而prflx連接是對等方自己的NAT映射地址。
3. 中繼連接對應relay連接策略。當無法建立直接的P2P連接時,WebRTC會使用TURN服務器作為中繼,建立relay連接。relay連接通過中繼服務器傳遞數據,確保數據的可靠傳輸。

????????WebRTC中的ICE既考慮了數據傳輸的效率,又考慮了網絡的連通率:

  • WebRTC的ICE機制會選擇最好的鏈路傳輸音視頻數據,即如果通信的雙方在同一網段內,則優先使用內網鏈路;如果通信的雙方不在同一網段,則優先使用P2P;當以上方式都無法連通時,則使用relay服務進行中轉。
  • ICE的連通率幾乎可以達到100%。在內網和P2P無法連通的情況下,它還可以通用中繼的方式讓彼此連通,從而大大提高了WebRTC的連通率。

二、ICE策略

????????RTCPeerConnection提供了一種在瀏覽器之間建立點對點連接的方式,而無需通過服務器進行中轉。它使用了ICE(Interactive Connectivity Establishment)協議來處理網絡地址和端口的自動配置,以確保連接的穩定性和可靠性。

????????構造RTCPeerConnection對象時,其輸入參數的類型為RTCConfiguration。

RTCConfiguration pcConfig = {'iceServers': [{'urls': 'turn:stun.learningrtc.cn:3478','username': "username1",'credential': "password1",},{'urls': 'turn:stun.avdancedu.com:3478','username': "username2",'credential': "password2",}],'iceTransportPolicy': "all",'bundlePolicy': "max-bundle",'rtcpMuxPolicy': "require"
};
RTCPeerConnection pc = new RTCPeerConnection(pcConfig);
…
RTCConfiguration各字段含義

?1. iceServers?

????????iceServers是RTCIceServer類型的數組,可以包含一個或多個STUN和/或TURN服務器。

2. iceTransportPolicy

????????在ICE中,有兩種常見的網絡連接策略:

  • all:默認策略,瀏覽器將嘗試使用所有可用的網絡接口(如本地IP地址、VPN、Wi-Fi等)來建立連接。這種策略適用于多種網絡環境,但可能會增加連接建立的時間和網絡帶寬的消耗。
  • relay:這種策略僅使用中繼服務器(如TURN服務器)來建立連接。中繼服務器充當中間人,幫助兩個瀏覽器在防火墻或NAT后面建立連接。這種策略適用于網絡環境受限的情況,但可能會增加延遲和中繼服務器的負載。

三、P2P連接

1.Nat類型

????????P2P指的就是如何進行NAT穿越。NAT在真實的網絡環境中隨處可見,它的出現主要出于兩個目的。一是為了解決IPv4地址不夠用的問題。當時IPv6短期內還無法替換IPv4,而IPv4的地址又特別緊缺,所以人們想到讓多臺主機共用一個公網IP地址,大大減緩了IPv4地址不夠用的問題。二是為了解決安全問題。使用NAT后,主機隱藏在內網,這樣黑客就很難訪問到內網主機,從而達到保護內網主機的目的。

????????NAT就是一種地址映射技術,它在內網地址與外網地址之間建立了映射關系。當內網主機向外網主機發送信息時,數據在經過NAT層時,NAT會將數據包頭中的源IP地址和源端口號替換為映射后的外網IP地址和外網端口。相反,當接收數據時,NAT收到數據后會將目標地址映射為內網的IP地址和端口再轉給內網主機。

????????RFC3489和RFC5389是最重要的兩份NAT穿越的協議文檔。在RFC3489協議中,將NAT分成4種類型,即完全錐型、IP限制錐型、端口限制錐型以及對稱型。在這4種類型中,越往后的NAT類型穿越難度越大。

????????大多數情況下NAT穿越使用的是UDP,這是因為UDP是無連接協議的,打洞會更加方便。當然,也可以使用TCP打洞。

(1)完全錐型NAT

????????完全錐型NAT的特點:一旦打洞成功,所有知道該洞的主機都可以通過它與內網主機進行通信。

(2)IP限制錐型NAT

????????IP限制錐型NAT要比完全錐型NAT嚴格得多。IP限制錐型NAT的主要特點:NAT打洞成功后,只有與之打洞成功的外網主機才能通過該洞與內網主機通信,而其他外網主機即使知道洞口也不能與之通信。

(3)端口限制錐型NAT

????????端口限制錐型NAT的主要特點:除了像IP限制錐型NAT一樣需要對IP地址進行檢測外,還需要對端口進行檢測。

(4)對稱型NAT

????????對稱型NAT是4種NAT類型中對數據包檢測最嚴格的。對稱型NAT的特點:內網主機每次訪問不同的外網主機時,都會生成一個新洞,而不像前面3種NAT類型使用的是同一個洞。

????????對稱型NAT每次訪問不同外網主機都生成新洞的這種特性,導致對稱型NAT碰到對稱型NAT或者對稱型NAT遇到端口限制型NAT時,雙方打洞的成功率非常低,即使可以互通,成本也非常高。WebRTC遇到上面這兩種情況時,直接放棄打洞的嘗試。

四、網絡中繼

????????當遇到NAT之間無法打通的情況時,WebRTC會使用TURN協議通過中轉的方式實現端與端之間的通信。

1. TURN協議中轉數據

????????TURN協議采用了典型的客戶端/服務器模式,其服務器端稱為TurnServer,客戶端稱為TurnClient。TurnClient與TurnServer之間通過信令控制數據流的發送。

????????TurnClient與TurnServer之間的傳輸協議既可以是UDP,也可以是TCP,而在TurnServer上分配的relay地址使用的都是UDP。

?(1)發送指令Send indication

????????該指令包括兩個屬性:XOR-PEER-ADDRESS和DATA。其中XOR-PEER-ADDRESS屬性用于指定向哪個主機轉發數據,DATA屬性指明數據的具體內容。

(2)端對端傳輸數據

????????一種方法就是上面說的Send indication指令,當TurnClient向某個Peer發數據時就要使用它。相反,當Peer通過TurnServer向TurnClient轉發數據時,使用Data indication指令,指明向哪個TurnClient轉發數據。

? ? ? ? 另一種方法是使用tunnel機制。使用tunnel機制的好處是不用再像使用Send/Data indication指令一樣,每次都要指定數據發往的地址,只需要在開始發送數據之前,發送ChannelBind指令將channel number與目標地址綁定一次即可,后面統一使用channel number就可以找到發往的目的地。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43561.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43561.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iPhone 15受益:驍龍8 Gen 3可能缺席部分安卓旗艦機

明年一批領先的安卓手機的性能可能與今年的機型非常相似。硅成本的上漲可能是原因。 你可以想象,2024年許多最好的手機都會在Snapdragon 8 Gen 3上運行,這是高通公司針對移動設備的頂級芯片系統的更新,尚未宣布。然而,來自中國的…

centos上下載redis

1.redis 特點 Redis特性(8個) 1 速度快:10w ops(每秒10w讀寫),數據存在內存中,c語言實現,單線程模型 2 持久化:rdb和aof 3 多種數據結構: 5大數據結構 …

Vue中實現分頁

1.構造分頁組件&#xff0c;并注冊為全局組件 <template><div class"pagination"><button v-if"startNumAndEndNum.start>1" click"$emit(getPageNo,pageNo-1)">上一頁</button><button v-if"startNumAndEn…

C#生產流程控制(串行,并行混合執行)

開源框架CsGo https://gitee.com/hamasm/CsGo?_fromgitee_search 文檔資料&#xff1a; https://blog.csdn.net/aa2528877987/article/details/132139337 實現效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37…

Windows11 Docker Desktop 啟動 -wsl kernel version too low

系統環境&#xff1a;windows11 1&#xff1a;docker下載 Docker: Accelerated Container Application Development 下載后雙擊安裝即可 安裝后啟動Docker提示&#xff1a;Docker Desktop -wsl kernel version too low 處理起來也是非常方便 1:管理員身份啟動&#xff1a;…

C#程序隨系統啟動例子 - 開源研究系列文章

今天講講C#中應用程序隨系統啟動的例子。 我們知道&#xff0c;應用程序隨系統啟動&#xff0c;都是直接在操作系統注冊表中寫入程序的啟動參數&#xff0c;這樣操作系統在啟動的時候就根據啟動參數來啟動應用程序&#xff0c;而我們要做的就是將程序啟動參數寫入注冊表即可。此…

C語言慣用法之typedef結構體類型

以前曾問C語言熟手&#xff0c;為什么C語言里面充滿了typedef struct someType TSomeType&#xff1f; 當時&#xff0c;可能他以為我的問題太簡單了&#xff0c;也沒所有說出關鍵出來。 對于現在我的認識而言&#xff0c;這種聲明方式&#xff0c;更多的是為了簡寫&#xff0…

數據結構與算法基礎

一、基本概念和術語 &#xff08;一&#xff09;數據元素、數據結構、抽象數據類型等概念 &#xff08;二&#xff09;算法設計的基本要求 &#xff08;三&#xff09;語句的頻度和估算時間復雜度 二、線性表 &#xff08;一&#xff09;線性表的定義和基本操作 &#xff08…

【3Ds Max】車削命令的簡單使用(以制作花瓶為例)

簡介 在3ds Max中&#xff0c;"車削"&#xff08;Lathe&#xff09;是一種建模命令&#xff0c;用于創建圍繞軸線旋轉的幾何形狀。通過車削命令&#xff0c;您可以將一個閉合的平面或曲線幾何形狀旋轉&#xff0c;從而生成一個立體對象。這種方法常用于創建圓柱體、…

大數據Flink學習圣經:一本書實現大數據Flink自由

學習目標&#xff1a;三棲合一架構師 本文是《大數據Flink學習圣經》 V1版本&#xff0c;是 《尼恩 大數據 面試寶典》姊妹篇。 這里特別說明一下&#xff1a;《尼恩 大數據 面試寶典》5個專題 PDF 自首次發布以來&#xff0c; 已經匯集了 好幾百題&#xff0c;大量的大廠面試…

深入淺出Pytorch函數——torch.nn.init.xavier_uniform_

分類目錄&#xff1a;《深入淺出Pytorch函數》總目錄 torch.nn.init模塊中的所有函數都用于初始化神經網絡參數&#xff0c;因此它們都在torc.no_grad()模式下運行&#xff0c;autograd不會將其考慮在內。 根據Glorot, X.和Bengio, Y.在《Understanding the difficulty of tra…

【制作npm包4】api-extractor 學習

制作npm包目錄 本文是系列文章&#xff0c; 作者一個橙子pro&#xff0c;本系列文章大綱如下。轉載或者商業修改必須注明文章出處 一、申請npm賬號、個人包和組織包區別 二、了解 package.json 相關配置 三、 了解 tsconfig.json 相關配置 四、 api-extractor 學習 五、npm包…

Dockerfile自定義鏡像

文章目錄 Dockerfile自定義鏡像鏡像結構Dockerfile語法構建java項目 小結 Dockerfile自定義鏡像 常見的鏡像在DockerHub就能找到&#xff0c;但是我們自己寫的項目就必須自己構建鏡像了。 而要自定義鏡像&#xff0c;就必須先了解鏡像的結構才行。 鏡像結構 鏡像是將應用程序及…

服務器數據庫中了360后綴勒索病毒怎么辦?360后綴勒索病毒的加密形式

隨著信息技術的發展&#xff0c;企業的計算機服務器數據庫變得越來越重要。然而&#xff0c;在數字時代&#xff0c;網絡上的威脅也日益增多。近期&#xff0c;我們收到很多企業的求助&#xff0c;企業的計算機服務器遭到了360后綴勒索病毒的攻擊&#xff0c;導致服務器內的所有…

《TCP IP網絡編程》第二十四章

第 24 章 制作 HTTP 服務器端 24.1 HTTP 概要 本章將編寫 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;服務器端&#xff0c;即 Web 服務器端。 理解 Web 服務器端&#xff1a; web服務器端就是要基于 HTTP 協議&#xff0c;將網頁對…

easyx圖形庫基礎:3實現彈球小游戲

實現彈球小游戲 一.實現彈球小游戲:1.初始化布&#xff1a;2.初始化一個球的信息&#xff1a;3.球的移動和碰撞反彈4.底邊擋板的繪制和移動碰撞重置數據。 二.整體代碼&#xff1a; 一.實現彈球小游戲: 1.初始化布&#xff1a; int main() {initgraph(800, 600);setorigin(40…

[論文筆記]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 這是論文Glancing Transformer for Non-Autoregressive Neural Machine Translation的筆記。 傳統的非自回歸文本生成速度較慢,因為需要給定之前的token來預測下一個token。但自回歸模型雖然效率高,但性能沒那么好。 這篇論文提出了Glancing Transformer,可以只需要一…

layui下拉框select 彈出層在最外層

出現問題如圖所示 想要的效果是如下 這樣的效果只需一行代碼就能解決 .layui-layer-page .layui-layer-content{overflow: visible!important;}

Postgresql源碼(112)plpgsql執行sql時變量何時替換為值

相關 《Postgresql源碼&#xff08;41&#xff09;plpgsql函數編譯執行流程分析》 《Postgresql源碼&#xff08;46&#xff09;plpgsql中的變量類型及對應關系》 《Postgresql源碼&#xff08;49&#xff09;plpgsql函數編譯執行流程分析總結》 《Postgresql源碼&#xff08;5…

PyTorch從零開始實現ResNet

文章目錄 代碼實現參考 代碼實現 本文實現 ResNet原論文 Deep Residual Learning for Image Recognition 中的50層&#xff0c;101層和152層殘差連接。 代碼中使用基礎殘差塊這個概念&#xff0c;這里的基礎殘差塊指的是上圖中紅色矩形圈出的內容&#xff1a;從上到下分別使用…