* 概念理解:
1. SDP協議:會話描述協議,視頻通話的雙方通過交換SDP信息進行媒體協商,從而選擇使用某一相同的媒體協議進行通信;
? ? TLS協議:基于TCP的安全層傳輸協議
? ? DTLS協議:基于UDP的安全層傳輸協議
2. NAT網絡地址轉換:如下,不知道對方地址,所以通過向對方發探測包,向索引服務器轉發反饋包的方式獲取目標地址的過程;但由于國內網絡環境復雜,如電信、聯通、移動、安卓、IOS等區分,有時候NAT不通,如路由器便具備NAT功能;
? ??
3. candidate:存儲候選網絡信息,將其通過服務器發送給另一端,彼此交換candidate進行網絡協商;
4. STUN(srflx):由RFC 5389定義的一種網絡協議,允許位于各自NAT之后的客戶端雙方分別找出自己的公網地址、NAT類型、映射端口,使用這些信息使兩個同時位于NAT路由器后的客戶端之間創建UDP通信;局域網內不需要STUN服務器,因為客戶端在同一個NAT下;
STUN的優勢:
? ? a. STUN服務器在通信過程中的作用是分別獲取兩客戶端的公網地址、端口、NAT類型等,然后使兩客戶端直接通過自己的公網地址建立連接,傳輸媒體時,STUN服務器不參與;
STUN的缺陷:
? ? a. 國內網絡環境復雜,有時NAT類型的不同會導致STUN無法成功;
? ? b. 如下圖,通過STUN協議建議的UDP通信是端對端的直連, 傳輸媒體流時使用的是雙方各自自己的帶寬,若進行多人視頻通話,則受本地帶寬影響,STUN或可能無法成功建立連接;
? ??
5. TURN(relay):對STUN進行擴展的網絡協議,主要添加了Relay功能,即當STUN無法順利建立UDP通訊連接時,使用公網服務器作為中繼,對來往服務器進行轉發,該轉發協議即為TURN;
TURN的優勢:
? ? a. 如下圖,STUN協議通訊失敗后,通過請求TURN服務器獲取其公網地址作為中繼地址,互相轉發媒體流給對方客戶端,由于TURN服務器參與其中,帶寬壓力主要由服務端承擔,因此多人通訊時受本地帶寬影響小;
? ? b. TURN協議可以在所有網絡環境下使用;
??
6. coturn:coturn 是對 STUN 和 TURN 的整合,主服務是 turnserver;
7. 監聽端口、協議及開放規則:
? ? ? ? STUN:3478(UDP)
? ? ? ? TURN:3478(TCP/UDP)、5349(TLS/DTLS)、49152–65535(UDP)
? ? ? ? a.?iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3478 -j ACCEPT
? ? ? ? b.?iptables -I INPUT -p udp --destination-port 3478 -j ACCEPT
? ? ? ? c.?iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 5349 -j ACCEPT
? ? ? ? d.?iptables -I INPUT -p udp --destination-port?5349 -j ACCEPT
? ? ? ? e. iptables -I INPUT -p udp --destination-port 49152:65535 -j ACCEPT
? ? 注:TLS/DTLS 協議需要使用其支持的證書 /etc/turn_server_cert.pem、/etc/turn_server_pkey.pem
* 搭建:192.168.1.109 (xxx.xxx.49.99)
? ? # 開放本地端口
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3478 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 5349 -j ACCEPT
iptables -I INPUT -p udp --destination-port 3478 -j ACCEPT
iptables -I INPUT -p udp --destination-port?5349 -j ACCEPT
? ??# 搭建過程
cd /usr/local &&
yum install -y git make gcc gcc-c++ &&
yum install -y libevent-devel.x86_64 openssl openssl-libs libevent2 &&
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz &&
tar xvfz libevent-2.1.8-stable.tar.gz &&
rm -rf libevent-2.1.8-stable.tar.gz &&
cd libevent-2.1.8-stable && ./configure &&?
make && make install && cd .. &&
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1 &&
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 &&
openssl version
? ??附件:coturn.zip? ? ? ? ?? (? 下載地址:git clone https://github.com/coturn/coturn? )
unzip coturn.zip &&
cd coturn &&
yum install openssl-devel -y &&
./configure &&
make &&
make install &&
cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf &&
mkdir -p /var/log/turnserver/ &&
cd /usr/local/etc &&
? ? #?生成專屬密鑰文件
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
? ? (一路回車)
? ? # 在 hefu 用戶域中添加用戶 hefu01? hefu02
turnadmin -a -u hefu01 -p hefu123 -r hefu
turnadmin -a -u hefu02 -p hefu123 -r hefu
? ? # 加密密碼(MD5密碼)
turnadmin -k -u hefu01 -p hefu123 -r hefu
turnadmin -k -u hefu02 -p hefu123 -r hefu
vi? /etc/turnuserdb.conf
? ??hefu01:0x6bc278d081f5342c54f63f3c1852e1e6
? ??hefu02:0x317d350a92623178603620504b0ec707
vi? /usr/local/etc/turnserver.conf
? ? 附件:turnserver配置內容.txt? ? ? turnserver.conf
? ? # 啟動與自啟
vi /etc/init.d/coturn_start.sh
#!/bin/bash
#chkconfig:2345 89 15
#description:turn-start
turnserver -o -a -f -r hefu
echo "turnserver started success. If you want to stop it,please kill it."
cd /etc/init.d/ &&
chmod +x coturn_start.sh &&
chkconfig coturn_start.sh on &&
./coturn_start.sh