WEBRTCRELAY---COTURN
WEBRTC P2P穿透不了采用RELAY策略,RELAY实现采用标准的
RFC5766(UDP Allocation),当然少不了RFC5389,但没有实现RFC6062(TCP Allocation) RELAY采用的传输层协议,由STUN Attributes REQUESTED-TRANSPORT决定,RFC5766定义UDP ,RFC6062定义了TCP,这个REQUESTED-TRANSPOR 规定的是TURN SERVER与PEER之间的传输协议,CLIENT与TURN SERVER的协议 RFC5766规定可以为UDP,TCP,TLS;RFC6062 必须为TCP,TLS。
WEBRTC 实现RFC5766的代码为 turnport.cc/.h
1.设置SERVER 与 PEER间为 UDP传输代码:在ALLOCATE请求中指定
voidTurnAllocateRequest::Prepare(StunMessage* request) {
// Create the request as indicated in RFC5766, Section 6.1.
request->SetType(TURN_ALLOCATE_REQUEST);
StunUInt32Attribute* transport_attr =StunAttribute::CreateUInt32(
STUN_ATTR_REQUESTED_TRANSPORT);
transport_attr->SetValue(IPPROTO_UDP<< 24);
VERIFY(request->AddAttribute(transport_attr));
if (!port_->hash().empty()) {
port_->AddRequestAuthInfo(request);
}
}
2.设置CLIENT与SERVER间的传输为RelayServerConfig通过解析URL设置
URL 格式为:
// turnURI = scheme ":" turn-host [":" turn-port ]
// [ "?transport="transport ]
// scheme = "turn" / "turns"
// transport = "udp" / "tcp" /transport-ext
// transport-ext = 1*unreserved
// turn-host = IP-literal / IPv4address / reg-name
// turn-port = *DIGIT
eg. Tun:ip:port?Transport=udp 为client与server间为 udp
eg. Tun:ip:port?Transport=tcp 为client与server间为 tcp 至于是否为TLS 则通过安全属性设置
具体原理图如下:
从RFC原理中可以看出,SEND 消息中指定了数据接收者XOR-PEER-ADDRESS
实现数据转发给多个PEER并不是在TURNSERVER,而是在CLIENT,即TURN规范并没有定义实现同一个数据向多个PEER的定义。只是实现一对一的RELAY。而且CLIENT要发给谁,必须事先创建许可权限指定那些PEER的XOR-PEER-ADDRESS。
RFC5766: