相信有很多小伙伴也会遇到和我一样的问题,怎么强制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模式。
看起来第二种更加正规一点。所以及采用这种方案。
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;
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'},
];
https://w3c.github.io/webrtc-pc/#rtcicetransportpolicy-enum
enum RTCIceTransportPolicy {
"relay",
"all"
};
将改参数配置为relay 则产生的信令中仅有relay 模式的信令
比如像下面这样配置
iceTransportPolicy:"relay",
这里遇到的主要问题是,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