什么时候需要turn服务器?
在对称型网络下,是无法实现P2P互通的。这时就需要TURN服务器作为中转,实现媒体数据的中继互转功能。
turn client与turn server之间可以走UDP、TCP、TLS三种协议报文。
实际应用中Turn协议的工作主要有四个阶段:绑定(binding)、分配(Allocation)、转发(Relay)和信道(Channel)
第一步绑定:
binging request:
bind response:
第二步 分配:
客户端想要在服务器端获得一个中继分配,客户端需要在中继服务器上申请一个中继事务。客户端发送分配请求(Allocate request)到服务器,然后服务器为用户开启一个relay端口后返回分配成功响应,并包含了分配的地址信息。客户端可以在属性字段描述其想要的分配类型:UDP or TCP。
allocation request:
allocation response:
第三步 转发:
webrtc中使用send&data indicate数据包,主要是用来做连通性测试使用
P2PTransportChannel::SortConnectionsAndUpdateState ->P2PTransportChannel::MaybeStartPinging ->P2PTransportChannel::OnCheckAndPing ->P2PTransportChannel::PingConnection ->Connection::Ping
第四步:
音视频数据转发场景中,使用Send/Data Indication转发机制,会多加的36字节格式信息,加重客户端和服务端之间的带宽压力。为改善这种情况,turn提供channeldata message信道机制。channeldata message不使用stun头部,而使用一个4字节的头部,包含一个称为信道号的值(channel number)。每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。要将一个信道与对等端绑定,客户端首先发送一个信道绑定请求(channelbind request)到服务器,并且指定一个未绑定的信道号以及对等端的地址信息。绑定后client和server都能通过channeldata message来发送和转发数据。信道绑定默认持续10分钟,并且可以通过重新发送channelbind request来刷新持续时间。和Allocation不同的是,并没有直接删除绑定的方法,只能等待其超时自动失效。
channel bind request:
channel bind response: