WebRTC TURN协议初识及turnserver实践

WebRTC协议栈

图一 WebRTC stack

TURN的全称为Traversal Using Relays around NAT,是STUN/RFC5389的一个拓展,主要添加了Relay功能。如图一所示,TURN协议是建立在UDP协议之上的一个应用层协议。如果一台主机处于NAT后面,那么在一定条件下(NAT穿透失败)两台主机无法之间进行通讯。在这种条件下,那么使用中继服务提供通讯是有必要的。TURN协议允许一台主机使用中继服务与对端进行报文传输。TURN协议也是ICE(交互式连接建立)协议的组成部分,也可以单独使用。如果TURN使用于ICE协议中,relay地址会作为一个候选,由ICE在多个候选中进行评估,选取最合适的通讯地址。一般来说中继的优先级都是最低的。

TURN和其他中继协议的不同之处在于,它允许客户端使用同一个中继地址(relay address)与多个不同的peer进行通信。如图二所示。

图二 同一个中继地址和多个peer通信

Turn协议工作原理

Turn协议的工作原理主要有三个阶段,也称三大机制。分配(Allocation),转发(Relay)和信道(Channelÿ

### 设置和使用 WebRTC TURN Server 客户端 #### 配置 RTCPeerConnection 使用 TURN 服务器 为了使 WebRTC 应用程序能够穿越 NAT 或防火墙,通常会配置 STUN 和 TURN 服务器来辅助 ICE 候选收集过程。当直接通信不可行时,TURN 服务器作为中继点发挥作用。 创建 `RTCPeerConnection` 实例时,可以通过传递包含 TURN 服务器信息的对象来进行初始化: ```javascript const iceConfiguration = { iceServers: [ { urls: 'turn:my-turn-server.mycompany.com:19403', username: 'optional-username', credential: 'auth-token' } ] }; const peerConnection = new RTCPeerConnection(iceConfiguration); ``` 上述代码片段定义了一个带有单个 TURN 服务器条目的 `iceServers` 数组[^2]。每个条目至少应指定 URL 地址;如果 TURN 服务需要身份验证,则还需提供用户名 (`username`) 及凭证 (`credential`) 参数。 #### 中继模式与通道模式的选择 在实际部署过程中,客户端可以选择不同的方式与对等方交换媒体流。具体来说,存在两种主要的数据传输机制——Relay(中继)和 Channel(信道)。这两种方案均需向服务器说明目标节点的身份,并由服务器通知当前节点有关发送者的信息[^3]。 对于大多数应用场景而言,默认采用 Relay 方式即可满足需求。然而,在某些特殊情况下(比如高带宽视频通话),Channel 模式的效率可能更高,因为它减少了额外的封装开销并允许更灵活的消息路由策略。 #### 示例:完整的 Peer Connection 初始化流程 下面给出一段更为全面的例子,展示如何在一个典型的 WebRTC 浏览器环境中建立连接,并启用 TURN 支持: ```javascript // 创建一个新的 RTCPeerConnection 对象实例 let configuration = { "iceServers": [{ "urls": ["stun:stun.l.google.com:19302"], // 添加公共STUN服务器以提高成功率 "url": "turn:my-turn-server.example.org", "username": "webrtc", "credential": "secret" }] }; let pc = new RTCPeerConnection(configuration); // 处理本地音轨采集... navigator.mediaDevices.getUserMedia({audio:true, video:false}) .then(stream => { stream.getTracks().forEach(track=>pc.addTrack(track,stream)); }); // ...其他必要的 SDP 协商逻辑... // 当ICE候选被发现时触发此事件处理函数 pc.onicecandidate = event => { if (event.candidate){ console.log('New candidate:', JSON.stringify(event.candidate)); // 将候选人发送给远程参与者 } }; ``` 这段脚本不仅设置了 TURN 服务器参数,同时也包含了获取用户麦克风权限并将音频轨道加入到 `peerConnection` 的操作。此外,监听了 `onicecandidate` 事件以便及时更新远端关于新找到的网络接口详情。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值