1. 程式人生 > 其它 >7┃音視訊直播系統之 WebRTC 中的連線的建立、STUN/TURN 以及 NAT 穿越

7┃音視訊直播系統之 WebRTC 中的連線的建立、STUN/TURN 以及 NAT 穿越

一、Candidate

  • 即 ICE Candidate(ICE 候選者)。表示 WebRTC 與遠端通訊時使用的協議、IP 地址和埠

  • 一般組成包括: 本地 IP 地址、本地埠號、候選者型別,包括 host、srflx 和 relay、優先順序、傳輸協議等等

  • 當 WebRTC 通訊雙方彼此要進行連線時,每一端都會提供許多候選者,比如你的主機有多塊網絡卡,那麼每塊網絡卡的不同埠都是一個候選者

  • WebRTC 會按照上面描述的格式對候選者進行排序,然後按優先順序從高到低的順序進行連通性測試,當連通性測試成功後,通訊的雙方就建立起了連線

  • 在WebRTC 中,它首先會嘗試 NAT 穿越,即嘗試端到端直連。如果能夠穿越成功,那雙方就通過直連的方式傳輸資料,這是最高效的。但如果 NAT 穿越失敗,為了保障通訊雙方的連通性,WebRTC 會使用中繼方式,當然使用這種方式傳輸效率會低一些

  • 在眾多候選者中,host 型別的候選者優先順序是最高的。在 WebRTC 中,首先對 host 型別的候選者進行連通性檢測,如果它們之間可以互通,則直接建立連線。其實,host 型別之間的連通性檢測就是內網之間的連通性檢測。WebRTC 就是通過這種方式巧妙地解決了大家認為很困難的問題

  • 同樣的道理,如果 host 型別候選者之間無法建立連線,那麼 WebRTC 則會嘗試次優先順序的候選者,即 srflx 型別的候選者。也就是嘗試讓通訊雙方直接通過 P2P 進行連線,如果連線成功就使用 P2P 傳輸資料;如果失敗,就最後嘗試使用 relay 方式建立連線

  • 如果用程式碼結構表示,大概可以是如下:

  • host:表示本機候選者

  • srflx:表示內網主機對映的外網的地址和埠

  • relay:表示中繼候選者

{
	IP: 127.0.0.1,
	port: 3333,
	type: host/srflx/relay,
	priority: number,
	protocol: UDP/TCP,
	usernameFragment: string
}

 

二、STUN 協議

  • 如果主機沒有公網地址,是無論如何都無法訪問公網上的資源的

  • 而一般情況下,主機都只有內網 IP 和埠,那它是如何訪問外網資源的呢

  • 在內網的閘道器上都有 NAT (Net Address Transport) 功能

  • NAT 的作用就是進行內外網的地址轉換

  • 這樣當你要訪問公網上的資源時,NAT 首先會將該主機的內網地址轉換成外網地址,然後才會將請求傳送給要訪問的伺服器;伺服器處理好後將結果返回給主機的公網地址和埠,再通過 NAT 最終中轉給內網的主機

  • 而想讓內網主機獲得它的外網 IP 地址,就只需要在公網上架設一臺伺服器,並向這臺伺服器發個請求即可獲得,也就是 STUN 協議,我們只要遵守這個協議就可以拿到自己的公網 IP 了

 

三、TURN 協議

  • 我們經常說的 relay 伺服器或 TURN 伺服器它們是同一個意思,都是指中繼伺服器

  • 而relay 服務是通過 TURN 協議實現的

  • relay 型候選者的優先順序與其他型別相比是最低的,但在其他候選者都無法連通的情況下,relay 候選者就成了最好的選擇。因為它的連通率是所有候選者中連通率最高的

四、NAT 打洞 /P2P 穿越

  • NAT解決的問題: IPv4 地址不夠用的、安全問題

  • 當收集到 Candidate 後,WebRTC 就開始按優先順序順序進行連通性檢測了。它首先會判斷兩臺主機是否處於同一個區域網內,如果雙方確實是在同一區域網內,那麼就直接在它們之間建立一條連線

  • 但如果兩臺主機不在同一個內網,WebRTC 將嘗試NAT 打洞,即 P2P 穿越。在 WebRTC中,NAT 打洞是極其複雜的過程,它首先需要對 NAT 型別做判斷,檢測出其型別後,才能判斷出是否可以打洞成功,只有存在打洞成功的可能性時才會真正嘗試打洞

  • WebRTC 將 NAT 分類為 4 種類型:完全錐型 NAT、IP 限制型 NAT、埠限制型 NAT、對稱型 NAT

五、ICE

  • ICE 就是包括了 STUN、TURN 協議的一套框架

  • 其實 ICE 就是上面所講的獲取各種型別 Candidate 的過程

  • 就是:在本機收集所有的 host 型別的 Candidate,通過 STUN協議收集 srflx 型別的 Candidate,使用 TURN 協議收集 relay 型別的 Candidate

六、完全錐型 NAT

  • 完全錐型 NAT 的特點是,當 host 主機通過 NAT 訪問外網的 B 主機時,就會在 NAT 上打個“洞”,所有知道這個“洞”的主機都可以通過它與內網主機上的偵聽程式通訊

  • 所謂的“打洞”就是在 NAT 上建立一個內外網的對映表,並且一般會使用UDP 是無連線協議,也就是說只要你傳送資料給它,它就能收到

七、IP 限制錐型 NAT

  • IP 限制錐型要比完全錐型 NAT 嚴格得多

  • 它主要的特點是,host 主機在 NAT 上“打洞”後,NAT 會對穿越洞口的 IP 地址做限制

  • 只有指定的 IP 地址才可以通過,也就是說,只有 host 主機訪問過的外網主機才能穿越 NAT

八、埠限制錐型

  • 埠限制錐型比 IP 限制錐型 NAT 更加嚴格

  • 它主要的特點是,在 NAT 上對打洞時對IP 地址做了限制,還對具體的埠做了限制

九、對稱型 NAT

  • 對稱型 NAT 是所有 NAT 型別中最嚴格的一種型別

  • 對稱型 NAT 對每個連線都使用不同的埠,甚至更換 IP 地址,會建立多個內外網的對映表