Fork me on GitHub

webRTC使用记录3

副标题:webRTC 使用准备之流媒体协议

参考文章:WebRTC中RTP/RTCP协议实现分析

RTP 协议定义流媒体数据在互联网上传输的数据包格式,而 RTCP 协议则负责可靠传输、流量控制和拥塞控制等服务质量保证。有名的是Google的GCC(拥塞控制算法(Google Congestion Control,简称GCC[1]))).

UDP 协议:源端口、目的端口、UDP 长度、校验和、数据

  • 相比 TCP 协议,数据有效性、有序性等等完全不管,更适合流媒体的实时传输。
  • TCP 为了保证包的有序到达,具有丢包重传机制,比如丢包时的计时器从 200ms 到 400ms 到更久的时间,所以不适合实时传输。但当 UDP 不通时,需要换用 TCP 来保证连通率。但当 TCP 不通时,需要换用 HTTPS 来保证连通。
  • UDP 无法解决的有序性等问题,由应用层的协议来解决。

RTP 协议:UDP 的上层协议,也能跑在 TCP 上(但一般不会这么干)。

  • 具有 sequence number 字段,用于对数据包进行排序。
  • timestamp 字段,用于判断某些包是否属于同一帧。若多个包具有相同的 timestamp,说明它们属于同一帧。
  • SSRC 字段,synchronization source identifier,同步信源。占 32 位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。
  • CSRC 字段,共享源。每个 CSRC 标识符占 32 位,可以有 0~15 个。每个 CSRC 标识了包含在该RTP报文有效载荷中的所有特约信源。
  1. 视频或音频的接收端通常有一个环形队列,计算:一秒 30 帧数据,控制 200 毫秒以内的延迟,然后一个队列中能够装多少包,是可以计算出的,进而推算出环形队列的大小。

RTCP 协议:

  • 标准的 Header:version+P(即 padding)+Count+Type+Length = 2 + 1 + 5 + 8 + 16 bit

RTCP Type:

PT 缩写 说明 tips
200 SR Sender Report packet 重要※
201 RR Receiver Report packet 重要※
202 SDES Source Description packet 源描述协议,用于切源
203 BYE Goodbye packet
204 APP Application-defined packet 应用层自定义
192 FIR Full INTRA-frame Request 请求完整的I-帧,用于完全重新开始接收时(废弃,功能由 206 完成)
193 NACK Negative Acknowledgement 标记收包情况(废弃,功能由 206 完成)
205 RTPFB Generic RTP Feedback 传输层的返回包
206 PSFB Payload-specific Feedback 应用层的返回包,对内容编解码器进行反馈

Intra的含义是图像内编码,不需要其他图像信息即可解码.

RTCP SR

  1. SR = header + sender info + report block * N 。
  2. header 也就是标准的 RTCP header。
  3. Sender info block 和 report block 如下。

Sender Information block:

  • NTP timestamp,用于音视频同步的时间戳,网络时间戳,64 位。
  • RTP timestamp, RTP 的普通时间戳,32 位,与 RTP 包时间戳一致。
  • SPC,发送的包的总数,32 位。
  • SOC,发送的包的全部字节,32 位。

Report block:

  • SSRC_1:标识哪个 SSRC,32 位
  • fraction lost:丢包率,8 位。
  • packets lost:自接收开始的丢包总数,迟到包不计入,24 位。
  • cumulative number of packets lost:丢包总数
  • extended highest sequence number received:一般 2^16个算一个,这个字段里面,高 16 位标识属于哪个段,低 16 位标识属于段中哪里 sequence number。
  • jitter:RTP 包接收时间间隔的统计方差,用于拥塞防止的重要参考字段,如果持续增长,说明可能存在拥塞。
  • last SR(LSR),上次发送SR 的时间戳,34 位。
  • delay since last SR: 接收 SR 的时间与发送 SR 的时间差。

RTCP RR

RR = header + report block * N

看下图,跟 SR 类似,不再赘述。


RTCP SDES

SDES:header + (SSRC + SDES items)* N

SDES item 采用TLV 结构类型:type + length + value

  • 举例: CNAME + length + name…
type 说明
CNAME CNAME 与 SSRC 对应,CNAME 为源的唯一标识
NAME 用于描述源名,人类可读
EMAIL
PHONE
LOC
TOOL 没啥用
NOTE 备注
PRIV 私有扩展

RTCP BYE

BYE = header + SSRC * N + length + opt(reason for leaving)


RTCP APP

APP = header + SSRC + nameN + applicationData


RTCP RTPFB & PSFB

FB = header(传统 RTCP 的 header 小改) + SSRC + SSRC2 + FCI

类型 说明
传输层的 FB RTPFB,是对传输层的控制,如 NACK
负载层的 FB PSFB,是对负载层的控制,如编解码器,如 PLI
应用层的 FB 应用层自己识别,一般认为是一种特殊的 PSFB

RTPFB分类:

  1. NACK:对丢包请求的
  2. TMMBR:最大媒体流比特率请求,max media stream bitrate request。表明接收端当前带宽受限,告诉发送端控制码率。
  3. TMMBN:max media stream bitrate notification.响应的通知,会告知最大的带宽,是 TMMBR 的响应。

PsFB 分类:

  1. PLI:picture loss indication, 图片丢失,可能会将这个帧的所有包都发送过来。
  2. SLI:slice loss indication, 每个视频帧可能包含多个 slice,每个 slice 可能对应一个包,slice 如果丢失时可能会发送这个请求。
  3. RPSI:reference picture selection indication, 参考图片丢失,相当于 B 帧丢失。
  4. FIR:full intra request command, 请求一个完整的内部帧。
  5. TSTR:temporal-spatial trade-off request, 空间时间交互系统的请求。
  6. TSTN:temporal-spatial trade-off notification, 上面 5 的响应。
-------------The End-------------