常天宇 彭振
國家無線電監(jiān)測中心檢測中心,中國·北京 100041
WebRTC 是一個跨平臺的多媒體框架可以進行音視頻處理和實時通訊。通過瀏覽器進行音視頻設(shè)備訪問管理、音視頻采集、數(shù)據(jù)傳輸最終搭建實時互動的平臺[1]。
信令服務(wù)器用來交換每個終端支持的媒體信息(編解碼器等)和網(wǎng)絡(luò)信息(每個終端可能支持的通路);STUN/TURN 服務(wù)器用來進行NAT 穿越和提供中繼服務(wù);NAT 穿越成功可以建立P2P 通道直連進行媒體數(shù)據(jù)的傳輸,否則需要中繼節(jié)點進行中轉(zhuǎn)[2]。
①下載并安裝nodejs、express、serve-index、socket.io模塊。
②新建server.js 文件中引入以上模塊。
③創(chuàng)建http 和https 服務(wù)。
④將socket 服務(wù)和web 服務(wù)綁定。
⑤服務(wù)端偵聽底層發(fā)送的connection 事件后,繼續(xù)偵聽客戶端自定義事件并進行后續(xù)的邏輯處理。
⑥打開端口http 服務(wù)監(jiān)聽80,https 服務(wù)監(jiān)聽443。(web和socket 服務(wù)端口復(fù)用)
⑦node 運行server.js 文件開啟服務(wù)。
⑧編寫好的客戶端html、js、css 文件放在服務(wù)端public 路徑,利用本地瀏覽器的v8 引擎進行渲染處理后實現(xiàn)交互。
NAT 功能是給內(nèi)網(wǎng)地址提供一個公網(wǎng)的映射地址,提高安全性并解決IPV4 地址不足。
有四種類型的NAT,即完全錐型、地址限制性NAT、端口限制性NAT、對稱性NAT。安全性依次增加,給NAT穿越打洞帶來挑戰(zhàn)。對于端口受限錐形與對稱性NAT、對稱型NAT 與對稱性NAT 之間幾乎很難打洞成功[3]。雖然可以嘗試IP 地址和端口猜測的方式,但對猜測算法要求很高。
如何進行NAT 類型檢測有以下步驟:
①服務(wù)器2 臺,需有2 個IP 地址和端口(#1 服務(wù)器雙網(wǎng)卡)。
②客戶端向服務(wù)端發(fā)送多個ECHO(UDP 報文)請求,服務(wù)端用該IP 地址和端口返回響應(yīng)。如果一個響應(yīng)也沒有收到,那么說明不支持UDP 形式檢測。
③如果客戶端收到回復(fù)響應(yīng),則需要對比返回的ip 地址和發(fā)送的IP 地址,如果相同則客戶端沒有在NAT 之后,否則在NAT 之后。
④客戶端再向服務(wù)端發(fā)送請求,服務(wù)端用不同于接收請求的IP 地址和端口進行回復(fù)響應(yīng),如果客戶端收到了響應(yīng)則說明客戶端處于完全開放的公網(wǎng),否則客戶端位于對稱性防火墻之后。
⑤如果第三步在NAT 之后重復(fù)第四部步驟,客戶端收到回復(fù)響應(yīng),則NAT 類型為完全錐形,否則需要進一步判斷。
⑥向第二臺服務(wù)器重復(fù)步驟二操作,得到回復(fù)后對比經(jīng)過NAT 映射后的公網(wǎng)IP 地址和第三步得到的公網(wǎng)IP 是否相同,如果不同則為對稱性NAT,如果相同客戶端向一臺服務(wù)器再次發(fā)送請求,服務(wù)器端用相同的IP 地址但是不同的端口進行回復(fù)響應(yīng),如果客戶端能收到則為IP 限制性NAT,否則為端口限制性NAT。
交換公網(wǎng)IP 地址和端口,便于進行NAT 穿越。是典型的客戶端/服務(wù)器模式。即客戶端發(fā)送請求,服務(wù)端響應(yīng)。如果沒有STUN 服務(wù),客戶端無法知道彼此的IP,即使在公網(wǎng)上的主機也是無法進行通訊的(見圖1)。
圖1 STUN 服務(wù)器工作原理
建立在STUN 協(xié)議之上,TURN 客戶端發(fā)送allocate 請求,服務(wù)器分配公網(wǎng)IP 地址和端口提供流媒體數(shù)據(jù)的中轉(zhuǎn)服務(wù)以解決NAT 無法穿越的問題。TURN 服務(wù)器對于同一客戶端有2 個端口分別提供allocate 請求服務(wù)和數(shù)據(jù)中轉(zhuǎn)服務(wù):TURN 服務(wù)器的3478 端口和客戶端可以是TCP 或者UDP(NAT 穿越基于TCP 打洞或UDP 打洞,一般來說為了保證請求服務(wù)的可靠性都是基于TCP 或者TLS over TCP);50000 端口和客戶端是流媒體的UDP 包,UDP 數(shù)據(jù)的傳輸方式有send/data 或channel,兩者可以共存[4]。
收集每個終端可能的通路(本機地址、反射地址、中繼地址)通過信令服務(wù)器進行交換然后再進行連通性檢測。優(yōu)先P2P 穿越,不成功選擇TURN 中轉(zhuǎn)服務(wù)。
STUN/TURN 服務(wù)器搭建選型Coturn 并下載安裝到服務(wù)器,需要配置表1的參數(shù)可以提供基本的STUN/TRUN服務(wù)。
表1 配置參數(shù)
配置好后開啟該服務(wù)并用Trickle ICE 檢查服務(wù)運行是否正常。candidate 收集到2 個本機的地址(host 雙網(wǎng)卡)、1 個經(jīng)過NAT 之后的映射公網(wǎng)地址(srflx)以及1 個提供TURN 服務(wù)的中繼地址(relay)。具體網(wǎng)絡(luò)可以通過wireshark 或者linux 下的tcpdump 進行抓包分析。
Peer A 和Peer B 進行通訊,先進行媒體協(xié)商(即協(xié)商共同支持的編解碼器等),再進行候選者收集鏈路優(yōu)先級排序檢查通路,最后進行媒體流的傳輸。Peer A、Peer B 在建立的通路上進行媒體數(shù)據(jù)的傳輸,并將收到的數(shù)據(jù)添加在本地html頁面標簽上顯示。
信令服務(wù)和STUN/TURN 服務(wù)可以部署在同一臺物理設(shè)備上,客戶端可以發(fā)送本地采集的音視頻數(shù)據(jù)、共享本地桌面、文字聊天和文件傳輸?shù)葘崿F(xiàn)1V1 實時互動。如果是同一NAT 后的終端通訊,不需要開啟STUN/TURN 服務(wù)即可建立P2P 直連,如果是不同網(wǎng)絡(luò)在NAT 穿越失敗后需要TURN 服務(wù)中轉(zhuǎn)才能進行通訊。
WebRTC 通訊基于服務(wù)端(信令服務(wù)、STUN/TURN 服務(wù))和客戶端的交互,其中信令服務(wù)極為重要。隨著IPV6的普及,NAT 的功能或被淡化,即可以減少NAT 穿越帶來的困難,又能增加網(wǎng)絡(luò)安全性,為音視頻的實時傳輸提供保障。