在RTP回话中,事实上已经涉及了两路不同的媒体数据:RTP和RTCP的数据。传统的方式是,当终端准备接收RTP数据时,终端开启一个UDP端口来接收RTP数据,同时需要开启另外一个UDP端口来接收RTCP数据流。换句话说,其实在传输层,已经执行了多路分解的服务。通过进入到端口,用户会知道进入到数据是何种数据类型。RFC 5761 则定义了一个新的传输方式,不同于以前的方式,新的传输方式中,终端仅使用一个端口来接收数据,而不是传统的方式-终端发送数据使用了两个UDP端口来控制数据。新的方式具有以下优点:
简化了NAT traversal,因为仅使用一个端口实现媒体和消息控制。
理论上,系统中的媒体回话数量可以实现翻倍。
采集新的 ICE 和 SDP 支持ICE会变得相对简单。用户仅需要一个candidates 集合,而不是其中的两个。
当配合 SDP ”BUNDLE“ 协商时,所有媒体回话使用同一端口,简化了传输 方式和NAT处理流程。
Google在WebRTC做出来非常大的贡献,当然也一直对此技术不断进行优化和改进。为了更加简化数据传输的方式,Google工程师提出了新的方式来处理RTP数据,官方工程师采用了新的方式来管理RTP数据,这个功能就是rtcp-mux。为了配合Google浏览器的工作,Asterisk也必须增加对rtcp-mux的功能支持。目前,google 可以支持两种:
- negotiate: 这种模式下,Chrome 会首先尝试使用rtcp-mux,但是如果远端终端不支持rtcp-mux,则会回退到传统模式。
- require: 在这种模式下,如果远端终端不支持rtcp-mux,那么则不会创建呼叫连接。
- rtcp-mux 是WebRTC 数据的主要超时方式。
- [size=1em]JSEP[size=1em]新标准使用了 “require” 的方式。根据协议规定: “the default multiplexing policy MUST be set to require”。
关注公众号:asterisk-cn,论坛:www.freeuc.org 获得有价值的技术分享资料。