WebRTC,名稱源自網頁實時通信(Web Real-Time Communication)的縮寫,簡而言之它是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術。並且還支持跨平臺:windows,linux,mac,android,iOS。 實現原理 P2P連接模式 一般我們傳統的連接方式,都是以 ...
前言
WebRTC,名稱源自網頁實時通信(Web Real-Time Communication)的縮寫,簡而言之它是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術。並且還支持跨平臺:windows,linux,mac,android,iOS。
實現原理
P2P連接模式
一般我們傳統的連接方式,都是以伺服器為中介的模式:
類似http協議:客戶端<——>服務端(當然這裡服務端返回的箭頭僅僅代表返回請求數據)。
進行即時通訊時,進行文字、圖片、錄音等傳輸的時候:客戶端A——伺服器——客戶端B。
而點對點的連接恰恰數據通道一旦形成,中間是不經過服務端的,數據直接從一個客戶端流向另一個客戶端:
客戶端A——客戶端B ... 客戶端A——客戶端C ...(可以無數個客戶端之間互聯)
這個過程就像音視頻通話的應用場景,我們服務端確實是沒必要去獲取兩者通信的數據,而且這樣做有一個最大的一個優點就是,大大的減輕了服務端的壓力。
而WebRTC就是這樣一個基於P2P的音視頻通信技術。
客戶端A與B建立p2p連接的過程
1.A和B連接上服務端,建立一個TCP長連接(任意協議都可以,WebSocket/MQTT/Socket原生/XMPP),為了省事,直接採用WebSocket,這樣一個信令通道就有了。
2.A從伺服器獲得ice server同時生成包含session description(SDP)的offer,發送給Socket服務端。
3.Socket服務端把A的offer和candidate轉發給B,B會保存下A這些信息。
4.然後B發送包含自己session description的answer(因為它收到的是offer,所以返回的是answer,但是內容都是SDP)和ice candidate給Socket服務端。
5.Socket服務端把B的answer和ice candidate給A,A保存下B的這些信息。
WebRTC的伺服器 WebRTC至少有兩件事必須要用到伺服器: 1、客戶端之間交換建立通信的元數據(信令)必須通過伺服器。 我們在A和B需要建立P2P連接的時候,至少要伺服器來協調,來控制連接開始建立。而連接斷開的時候,也需要伺服器來告知另一端P2P連接已斷開 2、為了穿越NAT和防火牆。 如果客戶端A想給客戶端B發送數據,則數據來到客戶端B所在的路由器下,會被NAT阻攔,這樣B就無法收到A的數據了 。 webrtc是通過 ICE 這套框架來處理複雜的網路環境,
如果想啟用這個功能,你必須讓你的應用程式傳 伺服器的URL:
ICE試著找最好的路徑來讓客戶端建立連接,他會嘗試所有可能的選項,然後選擇最合適的方案,
ICE首先嘗試P2P連接,如果失敗就會通過Turn伺服器進行轉接。 信令的作用 用來控制通信開啟或者關閉的連接控制消息 發生錯誤時用來彼此告知的消息 媒體流元數據,比如像解碼器、解碼器的配置、帶寬、媒體類型等等 用來建立安全連接的關鍵數據 外界所看到的的網路上的數據,比如IP地址、埠等
信令的類型
會話描述協議(Session Description Protocal,簡稱SDP)
信令的主要內容的格式都遵循會話描述協議
1) 會話的名稱和目的
2)
會話存活時間
3)
包含在會話中的媒體信息,包括:
媒體類型(video, audio, etc)
傳輸協議(RTP/UDP/IP, H.320, etc)
媒體格式(H.261 video, MPEG video, etc)
多播或遠端(單播)地址和埠
4)
為接收媒體而需的信息(addresses,
ports, formats and so on)
5)
使用的帶寬信息
6)
可信賴的接洽信息
一個SDP的信令的內容大致上如下:
實時傳輸控制協議(Real-time ControlProtocol,RTCP)
RTP/RTCP協議是流媒體通信的基石。RTP協議定義流媒體數據在互聯網上傳輸的數據包格式,而RTCP協議則負責可靠傳輸、流量控制和擁塞控制等服務質量保證。在WebRTC項目中,RTP/RTCP模塊作為傳輸模塊的一部分,負責對發送端採集到的媒體數據進行進行封包,然後交給上層網路模塊發送;在接收端RTP/RTCP模塊收到上層模塊的數據包後,進行解包操作,最後把負載發送到解碼模塊。因此,RTP/RTCP 模塊在WebRTC通信中發揮非常重要的作用。Sdp協議內規定的視頻傳輸控制協議就是rtcp