Fork me on GitHub

webRTC使用记录4

副标题:webRTC 前置知识之 STUN、ICE、SRTP 协议

RFC34 89

RFC5389

SRTP

SDP

STUN协议

  • STUN 的目的是进行 NAT 穿越。
  • STUN 是 S/C 模式,客户端发送请求,服务端进行响应。
  • 规范:
    1. RFC3489 / STUN。使用 UDP 进行 NAT 穿越。
    2. 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作用:
    1. 收集 Candidate
    2. 对 Candiate pair 排序,比如两台主机优先进行 Host candidate,不行的话再尝试别的 candidate
    3. 连通性检测

DTLS 协议

为了保证安全传输,推出了 TLS 和 DTLS 两类协议,其中TLS 是基于 TCP 的,DTLS 是基于 UDP 的。

OpenSSL 的使用

1
2
3
graph LR
OpenSSL初始化-->创建SSL上下文-->加载SSL证书-->加载SSL私钥-->创建SSL实例-->通过SSL收发数据-->释放SSL资源-->OpenSSL初始化

tips: 创建 SSL 实例时,会跟 socket 进行绑定

DTLS 四次握手

  1. 媒体协商,建立房间,主要用来告知 ufrag 和 password。
  2. 发送 binding request
  3. 握手
  4. 收发数据

DTLS-SRTP

  • DTLS:交换密钥,确认加密算法(双方相互告知自己支持的算法有哪些)

    • webRTC 默认采用 AES128
  • SRTP:真正进行加解密,一般是对称加密算法(只对 payload 进行加密)。保证数据完整性,一般通过 协议中增加的字段 Authentication Tag 进行完整性校验。

  • libsrtp:开源的 libsrtp 库,高效好用

    • 初始化 libsrtp
    • 创建 Session
    • 加密、解密
-------------The End-------------