* 概念理解:
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