其他分享
首页 > 其他分享> > WebRtc简介

WebRtc简介

作者:互联网

WebRtc基本概念及协议介绍

术语

STUN TURN ICE如何工作

  1. SDP offer包含有关A的应用程序想要建立的会话的信息,包括要使用的编解码器,这是音频还是视频会话等
  2. 还包含 ICE candidates,它们包含B应用程序尝试连接A应用程序需要用到的A的IP和port信息

b) A的应用程序向STUN服务器发出建立ICE候选者列表请求

  1. A的应用程序收集ICE候选
  2. 服务器返回发起请求的公共IP地址和端口对。A的应用程序将每对添加到ICE候选列表中

c) A的应用程序向STUN服务器发出建立ICE candidates请求

  1. A的应用程序收集ICE candidates
  2. 服务器返回发起请求A的公网 IP地址和端口对。A的应用程序将每对IP及端口 添加到 ICE candidates中

d) A的应用程序通过信令通道将SDP传递给B的应用程序

  1. WebRTC标准未指定用于此交换的传输协议。它可以通过HTTPS,安全WebSocket或任何其他通信协议执行
  2. 在此,B收到A的公网地址及端口

e) B的应用程序生成一个SDP Answer并发给A

  1. B的应用程序遵循上一步中A使用的步骤:收集ICE candidates等。然后B的应用程序需要将此SDP Answer通过信令服务器返回给A的应用程序
  2. 在此,A收到B的公网地址及端口

f) A和B执行一系列连接检查

  1. 每个应用程序中的ICE算法都从对方SDP中收到的列表中获取ICE candidates IP /端口对,并向其发送STUN请求
  2. 果另一个应用程序返回了响应,则原始应用程序认为检查成功,并将该IP /端口对标记为有效的ICE候选者

g) 开始数据传输

  1. 如果任何一个应用程序都找不到通过连通性检查的IP /端口对,它们将向TURN服务器发出STUN请求以获取媒体中继地址
  2. 中继地址是一个公共IP地址和端口,用于转发与应用程序之间接收到的数据包并设置中继地址。然后将该中继地址添加到候选列表,并通过信令通道进行交换

h) 结构图
在这里插入图片描述

相关协议

  1. 通信双方:通过DTLS握手,协商生成一对密钥
  2. 数据发送方:将音视频数据封装成RTP包,将控制数据封装成RTCP包
  3. 数据发送方:利用加密密钥,对RTP包、RTCP包进行加密,生成SRTP包、SRTCP包
  4. 数据发送方:通过UDP传输SRTP包、SRTCP包
  1. 通信双方:通过DTLS握手,协商生成一对密钥
  2. 数据发送方:将自定义应用数据,通过密钥进行加密,生成SCTP包
  3. 数据发送方:通过UDP传输SCTP包
  1. 是[0, 1]时,表示可能是STUN报文
  2. 是[128, 191]时,表示可能时RTP(SRTP)报文
  3. 是[20, 63]时,表示可能是DTLS record layer报文

1.发送端通过发送SR包告诉接收端发送端的信息,SR包分为三部分:头部header,发送者信息senderInfo和反馈块ReportBlock。
2.如果发送端也作为接收端,那么才会存在ReportBlock,当存在多个码流的时候就会反馈多个ReportBlock。
3.SR包的负载类型是200
4.详见:https://blog.csdn.net/momo0853/article/details/88051312

c) RR(Receiver Report RTCP Packet)

1.接收端通过RR包反馈接收端的接收情况,RR包分为两个部分:头部header和反馈块ReportBlock。
2.参考SR包,RR包的负载类型是201
3.结构如下:
在这里插入图片描述
4.其包含信息有:
(1).reporter ssrc:rr报告发送者的ssrc,也就是rtp报文接受者自己的ssrc.
(2).reportee ssrc:rr报告接受者的ssrc,也就是rtp报文发送者的ssrc.
(3).cumulative number of packet lost:累积报文丢失总数,该字段是一个24-bits的有符号整数
(4).Loss fraction:丢包率
(5).LSR:最新接收到SR报文的时间戳,具体值是,SR报文里64位NTP时间戳中的32位bit的时间戳。如果没有收到SR报文,该字段为0
(6).DLSR:接收到SR报文的时刻与发送该RR报文时刻的时间差值
(7).RTT:发送者计算的发送来回时间,发送者可以通过RR报文中的LSR和DLSR来计算RTT

