WEBRTC RELAY---COTURN

    xiaoxiao2021-03-26  8

    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:

     

     

    转载请注明原文地址: https://ju.6miu.com/read-650014.html

    最新回复(0)