對網路協議來說,需要做的通常就兩件事情: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