聊聊WebRTC網關伺服器1:如何選擇服務端埠方案?

聊聊WebRTC網關伺服器1:如何選擇服務端埠方案?

《聊聊WebRTC網關伺服器》系列文章系由WebRTCon2018中網易雲信音視頻技術專家的分享內容《從零開始構建音視頻網關伺服器》整理而成,該系列文章將和大家分享網易NRTC在WebRTC網關項目的自研過程中遇到的一些問題,以及我們最終的解決方法。

《聊聊WebRTC網關伺服器》第一篇文章將和大家分享如何選擇服務端的埠方案。

標準WebRTC連接建立流程

在討論如何選擇伺服器端的埠方案前,我們先來看看標準WebRTC的連接建立流程,這為我們理解這篇文章後續內容提供最基礎的知識。

這裡描述的是Trickle ICE過程,並且省略了通話發起與接受的信令部分。流程如下:

1) WebRTC A通過Signal Server轉發SDP OFFER到WebRTC B。WebRTC B做完本地處理以後,通過 Signal Server轉發SDP ANSWER到A。

2)A、B同時向STUN Server發送Binding request請求自身的外網地址,並從STUN Server回包的MAPPED-ADDRESS中得到各自的外網地址;

3)A、B收集完內外網ICE Candidate,並通過Signal Server發送給對方;

4)雙方開始做NAT穿越,互相給對方的ICE Candidate發送STUN Binding Request;

5)NAT穿越成功,A、B之間的P2P連接建立,進入媒體互通階段。在這個過程中,我們看到了有三個核心的部分,SDP協商、ICE Candidate交換、Stun Binding Req/Res的連通性檢查。

WebRTC網關連接建立流程

在了解了標準WebRTC的建連流程以後,我們來看看WebRTC客戶端如何與網關建連。

首先,我們網關的Media Server擁有公網IP,因此Server就不需要通過Stun Server收集自身的公網IP。WebRTC客戶端先與網關Signal Server協商SDP,包括ICE Candidate,Media Server分配IP和埠作為網關的ice candidate發送給客戶端。因為網關是公網IP,所以客戶端向這個IP發送STUN Binding Request會被伺服器收到, 並回復Response。接著客戶端與網關媒體伺服器進行DTLS握手與秘鑰協商,在此基礎上進一步進行SRTP的音視頻通信。至此,WebRTC客戶端與網關伺服器建連成功。

好的,現在我們已經具備了探討伺服器端埠選擇的基礎知識,接下來我們來看看具體有哪些方案。

WebRTC網關伺服器媒體架構

最簡的伺服器端埠方案是我們可以為每個客戶端分配一個埠,伺服器上使用這個埠區分每個用戶,就像圖裡描述的A、B、C、D四個人在WebRTC網關伺服器上分別對應UDP埠10001~1004。這種方案邏輯上很簡單,很多開源的伺服器都採用這個方案,如janus。另外一個原因是使用了libnice庫在伺服器上來和客戶端做ice建連,類似的做法都是採用多埠的架構。

那麼多埠有什麼不足呢?

1)很多的網路出口防火牆對能夠通過的UDP埠是有限制的;

2)對於服務端來說開闢這麼多埠,安全性本身也有一定的問題,特別是網易的運維同學,更是拒絕;

3)開闢這麼多的埠在Server端上,埠的開銷和性能均有一定的影響。那能否用單埠?使用單埠前,核心要解決的一個問題是:如何區分每一個RTP/RTCP包是屬於哪一個WebRTC客戶端。

為了解決這個問題,我們需要使用一些小技巧。首先,有幾個基礎知識點我們先了解一下。如下圖:

1)SDP offer和answer里配置的ice-ufrag欄位裡面內容,原來是用來作為stun數據包的鑒權的,因此STUN Binding Request裡面的USERNAME欄位就是由上Offer和answer的ice-ufrag內容拼接而成。

2)發送STUN Binding Request的客戶端本地udp fd,與ice建連成功後發送媒體數據的udp fd是同一個,也就是說Server上看到的ip port是同一個。

有了上面的背景知識,聰明的你們肯定已經大致有一個方案了。我們來看看實現細節是怎麼樣的:

1)在伺服器給Web端的SDP Answer中設置 ice-ufrag為roomid/userid,其中RoomID和UserID是通話業務層分配的內容,用於區分每通通話以及參與這。接著做Ice candidate協商,Web端開始做連通性檢測,也就是stun binding request里的USERNAME為SDP local和remote的ice-ufrag指定內容。

2)伺服器收到stun binding request的客戶端ip和埠,並正常回stun binding response。

3)記錄客戶端地址與用戶的信息的映射關係。

4)伺服器收到一個rtp/rtcp媒體數據包,通過包的源ip和埠,查詢映射表就可以識別這個包屬於哪個用戶。

在分享完服務端埠選擇的方案後,大家都知道WebRTC客戶端使用PeerConnection來表示不同的媒體連接,這對於WebRTC來說是基礎也是核心,在《聊聊WebRTC網關伺服器》第二篇文章將繼續為大家介紹如何選擇PeerConnection的方案。


推薦閱讀:

宗教=萬應網關 | 郭曉明

TAG:WebRTC | 網關 | 服務端 |