SDP协议

格式为 m=<媒体类型> <端口号> <传输协议> <媒体格式 >
媒体类型:audio,表示这是一个音频流
端口号:9832,表示UDP发送的目的端口为9832
传输协议:RTP/AVP,表示RTP OVER UDP,通过UDP发送RTP包
媒体格式:表示负载类型(payload type),一般使用97表示AAC

格式为a=rtpmap:<媒体格式><编码格式>/<时钟频率> /[channel]
mpeg4-generic表示编码,44100表示时钟频率,2表示双通道

a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f

a) profile-level-id=42001f

Profile: 66(hex: 42)
Level: 3.1(hex:1f)转成十进制,再除以10

b) packetization-mode=1,表示I帧会拆分成多个rtp包发送,对于264来说,rtp payload的第一个字节(0x7C)的低5bit为(11100),十进制为28,
代表此nalutype为FU-A,多包封装类型

丢包重传机制NACK

a) FEC在发送端将数据包添加冗余纠错码,纠错码连同数据包一起发送到接收端;接收端根据纠错码对数据进行检查和纠正
b) NACK则在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端发送缓冲区的支持

a) NACK是RTP层的反馈参数,在本端收集Codec属性时被一起收集,在SDP协商过程中,NACK属性被加到offer/answer中.
b) 接收端接收到offer后,跟随的NACK信息最终体现到jitterbuffer中,
c) NACK功能在SDP消息中的体现:a=rtcp-fb:125 nack(RTP报文丢失重传)
d) webRtc支持的其他丢包处理方法:a=rtcp-fb:104 nack pli(关键帧重传,当连续出现解码失败,或者长期没有解码输入,就通过RTCP报文发送请求IDR帧命令);
a=rtcp-fb:100 ccm fir(支持使用rtcp反馈机制来实现编码控制);
a=rtcp-fb:100 goog-remb(支持使用rtcp包来控制发送方的码流,goog-remb为google的拥塞控制处理算法)
e) 在webrtc中,重传包和正常包ssrc是不同的,两个ssrc可在SDP中体现,如:a=ssrc-group:FID 3463951252 1461041037(3463951252为正常的ssrc,后者为重传包的ssrc)

a) NACK报文类型为205,是RTCP的扩展反馈报文(详见:RFC4585)
b) PT=205,FMT=1,Packet identifier(PID)即为丢失RTP数据包的序列号,Bitmao of Lost Packets(BLP)指示从PID开始接下来16个RTP数据包的丢失情况。一个NACK报文可以携带多个RTP序列号,NACK接收端对这些序列号逐个处理
c) NACK报文构造完成以后,发送到网络层。NACK报文是RTCP报文的一种,因此其发送、接收和分析遵循RTCP报文处理的一般流程

a) 接收端收到NACK报文后调用resendPacketOnNack()进行RTP数据包重发

a) RTX:发送端在新的SSRC上发送重传包或者冗余包
b) NACK、RTX是WebRTC里丢包重传策略,两个策略之间有一定的联系
c) 两者均需要通过sdp协商开启
d) 在发送端收到NACK后,要重发接收端丢掉的包,发送的模式有两种
1.RTX模式:在接收端通过SDP使能发送端的RTX以后,重发的包封装到RTX包里发送,RTX包与原RTP有不同的SSRC,这样有助于避免SRTP的重放攻击,也能让接收端更好的估算带宽
2.普通模式:在没有使能RTX时,发送端只是简单的重发原来的RTP包,这种模式会影响接收端的RTCP统计,比如会出现负的丢包率

标签:SDP,简介,报文,应用程序,发送,RTP,NACK,WebRtc
来源: https://blog.csdn.net/user_jiang/article/details/120196202