webrtc Rtp/rtcp (1)
一,Rtp
1)介绍
RTP 全名是 Real-time Transport Protocol(实时传输协议). 它是 IETF 提出的一个标准,对应的 RFC 文档为 RFC3550.
3) RTP 格式
版本号(V):2 比特,用来标志使用的 RTP 版本。
填充位(P):1 比特,如果该位置位,则该 RTP 包的尾部就包含附加的填充字节。
扩展位(X):1 比特,如果该位置位的话,RTP 固定头部后面就跟有一个扩展头部。
CSRC 计数器(CC):4 比特,含有固定头部后面跟着的 CSRC 的数目。
标记位(M):1 比特,该位的解释由配置文档(Profile)来承担.
载荷类型(PT):7 比特,标识了 RTP 载荷的类型。
序列号(SN):16 比特,发送方在每发送完一个 RTP 包后就将该域的值增加 1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。
时间戳:32 比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间 在 流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。
同步源标识符(SSRC):32 比特,同步源就是指 RTP 包流的来源。在同一个 RTP 会话中不能有两个相同的 SSRC 值。该标识符是随机选取的 RFC1889 推荐了 MD5 随机算法。
贡献源列表(CSRC List):0~15 项,每项 32 比特,用来标志对一个 RTP 混合器产生的新包有贡献的所有 RTP 包的源。由混合器将这些有贡献的 SSRC 标识符插入表中。SSRC 标识符都被列 出来,以便接收端能正确指出交谈双方的身份。
二,Rtcp
1) 介绍
服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。在 RTP 会话期 间,各参与者周期性地传送 RTCP 包。RTCP 包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,各参与者可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP 和 RTCP 配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。
2) rtcp 类型
三,Sender Report 与 Receiver Report
1) SR
发送 rtp 报文端向接受者发送 SR 报文,主要目的是方便接收方做好音视频同步工作。
2) 格式定义如下
版本(V):同 RTP 包头域
填充(P):同 RTP 包头域。
接收报告计数器(RC):5 比特,该 SR 包中的接收报告块的数目,可以为零。
包类型(PT):8 比特,SR 包是 200。
长度域(Length):16 比特,其中存放的是该 SR 包以 32 比特为单位的总长度减一。
同步源(SSRC of sender):SR 包发送者的同步源标识符。与对应 RTP 包中的 SSRC 一样。
NTP Timestamp(Network time protocol):SR 包发送时的绝对时间值。NTP 的作用是同步不同的 RTP 媒体流。
RTP Timestamp:与 NTP 时间戳对应,与 RTP 数据包中的 RTP 时间戳具有相同的单位和随机初始值。
Sender’s packet count:从开始发送包到产生这个 SR 包这段时间里,发送者发送的 RTP 数据包的总数. SSRC 改变时,这个域清零。
Sender`s octet count:从开始发送包到产生这个 SR 包这段时间里,发送者发送的净荷数据的总字节数(不包括头部和填充)。发送者改变其 SSRC 时,这个域要清零。
3)RR
主要功能计算 rtt 和丢包
reporter ssrc: 此值为一个随机数,但是却要保持唯一 ,rr 报告发送者的 ssrc,也就是 rtp 报文接受者自己的 ssrc.
reportee ssrc: rr 报告接受者的 ssrc,也就是 rtp 报文发送者的 ssrc.
fraction lost: 上次 SR 或 RR 发送之后,从 SSRC_n 源的 RTP 报文丢失的部分,以定点数来表达,二进制的点在左边沿(相当于 loss 部分乘 256 之后取整)。这部分定义为丢失报文的数量除以期望的报文,像下段所应依的那样。如果因为复制而使损失为负,lost 部分设定为零。注意到接收者不能辨认是否有报文丢失,如果在上次报告间隔期间的报文丢失了,不会有没有接收报告来关注这个问题.
cumulative number of packets lost:24 bits 从接收开始,SSRC_n 源的 RTP 报文丢失的数量。定义为期望的减去实际接收的,其中接收的包括迟到的和复制的,如果有复制,丢失可能为负。期望的报文定义为由上次接收的序列号延伸出的序列号,如下所定义,减去接收到的初始序列号。
extended highest sequence number received:32 bits 低 16 位包含从源 SSRC_n 接收到的 RTP 数据报文中最高的序列值、高 16 位表示循环的次数
interarrival jitter:32 bits 关于 RTP 数据报文 interarrival 时间的统计方差的估值,以 timestamp 单元来估值,表现为无符号整数。interarrival jitter J 定义为 D 的均方差,D 为接收者和发送者的间隔。像下面方程所示,等于两个报文的“相对传输时间”(the relative transit time) 的差;相对传输时间是一个报文的 RTP timestamp 和到达接收者的时钟的差,在相同单元衡量。
last SR timestamp (LSR):32 bits NTP timestamp 的中间 32 位作为从源 SSRC_n 来的最近的 RTCPSR。如果尚未接收到 SR,域设置为零。
delay since last SR (DLSR):32 bits 延迟定义为从接收到从源 SSRC_n 来的上一个 SR 到发送本接收报告块的间隔,表示为 1/65536 秒一个单元。如果尚未收到 SR,DLSR 域设置为零.
4) RTT(Round-Trip Time) 计算
见函数: RTCPReceiver::HandleReportBlock
t0 = report_block.last_sr()
t1 = CompactNtp(clock_->CurrentNtpTime())
LSR = report_block.delay_since_last_sr()
rtt = t1- LSR - t0 ;
4) 丢包率计算
定义一个 rr 发送间隔中 rtp 报文的丢失率, 它是一个 8bits 的数据段,计算方法为,loss fraction=lost rate x 256.
举例,丢包率为 25%,该字段为 25%*256=64
评论