原作者:Gustavo Garcia(原文链接)
翻译:刘通
想要知道如何将WebRTC数据从网络中其他数据中区分开来,是WebRTC开发者和用户们的一个常见需求。通常,目标是将RTC数据流的优先级设定高于其他不重要的通信量。
通过在边界路由器对WebRTC通信进行优先话,有可能在某些网络情景中改进通信质量。标记这个方法能够在这些最平常的情况中起到帮助作用
# 在拥挤的宽频上行链路中,当队列满了的时候,路由器可以丢掉其他类型的通信量而保留WebRTC
# 拥挤的本地无线网络
一个很明显的方法是使所有通信穿过TURN或者SFU服务器传输,并且将优先级设为基于IP地址的。这是一个简单易行的方法,但问题是如果你的基础结构经常改变的话这种方法很难保持。
另一个方法是使用差分服务代码点(DSCP)进行标记。使用DSCP你可以在IP报头中用特定的6位来标记不同类别的通信。这几位可以携带任何数值,你可以将其在路由器中与不同的优先级相关联。
甚至任何值都可以在DSCP域中使用,这里写了一些经常使用的DSCP值,在这篇IETF文章中还有一些在WebRTC端点中使用的推荐值。
现在,Chrome也支持了这些,可以通过专属限制传输到PeerConnection:
当IP数据包中激活的DSCP域被Chrome发出时,你可以从下图中看出来对于音频和视频来说,数值都是34。但是默认值是0。
如果你想亲自测试一下的话,这个是完整demo的网页:https://jsfiddle.net/omzyh5dm/5/
免责声明:在安卓和iOS设备上DSCP不能像文中所说一样作用,在一些版本的Windows中也不行,但是这些问题以后应该会讨论解决掉。
一个问题是为什么这些特征没有默认就激活呢,而且为什么不是所有的包都使用推荐的DSCP值标记的呢?主要原因是因为一些路由器可以使用这里解释的特定DSCP值阻挡数据包,所以它应该只会在当你知道哪些不应该阻挡数据,其中你的用户应该至少在浏览器实现机制发现这些被阻挡的包并且自动禁用他们的时候被激活。
链接:
1 查分服务器:https://en.wikipedia.org/wiki/Differentiated_services
2 对WebRTC QoS使用DSCP包标记: https://tools.ietf.org/html/draft-ietf-tsvwg-rtcweb-qos-18#section-2
3 DSP传输注意事项:https://tools.ietf.org/html/draft-ietf-rtcweb-transports-17#section-4.2
4 测试页:https://jsfiddle.net/omzyh5dm/5/