webrtc學習: 部署stun和turn服務器

webrtc的P2P穿透部分是由libjingle實現的. html

步驟順序大概是這樣的: mysql

1. 嘗試直連.linux

2. 經過stun服務器進行穿透android

3. 沒法穿透則經過turn服務器中轉. ios

 

stun 服務器比較簡單. 網上也有不少公開的stun服務器能夠用於測試. 例如 stun.ideasip.comc++

這裏須要注意一下. 我在作android應用時. 在少數老舊的手機上出現過一個bug: web

PeerConnection close時很是慢. 大概須要50~80s. redis

後來反覆檢查, 才發現問題出在公用的stun服務器響應比較慢. sql

解決辦法就是在本身搭一個stun服務器便可. 數據庫

具體緣由應該是: 一直在進行ice探測(stun bind request). 關閉的時候worker 線程由於網絡卡住了, 而後main線程等待. 這個不太好查. 可能須要打不少log來定位代碼. 

 

沒法穿透的時候就須要 turn 服務器來保證視頻通話的成功率. 

turn 包含了stun的功能. 因此只須要部署turn服務器便可. 

服務器代碼能夠從這裏獲取: https://code.google.com/p/coturn/

coturn 在原來的turnserver上增長了一些高級特性. (這是做者的描述, 兩個項目是同一個做者. 做者更推薦使用coturn). 

coturn  支持tcp, udp, tls, dtls 鏈接.

coturn 支持linux bsd solaris mac os. 暫不支持windows (將來會支持)

下面說一下安裝和配置. 

1. coturn 的底層網絡部分依賴libevent.  因此須要先安裝libevent2, 地址在此 http://libevent.org/

2. coturn的安裝很簡單. configure make make install 三部曲就完事了. 

3. coturn的文檔說明挺詳細的. 但比較多. 我只是大概說明下. 

更具體的說明能夠看 源碼目錄下的README.turnserver README.turnadmin README.turnutils

 

在bin目錄下生成六個可執行文件

turnadmin turnutils_peer turnutils_stunclient
turnserver turnutils_rfc5769check turnutils_uclient

turnserver 就是咱們須要的服務器. 

turnadmin 用來管理帳戶. 

turnutils_stunclient 用於測試stun服務

turnutils_uclient 用於測試turn服務. 模擬多個UDP,TCP,TLS or DTLS 類型的客戶端

 

example 目錄主要是示範如何配置和使用turn. 包含一些測試用例. 

example/etc 下是pem證書和conf配置文件

example/var/db 下是sqlite的db庫. 用於示範數據庫的格式.

coturn 支持三種配置. 命令行, conf文件和數據庫. 數據庫支持sqlite, mysql, postgresql, MongoDB, redis.

 

examples\scripts 下一些測試用例: 

loadbalance 示範如何進行負載均衡.  設置一個master turn server 而後配置若干個slave turn server. 

longtermsecure 示範如何使用long-term 驗證

longtermsecuredb 與 longtermsecure 相似, 不過是從數據庫配置

shorttermsecure 示範如何使用short-term驗證. 

restapi 示範了web方面的使用. 

 

stun 定義了兩種驗證方式. 

Long-Term Credential
Short-Term Credential

具體能夠參考stun標準 http://tools.ietf.org/html/rfc5389#section-15.4

可是對於webrtc而言. 僅支持long-term . 

 

http://www.ietf.org/proceedings/87/slides/slides-87-behave-10.pdf
TURN REST Server API

這個PDF 描述了. turn服務器和客戶端的交互流程.

 

4. 簡單的使用

turnserver -o -a -f -v --mobility -m 10 --max-bps=100000 --min-port=32355 --max-port=65535 --user=ling:ling1234 --user=ling2:ling1234 -r demo

-m 10 表示啓動十個relay線程. 

當TURN Server用於WebRTC時,必須使用long-term credential mechanism,  即指定 -a 或者 --lt-cred-mech

--max-bps=100000 限制最大速度爲100KB/s. 

添加了兩個用戶ling 和ling2. 

能夠直接使用turnutils_uclient -u ling -w ling1234 來測試. turnutils_uclient 有不少參數能夠配置的. 

	webrtc::PeerConnectionInterface::IceServer turnServer;
	turnServer.uri = "turn:ip";
	turnServer.username = "ling";
	turnServer.password = "ling1234";
	servers.push_back(turnServer); 

  

c++ webrtc中能夠這樣配置turn. web/android/ios 也是相似的. 

若是從安全性方面考慮. 能夠爲帳戶生成key, 這樣就能夠直接經過key登陸. 而不須要提供密碼. 

key 經過turnadmin生成, 須要(username, password, realm) . realm是啓動turn server時-r 參數指定的. 

例如這樣: 

turnadmin -k -u ling -p ling1234 -r demo
0xccba8f3a6a025a38eb4a0e795fc92705
相關文章
相關標籤/搜索