WebRtc搭建Turn穿透服務

圖2

屏幕共享

sudo yum install -y make gcc cc gcc-c++ wget
sudo yum install -y openssl-devel libevent libevent-devel
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
wget http://turnserver.open-sys.org/downloads/v4.5.1.2/turnserver-4.5.1.2.tar.gz tar -xvzf turnserver-4.5.1.2.tar.gz cd turnserver-4.5.1.2 && ./configure make sudo make install
使用wget下載包,最后這是turn安裝成功界面
測試是否安裝成功,若有路徑表示成功
which turnserver
進入配置文件夾
cd /usr/local/etc/
復制出turnserver.conf.default 為 turnserver.conf
cp turnserver.conf.default turnserver.conf
vim編輯配置文件,shift+g跳到最后一行加上以下內容
把后面的注釋去掉
vim turnserver.conf
relay-device=eth0 #(與ifconfig查到的網卡名稱一致) listening-ip=你的內網 #(ifconfig查看) relay-ip=你的內網 external-ip=你的外網 user=你的賬號:你的密碼 cli-password=你的密碼 #(這個要加上,不然一會啟動服務會報cli-password啥的) min-port=49152 max-port=65535 #realm=xxx.com listening-port=3478 cert=/etc/turn_server_cert.pem pkey=/etc/turn_server_pkey.pem
然后去你的雲服務器控制台把3478的tcp和udp開放
開放3478防火牆
yum install firewalld
firewall-cmd --zone=public --add-port=3478/udp --permanent firewall-cmd --zone=public --add-port=3478/tcp --permanent firewall-cmd --reload
查看是否開放,返回yes表示開放
firewall-cmd --zone=public --query-port=3478/tcp firewall-cmd --zone=public --query-port=3478/udp
測試服務
turnserver -a -f -r 公網ip:3478
返回上圖表示成功
ctrl+c暫停服務,使用后台運行
turnserver -a -o -f -r 公網ip:3478
然后啟動服務(跳過此步)
turnserver -v -r 你的公網ip:3478 -a -o -c /usr/local/etc/turnserver.conf
如果運行日志沒報錯就應該成功了
查看是否在運行了
ps -ef|grep turnserver
啟動成功
關閉服務
kill -9 服務id
到官網測試下:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
輸入turn:你的ip:3478 還有賬號、密碼
addserver后點下面的按鈕
注意使用火狐瀏覽器 chrome會報401和701錯誤
看到relay和返回了你的公網ip和顯示Done表示turn服務連接成功
如果下面返回not reachable?,檢查一下安全組上面是否將3478端口打開了
如果你還是配置不成功
可以相互參考:
https://blog.csdn.net/qq_44938451/article/details/122158975
http://events.jianshu.io/p/5543dd3e002b
https://docs.wildfirechat.cn/webrtc/turn_server.html
https://blog.csdn.net/daisysmilee/article/details/120306900
最后是我們的前端vue代碼
this.peerExa = new Peer(undefined, { host: "/", port: "3001", config: { iceServers: [ { urls: "turn:ip:3478", username: "賬號", credential: "密碼", }, ], }, });
參考:
peerjs文檔
webrtc-turn測試連接
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
禁用webrtc的https安全檢查
https://blog.csdn.net/yunzhonghefei/article/details/120290541
Turn服務器搭建
https://docs.wildfirechat.cn/webrtc/turn_server.html
https://www.jianshu.com/p/d65e369f44fb
WebRTC原理
1.1什么是WebRTC
WebRTC(Neb Real-Time Communication)是Google於2010以6829萬美元從Global IP Solutions公司購買,並於2011年將其開源,旨在1立一個互聯網瀏覽器問的實時通信的平台,讓NebRTC:技術成為H5標准之一。我們看官網(https://webrtc.org)的介紹
上圖的框架對於不同的開發人員關注點不同:
(1)紫色部分是Wb應用開發者API層
(2)藍色實線部分是面向瀏覽器廠商的AP層
(3)藍色虛線部分劉覽器廠商可以自定義實現
1.3 WebRTC發展前景
WebRTC雖然冠以wb”之名,但並不受限於傳統互聯網應用或瀏覽器的終端運行環坑。實際上無論終端運行環坑是瀏覽器、桌面應用、移動設備(Android.或iOS)還是loT設備,只要IP連接可到達且符合NabRTC規范就可以互通。這一點釋放了大呈智能終端(或運行在智能終端上的pp)的實時通信能力,打開了許多對於實時交互性要求較高的應用場錄的想象空間,警如在線教育、視煩會議、視頻社交、遠程協助、遠程操控等等都是其合適的應用領域。
全球領先的技術研究和咨詢公司Technavio.近發布了題為全球網絡實時通訊(WebRTC)市場,2017-2021"的報告。報告顯示,2017-2021年期間,全球網絡實時通信(WebRTC)市場將以34.37%的年均復合增長率增長,增長十分迅速。增長主要來自北美、歐洲及亞太地區。 1.4國內方案廠商
聲網、即構科技、環信、融雲等公司都在某於WebRTC.二次開發自己的音視頻通話方案。
聲網htps:ww.agora.io/cn/
即構科技https:www.Zeqo.imM
1.5 WebRTC通話原理
首先思考的問題:兩個不同網絡環坑的(具備攝像頭麥克風多媒體設備的)劉覽器,要實現點對點的實時音視頻對話,難點在哪里?
1.媒體協商
彼此要了解對方支持的媒體格式
1.A端視頻采用VP8做編碼,然后發送給B端B端怎么去解碼?????
2.BVP9做編碼,發給A,A怎么去解碼?
比如:Peer-A瑞可支特VP8、H264多種編碼格式,而Peer-B瑞支持VP9、H264,要保證二瑞都正確的編解碼,最簡單的辦法就是取它們的交集H264注:有一個專門的協議,稱為Session Description Protocol(SDP),可用於描述上述這類信息,在WebRTC中,參與視頻通訊的雙方必須先交換SDP信息,這樣雙方才知根知底,而交換SDP的過程,也稱為"媒體協商。
2.網絡協商
彼此要了解對方的網絡情況,這樣才有可能找到一條相互通訊的鏈路
先說結論:(1)獲取外網P地址映射:(2)通過信令服務器(signal s8rver)交換"網絡信息"
理想的網絡情況是每個瀏覽器的電腦都是私有公網IP,可以直接進行點對點連接。
實際情況是:我們的電腦和電腦之前或大或小都是在某個局域網中,需要NAT(Network Address Translation,F網絡地址轉換),顯示情況如下圖:
在解決WebRTC使用過程中的上術問的時候,我們需要用到STUN和TURN。
STUN
STUN(Session Traversal Utilities for NAT,NAT會話穿越應用程序)是一種網絡協議,它允許位於NAT(或多重NAT)后的客戶端找出自己的公網地址,查出自己位於哪種類型的NAT之后以及NAT為某一個本地端口所綁定的Internet喘端口。這些信息被用來在兩個同時處於NAT路由器之后的主機之間創建UDP通信。該協議由RFC5389定義。在遇到上述情況的時候,我們可以建立一個STUN服務器,這個服務器做什么用的呢?主要是給無法在公網環境下的視頻通話設備分配公網P用的。這樣兩台電腦就可以在公網P中進行通話。
使用一句話說明STUN做的事情就是:告訴我你的公網IP地址+瑞口是什么。搭社STUN服務器很簡單,媒體流傳輸是按照P2P的方式。那么問題來了,STUN並不是每次都能成功的為需要NAT的通話設備分配P地址的,P2P在傳輸媒體流時,使用的本地帶寬,在多人視頻通話的過程中,通話質量的好壞往往需要將據使用者本地的帶寬確定。那么怎么辦?TURN可以很好的解決這個問題
TURN
TURN的全稱為Traversal Using Relays around NAT,是STUN/RFC5389的一個拓展,主要添加了Relay1功能。如果終諾在NAT之后,那么在特定的情景下有可能使得終瑞無法和其對等端(Pee)進行直接的通信,這時就需要公網的服務器作為一個中繼,對來往的數據進行轉發。這個轉發的協議就被定義為 TURN.
在上圖的其礎上,再架設幾台TURN服務器:
在STUN分配公網IP失敗后,可以通過TURN服務器話求公網IP地址作為中繼地址。這種方式的帶寬由服務器端擔,在多人視頻聊天的時候,本地帶寬壓力較小,並且,根據Google的說明,TURN協議可以使用在所有的環境中。(單向數據200kbps一對一通話)
以上是NebRTC中經常用到的2個協議,STUN和TURN服務器我們使用coturn開源項目來搭建
補充:ICE跟STUN和TURN不一樣,ICE不是一種協議,而是個框架(Framework),它整合了STUN和TURN。coturn開源項目某成了STUN和TURN功能。
打洞不成功 需要經過中繼服務器轉發數據包
但轉發會十分消耗服務器網絡資源
上圖演示的是如果你沒有P2P成功一對一視頻通話情況下總共需要消耗的數據
即單向200kb x 4 =800kb
在WebRTC中用來描術網絡信息的術語叫candidate。
媒體協商sdp
網絡協商candidate
3.媒體協商+網絡協商數據的交換通道
從上面1/2點我們知道了2個客戶瑞協商媒體信息和網絡信息,那怎么去交換?是不是需要一個中間商去做交換?所以我們需要一個信令服務器(Sgl server)轉發彼此的媒體信息和網絡信息。
如上圖,我們在基於VebRTC APl開發應用(APP)時,可以將彼此的APP連接到信令服務器(Signal Server,一股搭讓在公網,或者兩喘都可以訪問到的局域網),借助信令服務器,就可以實現上面提到的sDP媒休信息及Candidate網絡信息交換。
信令服務器不只是交互媒體信息sdp和網絡信息candidate,比如:
(1) 房間管理(2)人員進出房間
WebRTC APIs
1.MediaStream一MediaStream用來表示個媒體數據流(通過getUserMedia接口獲取),允許你訪問輸入設備,如麥克風和Web攝像機,該APl允許從其中任意一個獲取媒體流。
2.RTCPeerConnection一RTCPeerConnection對像允許用戶在兩個瀏覽器之間直接通訊,你可以通過網絡將捕獲的音頻和視頻流實時發送到另一個 NebRTC端點。使用這些Api,你可以在本世機器和遠程對等點之問創建連接。它提供了連接到遠程對等點、維護和監視連接以及在不再需要連接時關閉連接的方法。
5.NAT知識補充
具體NAT打洞的知識在本課程不做進一步的講解,這里提供些鏈接給大家做參考:
P2P技術詳解():NAT詳解一詳細原理、P2P簡介https://www.cnblogs.com/mlgib/p/8243646.htm
P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解https://www.jianshu.com/p/9bfbcbee0abb
P2P技術詳解(三):P2P技術之STUN、TURN、ICE詳解https:www.jianshu.com/p/258e7d8be2ba
詳解P2P技術中的NAT穿透原理
https://www.jianshu.com/p/f71707892eb2