WEBRTC RELAY---COTURN

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:

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值