RTCP协议详解:rr包(第一个rr包)
rfc标准文档:https://tools.ietf.org/html/rfc3550#section-6.4.2
这是一个抓包,和rtcp格式解析:sr包对应的rr包,所以肯定是音频的rr包,这里的音频是aac编码。
完整的rr包如下
81 c9 00 07 37 51 c9 35 37 51 c9 35 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 d0 a2 00 00
1
2
81
version : 版本是2
padding:没有填充
report count :有个1个report block
c9
payload 12*16+9 = 201,也就是rr包
00 07
payload长度,即整个rtcp包的大小
(7+1)*4=32字节
37 51 c9 35
ssrc,和sr包,以及rtp包是对应的
37 51 c9 35
report block的ssrc
00
fraction lost,丢包率为0。
loss fraction=lost rate * 256。定义的是两个rr发送间隔的丢包率,如果丢包率是25%,那么fraction lost = 25%*256 = 64
由于这是第一个rr包,还没有发生丢包,后续再分析有丢包的情况吧
00 00 00
累计丢包个数:说明还没有丢包
理论计算方式, packet lost = 期待得到报文数量 - 实际收到报文的数量
实际计算方式, packet lost = 期待收到最新sequence - 第一次收到报文的sequence。
00 00 00 00
计算方法,extended_seq_num = seq_num + (65536 * wrap_around_count)
其中wrap_around_count为sequence翻转的次数
00 00 00 00
00 00 00 00
这里有疑问?如果没有收到sr,才是0啊,但是前面已经有sr了啊???
d0 a2 00 00
接收端,在收到sr包,到发送rr包,所经历的时间。单位是1/65536秒。
这个字段打的可能有问题。
rtt
RTT: Round-Trip Time,发送者计算的发送来回时间。
发送者可以通过RR报文中的LSR和DLSR来计算RTT。
计算方法: 发送者用接收到RR报文的当前时间-RR报文的LSR,得到发送SR和接收到RR所花费的网络延时。
再进行: (接收到RR报文的当前时间-RR报文的LSR) - RR中的DLSR,也就是去除了在RTP接收者方本地的SR接收和RR发送的延时,这样就得到了RTT。
RTT = 接收到RR报文的当前时间-RR报文的LSR - RR中的DLSR
参考: https://blog.csdn.net/glw0223/article/details/89307095