Webrtc 强制终端只使用turn服务器(releay)

相信有很多小伙伴也会遇到和我一样的问题,怎么强制webrtc client 仅使用turn转发不使用p2p 和host。
面临的场景是想要测试Turn服务器压测。但目前host p2p都能拿到,这两种情况则无法对turn服务器造成压力。

Google资料获取到了两个关键信到的两个解决方案:
https://stackoverflow.com/questions/27224008/webrtc-force-peers-to-use-turn-server

其中有两种途径:
1 信令服务器传输时拿掉host和relay candidate 信令消息
2 RTCPeerConnection 初始化时是传入 relay参数,只支持relay模式。
看起来第二种更加正规一点。所以及采用这种方案。

1 配置RTCPeerConnection仅支持relay

1.1 RTCPeerConnection config

new RTCPeerConnection(config, constraints);

而config主要有以下参数

RTCConfiguration {
  sequence<RTCIceServer> iceServers;
  RTCIceTransportPolicy iceTransportPolicy;
  RTCBundlePolicy bundlePolicy;
  RTCRtcpMuxPolicy rtcpMuxPolicy;
  sequence<RTCCertificate> certificates;
  [EnforceRange] octet iceCandidatePoolSize = 0;
};

主要关心的为以下两个参数

sequence<RTCIceServer> iceServers;
RTCIceTransportPolicy iceTransportPolicy;

1.2 RTCIceServer 配置

https://w3c.github.io/webrtc-pc/#rtciceserver-dictionary

dictionary RTCIceServer {
  required (DOMString or sequence<DOMString>) urls;
  DOMString username;
  RTCIceCredentialType credentialType = "password";
};

该RTCIceServer词典用于描述STUN和TURN服务器,ICE代理可以使用该服务器建立与对等方的连接。想要只使用relay模式则这里必须配置turn Server参数。比如像像下面这样配置这个 iceServers参数

[
  {urls: 'stun:stun1.example.net'},
  {urls: ['turns:turn.example.org', 'turn:turn.example.net'],
    username: 'user',
    credential: 'myPassword',
    credentialType: 'password'},
];

1.3 配置RTCIceTransportPolicy 参数

https://w3c.github.io/webrtc-pc/#rtcicetransportpolicy-enum

enum RTCIceTransportPolicy {
  "relay",
  "all"
};

将改参数配置为relay 则产生的信令中仅有relay 模式的信令
比如像下面这样配置

iceTransportPolicy:"relay",

1.4 遇到的问题

这里遇到的主要问题是,turn stun 地址来自信令服务器(自定义),如果没有收到stun turn server 就初始化peerConnection 就会造成导致连接失败。如果仅是测试可直接写死iceserver参数。

正常的情况下在firefox 浏览器应该看到以下结果: 仅有turn-relay 的candidate消息。

turn-relay(IP4:192.168.1.116:54684/UDP|IP4:100.100.80.100:58995/UDP)
candidate:2578725009 1 udp 41885439 100.100.80.100 typ relay raddr 0.0.0.0 rport 0 generation 0 ufrag Xxbt network-id 1 network-cost 10

你可能感兴趣的:(音视频,webrtc)