webrtc TURN协议

1. WebRTC协议栈

2. TURN 和STUN和ICE

ICE 是一个框架,它整合了STUN和TURN, STUN是P2P直连, TURN是中继部分.

3. 简介

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

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

参考博客

4. Turn协议三大机制

a 和 b 使用中继, a拿到自己的的中继地址发给b, b和中继地址通信. 反之相同.

1. 分配(Allocation)

客户端想要使用中继功能,需要在中继服务器上申请一个中继地址。客户端发送分配请求(Allocate request)到服务器,服务器为用户开启一个relay端口然后返回分配成功响应,并包含了分配的地址。

位于nat后的clientA向Stun服务器发送Allocate request请求得到一个relay地址. Allocate response 的XOR-RELAYED-ADDRESS属性就是A的relay端口.客户端A拿到relay地址就是客户端A在公网的地址. 可以和其他Client交互.

2. 转发机制(Relay)

图中的4、5、6、7都会被stun协议包装SendData indication(Send c->s; Data s->c; indication添加了 XOR-PEER-ADDRESS属性),

3. 信道(Channel)

信道的出发点是节省带宽占用,提高传输效率。做法是用‘标示’(信道号的值(channel number))来替换STUN消息.

TURN提供了方法来让client和peer交互数据.该方法使用另一种数据包格式,即ChannelData message,信道数据报文。
ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number),每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。

要将一个信道与对等端绑定,客户端首先发送一个信道绑定请求(ChannelBind Request)到服务器,并且指定一个未绑定的信道号以及对等端的地址信息。

4. 真实案例

webrtc demo turn抓包
抓包截图:

端口33681 和端口29211 的data中的收发互为相等

P2P通信标准协议(一)之STUN
P2P通信标准协议(二)之TURN
P2P通信标准协议(三)之ICE

原文地址:https://www.cnblogs.com/WillingCPP/p/14073556.html