目錄
一、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);
…

?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就可以找到發往的目的地。