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