WebRTC中NAT穿透淺析


說NAT穿透之前先說幾個關於WebRTC的概念,可能之前有跟作者一樣對WebRTC概念理解錯誤的同學。。

WebRTC(網絡實時通信)它是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術,它為我們提供了視頻會議的核心技術,包括音視頻的采集、編解碼、網絡傳輸、顯示等功能,並且還支持跨平台:windows,linux,mac,android,iOS。

1、WebRTC的實現原理

webRTC是基於P2P的網絡通信,可能有同學不太了解P2P是什么,在此簡單解釋一下 P2P就是點對點的通信。

下面就拿P2P與傳統連接方式做個比較:

一般我們傳統的連接方式,都是以服務器為中介的模式:

  • 類似http協議:客戶端⇋服務端(當然這里服務端返回的箭頭僅僅代表返回請求數據)。

  • 我們在進行即時通訊時,進行文字、圖片、錄音等傳輸的時候:客戶端A⇨服務器⇨客戶端B。

而點對點的連接恰恰數據通道一旦形成,中間是不經過服務端的,數據直接從一個客戶端流向另一個客戶端:客戶端A⇋客戶端B ... 客戶端A⇋客戶端C ...(可以無數個客戶端之間互聯。

采用P2P的優點:可以大大的減輕了服務器的壓力,我們服務端確實是沒必要去獲取兩者通信的數據。

說到這,大家認為WebRTC真的就不需要服務端了嗎?這是其中的一個誤解,嚴格意義上來說,webRTC僅僅是不需要服務器中轉數據。起碼有兩件事是必須要用到服務器

1.瀏覽器之間交換元數據(信令)必須通過服務器

2.為了穿越NAT和防火牆

第1條很好理解,我們在A和B需要建立P2P連接的時候,至少要服務器來協調,來控制連接開始建立。而連接斷開的時候,也需要服務器來告知另一端P2P連接已斷開。這些我們用來控制連接的狀態的數據稱之為信令,而這個與服務端連接的通道,對於WebRTC而言就是信令通道

如上圖所示,完整的P2P連接就是首先向服務器發送Signaling信令,然后底層調用WebRTC從服務器獲取信令,從信令中獲取對端用戶的基本信息,然后再進行Media通信連接。

2.NAT相關概念及原理

NAT(Network Address Translation,網絡地址轉換)簡單來說就是為了解決IPV4下的IP地址匱乏而出現的一種技術。

舉例🌰,就是通常我們處在一個路由器之下,而路由器分配給我們的地址通常為191.168.0.21 、191.168.0.22如果有n個設備,可能分配到192.168.0.n,而這個IP地址顯然只是一個內網的IP地址,這樣一個路由器的公網地址對應了n個內網的地址,通過這種使用少量的公有IP 地址代表較多的私有IP 地址的方式,將有助於減緩可用的IP地址空間的枯竭。

NAT技術會保護內網地址的安全性,所以這就會引發個問題,就是當我采用P2P之中連接方式的時候,NAT會阻止外網地址的訪問,這時我們就得采用NAT穿透了。

於是我們就有了如下的思路:
我們借助一個公網IP服務器,a,b都往公網IP/PORT發包,公網服務器就可以獲知a,b的IP/PORT,又由於a,b主動給公網IP服務器發包,所以公網服務器可以穿透NAT A,NAT B送包給a,b。
所以只要公網IP將b的IP/PORT發給a,a的IP/PORT發給b。這樣下次a和b互相消息,就不會被NAT阻攔了。

WebRTC的NAT/防火牆穿越技術,就是基於上述的一個思路來實現的。在WebRTC中采用ICE框架來保證RTCPeerConnection能實現NAT穿越。

關於ICE協議框架,作者提供連接地址:https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API/Protocols,有興趣的同學可以去了解一下。

不過作者在此特別說明一下SDP協議,它是會話描述協議Session Description Protocol (SDP) 是一個描述多媒體連接內容的協議,例如分辨率,格式,編碼,加密算法等。所以在數據傳輸時兩端都能夠理解彼此的數據。本質上,這些描述內容的元數據並不是媒體流本身

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM