WebRTC:資料傳輸相關協議簡介

程式猿小卡發表於2019-07-17

對網路協議來說,需要做的通常就兩件事情:1、建立連線,2、傳輸資料,WebRTC也不例外。

假設WebRTC應用的兩端已經建立了連線,那麼,剩下就是如何傳輸資料的問題了。

WebRTC同時支援傳輸音視訊資料、自定義應用資料。這其中,涉及多種協議,包括UDP、RTP/SRTP、RTCP/SRTCP、DTLS、SCTP。

這些協議名字比較相似,很容易讓人混淆,簡單總結下:

  1. 傳輸音視訊資料相關協議:UDP、DTLS、RTP/SRTCP;
  2. 傳輸自定義應用資料相關協議:UDP、DTLS、SCTP;

下面就簡單介紹下,這些協議是做什麼的,有什麼區別,存在什麼聯絡。

加密通道建立:UDP、DTLS

對WebRTC應用來說,不管是音視訊資料,還是自定義應用資料,都要求基於加密的通道進行傳輸。DTLS 有點類似 TLS,在UDP的基礎上,實現通道的加密。

DTLS的主要用途,就是讓通訊雙方協商金鑰,用來對資料進行加解密。

  1. 通訊雙方:通過DTLS握手,協商生成一對金鑰;
  2. 傳送方:對資料進行加密;
  3. 傳送方:通過UDP傳輸加密資料;
  4. 接收方:對加密資料進行解密;

音視訊資料傳輸:RTP/SRTP、RTCP/SRTCP

首先,我們先來看下RTP、RTCP的大概用途:

  1. RTP(Realtime Transport Protocol):實時傳輸協議,主要用來傳輸對實時性要求比較高的資料,比如音視訊資料。
  2. RTCP(RTP Trasport Control Protocol):RTP傳輸控制協議,跟RTP在同一份RFC中定義,主要用來監控資料傳輸的質量,並給予資料傳送方反饋。

也就是說:

  1. RTP用來傳輸音視訊資料;
  2. RTCP用來傳輸(質量)控制資料;比如監控傳輸的質量,並在會話雙方之間進行同步,方便WebRTC根據傳輸質量進行動態調整,比如傳輸的速率、視訊的位元速率等。

至於SRTP、SRTCP,分別在RTP、RTCP的基礎上加了個S(Secure),表示安全的意思,這個就是DTLS做的事情了。

結合前面內容,總結一下音視訊資料的傳送過程:

  1. 通訊雙方:通過DTLS握手,協商生成一對金鑰;
  2. 資料傳送方:將音視訊資料封裝成RTP包,將控制資料封裝成RTCP包;
  3. 資料傳送方:利用加密金鑰,對RTP包、RTCP包進行加密,生成SRTP包、SRTCP包;
  4. 資料傳送方:通過UDP傳輸SRTP包、SRTCP包;

備註:SRTP/SRTCP包中,除了加密資料,還有其他資訊,這裡不展開細節。

自定義應用資料傳輸:SCTP

SCTP(Stream Control Transmission Protocol):流控制傳輸協議。

之前介紹過,RTP/RTCP主要用來傳輸音視訊,是為了流媒體設計的。而對於自定義應用資料的傳輸,WebRTC中使用了SCTP協議。

同樣的,SCTP依賴DTLS建立的加密通道,對於自定義應用資料的傳送,流程如下:

  1. 通訊雙方:通過DTLS握手,協商生成一對金鑰;
  2. 資料傳送方:將自定義應用資料,通過金鑰進行加密,生成SCTP包;
  3. 資料傳送方:通過UDP傳輸SCTP包;

寫在後面

為了便於講解,跳過了很多協議的細節,有些地方可能會不夠嚴謹,感興趣的同學可以進行進一步研究,比如以下問題:

  1. 傳輸層用了UDP,UDP本身是不可靠的,那麼,音視訊資料、自定義使用者資料的時序、質量是如何保證的?
  2. RTP用來傳遞音視訊資料,為什麼還需要有RTCP?
  3. 為什麼說RTP不適合傳輸自定義使用者資料?
  4. SCTP如何從協議層面兼顧傳輸的效率和質量?如何實現自定義資料的高效傳遞?
  5. 其他

相關連結

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

相關文章