WebRTC vs WebSocket
1.什么是WebRTC?
WebRTC 是一組 JAVAScript API,可以在兩個瀏覽器之間建立點對點連接, 實現音頻和視頻等數據的傳輸,也可以用它創建有語音/視頻通話功能的應用程序。
WebRTC 的特別之處是:一旦建立了連接,就可以直接在瀏覽器之間實時傳輸數據,不需要借助服務器,因此降低了延遲,所以用戶都喜歡用 webRTC 直接傳輸音視頻。

在WebRTC誕生之前,開發實時音視頻應用的成本非常高,需要考慮的技術問題很多,如音視頻的編解碼,數據傳輸延時、丟包、網絡抖動、回音處理和消除等,如果要兼容瀏覽器端的實時音視頻通信,還需要額外安裝插件。
可喜的是,現在幾乎所有主流瀏覽器都支持 WebRTC。 此外,還有針對不同平臺(例如 IOS 或 Android)的 WebRTC SDK。下面是WebRTC的瀏覽器支持情況:

WebRTC的瀏覽器支持情況
WebRTC 由以下關鍵組成部分:
- RTCPeerConnection: 允許連接到遠程對等點,保持和監視連接,在連接完成后關閉。可通過如下方法快速創建RTCPeerConnection:
new RTCPeerConnection()
new RTCPeerConnection(configuration)
- RTCDataChannel: 提供雙向網絡通信通道,允許對等方傳輸任意數據。通過RTCPeerConnection示例對象的createDataChannel方法快速創建RTCDataChannel對象。
const pc = new RTCPeerConnection();
const dc = pc.createDataChannel("my channel");
dc.onmessage = function (event) {
console.log("received: " + event.data);
};
dc.onopen = function () {
console.log("datachannel open");
};
dc.onclose = function () {
console.log("datachannel close");
};
- MediaStream: 旨在讓您從本地輸入設備(如相機和麥克風)訪問媒體流。 它用作管理數據流上的操作的一種方式,例如記錄、發送、調整大小和顯示流的內容。通過如下構造函數快速創建MediaStream實例。
const newStream = new MediaStream();
const newStream = new MediaStream(stream);
const newStream = new MediaStream(tracks[]);
2.什么是WebSocket?
WebSocket 是一種實時技術,可通過持久的單套接字socket連接在 Web 客戶端和 Web 服務器之間實現全雙工、雙向通信。
WebSocket 連接以 HTTP 請求/響應握手開始。 如果此初始握手成功,則客戶端和服務器已同意使用為 HTTP 請求建立的現有 TCP 連接作為 WebSocket 連接。 只要需要,這個連接就會一直保持活躍狀態,允許服務器和客戶端全雙工的發送數據。

什么是WebSocket?
WebSocket 包括兩個核心組成模塊:
- WebSocket 協議: WebSocket 協議于 2011 年 12 月通過 RFC 6455 標準化,支持通過 Web 在 WebSocket 客戶端和 WebSocket 服務器之間進行實時通信。 它支持二進制數據和文本字符串的傳輸。
- WebSocket API: 允許您管理 WebSocket 連接、發送和接收消息以及偵聽 WebSocket 服務器觸發的事件。
幾乎所有現代網絡瀏覽器都支持 WebSocket API,如下圖所示:

WebSocket瀏覽器支持情況
3.WebRTC的優點和缺點
3.1 WebRTC優勢
WebRTC的優勢主要集中在以下幾個方面:

WebRTC的3個主要優勢
- 強大的安全保障: 通過 WebRTC 傳輸的數據在安全實時傳輸協議 (SRTP) 的幫助下進行加密和驗證。
- 開源免費: 該項目得到了強大而活躍的社區的支持,同時Apple、google 和 Microsoft 等組織也積極參與。
- 獨立于平臺和設備: WebRTC 應用程序可以在任何支持 WebRTC 的瀏覽器上運行,無論操作系統或設備類型如何。
3.2 WebRTC 缺點
WebRTC的的劣勢也很明顯,主要集中在以下幾個方面:

