微服务开发实战

微服务协议之RTP

2019-08-18  本文已影响0人  老瓦在霸都

为满多媒体应用传输实时数据的需要, IETF RFC 3550 定义了实时传输协议RTP: A Transport Protocol for Real-Time Applications 即为实时应用程序所定义的传输协议, 它为交互式音频和视频聊天和会议应用提供端到端的传输服务.

解决的问题

让我们先想想实时传输需要解决哪些问题:

  1. 顺序 Sequence
    多媒体数据包需要保序, 否则就会前言不搭后语, 让人不知所云, 通常我们可以用 sequenceNumber 来标识数据包的顺序, 通过它我们可以知道:
  1. 时间和缓存 Timstamp and buffer

我们还需要知道数据包的时间, 在回放语音和视频时需要按规定的时间线播放并操持音视频同步, 所以一个 timestamp 是必需的, 通过它我们可以用来

  1. 载荷类型辨识 Payload type

我们需要知道数据包里承载的是什么内容, 媒体内容是音频还是视频, 是什么编码类型, 所以还需要一个 payload type

  1. 错误隐藏 Error concealment

错误总是难以避免的, 特别是在网络基于 UDP 的传输, 当发现网络丢包, 延迟, 乱序时我们要采取一些错误隐藏技术, 比如在相邻帧中添加冗余来掩盖丢包的错误, 或者自动插入一些重复数据包

  1. 服务质量反馈 QoS feedback

当语音或视频质量不佳时, 接收端需要告诉发送端做出调整, 或者调整发送速率或分辨率, 或者重新发送关键帧等, 这就需要一些度量报告, 比如 接收者报告RR(Receiver Report ) 和发送者报告SR(Sender Report)。

根据上述的问题和需求, RTP 协议由此制订出来, 它主要包括两块

  1. 承载具有实时性质的数据的实时传输协议RTP。
  2. 在进行的会话中监视服务质量并传输会话参与者信息的实时传输控制协议RTCP。

1. RTP

RTP 通常基于 UDP 传输, 因为多媒体数据可以忍受少量丢包, 却不能忍受数据包延时过大, 如图所示:

RTP协议栈

它的数据包格式如下:

RTP 数据包格式g

包头详细解释如下:

RTP 标准头之后就是载荷了, 如图所示:

RTP 数据包负载g

SDP 描述如下:

v=0
o=sample 496886 497562 IN IP4 127.0.0.1
s=sammple_rtp_session
c=IN IP4 127.0.0.1
t=0 0
m=audio 18276 RTP/AVP 102 13 98 99
a=sprop-source:1 csi=932617472;simul=1
a=sprop-simul:1 1 *
a=recv-source 1,2,3
a=rtpmap:102 iLBC/8000
a=rtpmap:13 CN/8000
a=rtpmap:98 CN/16000
a=rtpmap:99 CN/32000
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=ptime:20

由此可知数据包长度共为 118 字节, 其中:

2. RTCP

RTCP 实时传输控制协议, 它的主要目的就是基于度量来控制 RTP 的传输来改善实时传输的性能和质量, 它主要有5种类型的RTCP包:

  1. RR接收者报告Receiver Report
  2. SR发送者报告 Sender Report
  3. SDES数据源描述报告 Source DEScription
  4. BYE 告别报告 Goodbye
  5. APP 应用程序自定义报告 Application-defined packet

RR, SR, SDES 可用来汇报在数据源和目的之间的多媒体传输信息, 在报告中包含一些统计信息, 比如 RTP包 发送的数量, RTP包丢失的数量, 数据包到达的抖动, 通过这些报告, 应用程序就可以修改发送速率, 也可做一些其他调整以及诊断。

RTCP 数据包类型

它也是基于 UDP 包进行传输:

RTCP 数据包栈

RTCP 的数据包格式如下:

RTCP packet

3. RTP 协议的度量要点

通过RTP 数据包头和 RTCP 报告, 我们能够度量 RTP 传输的三个主要度量指标 往返延迟RTT, 丢包Packet Loss 和 抖动Jitter

1) 往返延时RTT

往返延时RTT 很好理解, 也就是数据包在发送和接收双方走一个来回所花费的时间.
当延时在150ms以下时,通话双方几乎不能感觉到延时的存在,而当延时在400ms以下时,也是用户能够接受的,当延时进一步增大后,达到800ms以上,正常的通话就无法进行.
接受者报告RR可用来估算在发送者和接收者之间的往返延迟 RTT, 在接收者报告中包含:

往返时延RTT 计算公式如下:

RTT = T1 – LSR - DLSR

2) 抖动Jitter

在理想情况下, RTP数据包到达的间隔是固定的, 比如IP电话中最常用的编码g.711, 每个包的荷载长度为20毫秒, 每秒应该有50个数据包, 但是实际上网络并不总能稳定传输的, 阻塞,拥塞是常有的事, Jitter 抖动即指数据到达间隔的变化,如图所示:
抖动的计算也很简单, 先计算数据包接收与发送时间间隔的差别

为避免偶发的波动造成抖动的计算偏差, 可以由如下公式得出抖动值:

抖动是不可避免的, 在合理区间的抖动是可以接受, 通常采用抖动缓冲 Jitter Buffer 来解决抖动的问题, 数据包接收之后并不马上解码, 而是先放在缓冲区中. 假设缓冲区深度是60ms, 那么解码总是等到缓冲区中的若干数据包总长度达到60ms时才取出解码, 在60ms 之内的抖动自然没有任何影响.

3) 丢包 Packet loss

如果一个数据包的延时过大, 超过了最大的抖动缓冲深度, 应用程序也就不会再等待, 直接丢弃, 采用丢包补偿策略进行处理, 如果是关键帧, 可能还需要让发送方重传.

Packet loss丢包率的公式很简单

根据上述度量指标, 多媒体应用程序可以即时调整编码参数, 分辨率,发送速率等, 为用户提供流畅的体验.

上一篇 下一篇

猜你喜欢

热点阅读