写点什么

webrtc Rtp/rtcp (1)

用户头像
糖米唐爹
关注
发布于: 7 小时前
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 类型

RTCPPacketType : uint32_t {  kRtcpReport = 0x0001,  kRtcpSr = 0x0002,  kRtcpRr = 0x0004,  kRtcpSdes = 0x0008,  kRtcpBye = 0x0010,  kRtcpPli = 0x0020,  kRtcpNack = 0x0040,  kRtcpFir = 0x0080,  kRtcpTmmbr = 0x0100,  kRtcpTmmbn = 0x0200,  kRtcpSrReq = 0x0400,  kRtcpApp = 0x1000,  kRtcpLossNotification = 0x2000,  kRtcpRemb = 0x10000,  kRtcpTransmissionTimeOffset = 0x20000,  kRtcpXrReceiverReferenceTime = 0x40000,  kRtcpXrDlrrReportBlock = 0x80000,  kRtcpTransportFeedback = 0x100000,  kRtcpXrTargetBitrate = 0x200000};
复制代码


三,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

    int64_t rtt_ms = 0;    uint32_t send_time_ntp = report_block.last_sr(); //t0     // RFC3550, section 6.4.1, LSR field discription states:    // If no SR has been received yet, the field is set to zero.    // Receiver rtp_rtcp module is not expected to calculate rtt using    // Sender Reports even if it accidentally can.    if (!receiver_only_ && send_time_ntp != 0) {        uint32_t delay_ntp = report_block.delay_since_last_sr(); //LSR        // Local NTP time.        uint32_t receive_time_ntp = CompactNtp(clock_->CurrentNtpTime()); // t1
// RTT in 1/(2^16) seconds. uint32_t rtt_ntp = receive_time_ntp - delay_ntp - send_time_ntp; //rtt // Convert to 1/1000 seconds (milliseconds). rtt_ms = CompactNtpRttToMs(rtt_ntp); ......... report_block_info->last_rtt_ms = rtt_ms; report_block_info->sum_rtt_ms += rtt_ms; } packet_information->rtt_ms = rtt_ms;
复制代码


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

用户头像

糖米唐爹

关注

还未添加个人签名 2020.08.12 加入

还未添加个人简介

评论

发布
暂无评论
webrtc Rtp/rtcp (1)