WebRTC 的3個主要缺點
- 盡管 WebRTC 是一種點對點技術,您仍然需要管理 Web 服務器并為其付費。 為了使兩個對等點相互對話,您需要使用信令服務器來建立、管理和終止 WebRTC 通信會話。 在一對多的 WebRTC 廣播場景中,您可能需要一個 WebRTC 媒體服務器來充當媒體中間件。
- WebRTC 非常占用 CPU,尤其是在處理視頻內容和大量用戶時。 這使得使用和擴展 WebRTC 應用程序成本高昂且困難重重。
- WebRTC 很難上手。 您需要探索和掌握大量概念:各種 WebRTC 接口、編解碼器和媒體處理、網絡地址轉換 (NAT) 和防火墻、UDP(WebRTC 使用的主要底層通信協議)等等。
WebRTC的peerjs庫可以用于快速實現Peer-to-peer通信!
4.WebSocket的優缺點
4.1 WebSocket 優勢
在 WebSocket 出現之前,AJAX 長輪詢和 Comet 等 HTTP 技術是構建實時應用程序的標準。 與 HTTP 相比,WebSocket 無需為每個請求建立新連接,從而大大減少了每條消息的大小(無 HTTP Header)。 與 HTTP 相比,這有助于節省帶寬、改善延遲并減少服務器端的 WebSockets 負擔。
作為一種事件驅動技術,WebSocket 允許在無需客戶端主動請求的情況下傳輸數據。 在客戶端需要對事件(無法預測的事件,例如欺詐警報)做出快速反應的情況下有優勢。
4.2 WebSocket 缺點
- WebSocket 是有狀態的: 這可能很難處理,尤其是在規模上,因為它需要服務器層跟蹤每個單獨的 WebSocket 連接并維護狀態信息。
- 當連接終止時,WebSockets 不會自動恢復:這就是存在許多 WebSocket 庫的部分原因。
- 代理服務器的公司網絡:會阻止 WebSocket 連接。
5.WebRTC vs WebSockets:主要區別是什么?
WebSocket 提供客戶端、服務端通信協議,而 WebRTC 為瀏覽器和移動應用程序提供點對點協議和通信功能。
WebSocket 在 TCP 上工作,而 WebRTC 主要在 UDP 上。
當數據完整性至關重要時,WebSocket 是更好的選擇,因為您可以從 TCP 的底層可靠性中獲益。 而,如果速度更重要并且丟失一些數據包是可以接受的,WebRTC是更好的選擇。
WebRTC 主要設計用于流式傳輸音頻和視頻內容。 也可以使用 WebSockets 流式傳輸媒體,但 WebSocket 技術更適合使用 JSON 等格式傳輸文本/字符串數據。
5.1 什么時候使用 WebRTC?
WebRTC 是以下用例的不錯選擇:
- 音頻和視頻通信
- 文件共享
- 屏幕共享
- 直播活動
- 物聯網設備(例如,無人機或嬰兒監視器流式傳輸實時音頻和視頻數據)
5.2 什么時候使用 WebSocket?
們可以將 Web Sockets 用例大致分為兩個不同的類別:
- 實時更新:其中通信是單向的,服務器正在將低延遲(頻繁的)更新流式傳輸到客戶端。
- 雙向通信,客戶端和服務器都發送和接收消息。包括聊天、虛擬活動等。 WebSockets 還可用于支持多用戶同步協作功能,例如多人同時編輯同一文檔。
5.3 什么時候用WebRTC和WebSocket組合?
WebSockets 和 WebRTC 是互補的技術。 如前所述,WebRTC 允許點對點通信,但它仍然需要服務器,以便這些點可以通過稱為信令的過程協調通信。 通常,信令涉及傳輸信息,例如媒體元數據(例如,編解碼器和媒體類型)、網絡數據(例如,主機的 IP 地址和端口)以及用于打開和關閉通信的會話控制消息。
需要牢記的關鍵一點:WebRTC 不提供標準的信令實現,允許開發人員為此目的使用不同的協議。 WebSocket 協議通常用作 WebRTC 應用程序的信號機制,允許對等點實時交換網絡和媒體元數據。
6.總結
本文重點論述了WebRTC 、WebSocket協議,兩者的異同、使用場景、以及何時可以組合使用。關于WebRTC、WebSocket,筆者已經編寫過至少3篇文章進行了重點論述,如果有需求可以直接點擊文末的資料即可。
參考資料
WebRTC已成為HTML5標準?是時候開始學習了?
HTTP、WebSocket、gRPC 或 WebRTC:哪種協議最適合您的應用程序?
WebRTC成為HTML5標準?SDP、STUN、TURN你想知道的都在這里!
https://ably.com/topic/webrtc-vs-websocket