副标题:webRTC 前置知识之 STUN、ICE、SRTP 协议
STUN协议
- STUN 的目的是进行 NAT 穿越。
- STUN 是 S/C 模式,客户端发送请求,服务端进行响应。
- 规范:
- RFC3489 / STUN。使用 UDP 进行 NAT 穿越。
- RFC5389 / STUN。可以适用 TCP 进行 NAT 穿越,是前者的增量版本。
STUN = header(20B) + Attribute * N
header = 00(2b) + STUN Message Type(14b) + Message Length(16b) + Magic Cookie(32b)+Transaction ID(96b)
- STUN MessageType 中取出 2bits用于分类,分出 C0 和 C1:
- 0b00/0b01/0b10/0b11 分别表示:一个请求、一个指示、请求成功的响应,请求失败的响应。
- 每个 Attribteute 进行 TLV 编码,即 Type + Length + Value
ICE
ICE,interactive connectivity establishment
两种终端进行交互,才能创建连接。
- ICE Candidate: 一个包括协议、ip、端口和类型的地址。
- Candidate 类型:主机候选者、反射候选者、中继候选者。
- 本机候选者 host candidate,可以通过本地方式获取;
- 反射候选者 reflexive candidate,1. 向 Stun 服务发起 binding request;2. Stun 服务返回的结果中,就包含了外网的 ip 地址和端口。使用 STUN/TURN 协议。
- 中继候选者 relay candidate,1. 向relay 服务器发起请求,2. relay 服务器返回结果中,就包含了relay 服务器的 ip 地址的端口。使用 TURN 协议。
- tips:TURN 位于 STUN 协议上层,并依赖于 STUN。
- ICE作用:
- 收集 Candidate
- 对 Candiate pair 排序,比如两台主机优先进行 Host candidate,不行的话再尝试别的 candidate
- 连通性检测
DTLS 协议
为了保证安全传输,推出了 TLS 和 DTLS 两类协议,其中TLS 是基于 TCP 的,DTLS 是基于 UDP 的。
OpenSSL 的使用
1 | graph LR |
tips: 创建 SSL 实例时,会跟 socket 进行绑定
DTLS 四次握手
- 媒体协商,建立房间,主要用来告知 ufrag 和 password。
- 发送 binding request
- 握手
- 收发数据
DTLS-SRTP
DTLS:交换密钥,确认加密算法(双方相互告知自己支持的算法有哪些)
- webRTC 默认采用 AES128
SRTP:真正进行加解密,一般是对称加密算法(只对 payload 进行加密)。保证数据完整性,一般通过 协议中增加的字段 Authentication Tag 进行完整性校验。
libsrtp:开源的 libsrtp 库,高效好用
- 初始化 libsrtp
- 创建 Session
- 加密、解密