对网络协议来说, 需要做的通常就两件事情: 1, 建立连接, 2, 传输数据, webRTC 也不例外.
假设 WebRTC 应用的两端已经建立了连接, 那么, 剩下就是如何传输数据的问题了.
WebRTC 同时支持传输音视频数据, 自定义应用数据. 这其中, 涉及多种协议, 包括 UDP,RTP/SRTP,RTCP/SRTCP,DTLS,SCTP.
这些协议名字比较相似, 很容易让人混淆, 简单总结下:
传输音视频数据相关协议: UDP,DTLS,RTP/SRTCP;
传输自定义应用数据相关协议: UDP,DTLS,SCTP;
下面就简单介绍下, 这些协议是做什么的, 有什么区别, 存在什么联系.
加密信道建立: UDP,DTLS
对 WebRTC 应用来说, 不管是音视频数据, 还是自定义应用数据, 都要求基于加密的信道进行传输. DTLS 有点类似 TLS, 在 UDP 的基础上, 实现信道的加密.
DTLS 的主要用途, 就是让通信双方协商密钥, 用来对数据进行加解密.
通信双方: 通过 DTLS 握手, 协商生成一对密钥;
发送方: 对数据进行加密;
发送方: 通过 UDP 传输加密数据;
接收方: 对加密数据进行解密;
音视频数据传输: RTP/SRTP,RTCP/SRTCP
首先, 我们先来看下 RTP,RTCP 的大概用途:
RTP(Realtime Transport Protocol): 实时传输协议, 主要用来传输对实时性要求比较高的数据, 比如音视频数据.
RTCP(RTP Trasport Control Protocol):RTP 传输控制协议, 跟 RTP 在同一份 RFC 中定义, 主要用来监控数据传输的质量, 并给予数据发送方反馈.
也就是说:
RTP 用来传输音视频数据;
RTCP 用来传输 (质量) 控制数据; 比如监控传输的质量, 并在会话双方之间进行同步, 方便 WebRTC 根据传输质量进行动态调整, 比如传输的速率, 视频的码率等.
至于 SRTP,SRTCP, 分别在 RTP,RTCP 的基础上加了个 S(Secure), 表示安全的意思, 这个就是 DTLS 做的事情了.
结合前面内容, 总结一下音视频数据的发送过程:
通信双方: 通过 DTLS 握手, 协商生成一对密钥;
数据发送方: 将音视频数据封装成 RTP 包, 将控制数据封装成 RTCP 包;
数据发送方: 利用加密密钥, 对 RTP 包, RTCP 包进行加密, 生成 SRTP 包, SRTCP 包;
数据发送方: 通过 UDP 传输 SRTP 包, SRTCP 包;
备注: SRTP/SRTCP 包中, 除了加密数据, 还有其他信息, 这里不展开细节.
自定义应用数据传输: SCTP
SCTP(Stream Control Transmission Protocol): 流控制传输协议.
之前介绍过, RTP/RTCP 主要用来传输音视频, 是为了流媒体设计的. 而对于自定义应用数据的传输, WebRTC 中使用了 SCTP 协议.
同样的, SCTP 依赖 DTLS 建立的加密信道, 对于自定义应用数据的发送, 流程如下:
通信双方: 通过 DTLS 握手, 协商生成一对密钥;
数据发送方: 将自定义应用数据, 通过密钥进行加密, 生成 SCTP 包;
数据发送方: 通过 UDP 传输 SCTP 包;
写在后面
为了便于讲解, 跳过了很多协议的细节, 有些地方可能会不够严谨, 感兴趣的同学可以进行进一步研究, 比如以下问题:
传输层用了 UDP,UDP 本身是不可靠的, 那么, 音视频数据, 自定义用户数据的时序, 质量是如何保证的?
RTP 用来传递音视频数据, 为什么还需要有 RTCP?
为什么说 RTP 不适合传输自定义用户数据?
SCTP 如何从协议层面兼顾传输的效率和质量? 如何实现自定义数据的高效传递?
其他
相关链接
- RTP: A Transport Protocol for Real-Time Applications
- https://tools.ietf.org/html/rfc3550
- Stream Control Transmission Protocol
- https://tools.ietf.org/html/rfc4960
- Datagram Transport Layer Security
- https://tools.ietf.org/html/rfc4347
来源: https://www.cnblogs.com/chyingp/p/11198874.html