1、服務器與協議相關
1.1 STUN服務器
圖1.1.1 STUN服務器在通信中的位置圖
1.1.1 STUN服務簡介
STUN(Session Traversal Utilities for NAT,NAT會話穿越應用程序)是一種網絡協議,它允許位于NAT(或多重 NAT)后的客戶端找出自己的公網地址,查出自己位于哪種類型的NAT之后以及NAT為某一個本地端口所綁定的 Internet端端口。這些信息被用來在兩個同時處于NAT路由器之后的主機之間通信。該協議由RFC 5389定義。
1.1.2 STUN服務的作用
主要是給無法在公網環境下進行通話的設備,分配公網IP用的,其實簡單的說來就是告訴客戶端的公網IP地址+端口。因為在NAT之后的設備自己是無法知道自己公網的IP和端口的,還有另外一個作用就是找出主機所在NAT的類型,主要會判斷出主機所處網絡所在是處于完全錐型、地址受限型、端口受限型,NAT對稱型,從而找到更合適的通信方案。
1.2 TURN服務器
圖1.2-1 TURN服務器在通信中的位置圖
1.2.1 TURN服務器簡介
TURN的全稱為Traversal Using Relays around NAT,是STUN/RFC5389的一個拓展,主要添加了Relay功能。如果 終端在NAT之后, 那么在特定的情景下,有可能使得終端無法和其對等端(peer)進行直接的通信,這時就需要公網 的服務器作為一個中繼, 對來往的數據進行轉發。這個轉發的協議就被定義為TURN。
1.2.2 TURN服務器的作用
當無法建立P2P連接時候,那么就通過TURN服務器來轉發媒體數據
1.3 信令服務器
圖1.3-1 P2P信令服務器在通信中的位置圖
1.3.1 信令服務器簡介
作為端對端通信的橋梁,為P2P建立連接,媒體協商,網絡協商提供服務,搭在公網上,讓局域網內的設備都能訪問到,進行通信的交互
1.3.2 信令服務器作用
設備之間的媒體協商(SDP),設備之間的網絡協商(Candidate)提供信令交互的通道
1.4 服務器間主要的交互流程圖
圖1.4-1 端與端,端與服務器間的交互流程
2、ICE Candidate(ICE候選者)
2.1 簡介
表示 WebRTC 與遠端通信時使用的協議、IP 地址和端口,通常包含以下字段
本地IP地址、本地端口號、候選者類型、優先級、傳輸協議、訪問服務的用戶名
2.2 候選者的優先級情況
host(本機候選者)
srflx(內網主機映射的外網地址和端口)
prflx(對等反射候選者)
relay(中繼候選者)
host類型是最高優先級的,在WebRTC中,首先對host類型的候選者進行連通性檢查,如果他們能夠互通,則直接建立連接,其實host類型之間的聯通性檢測就是內網間的連通性檢測
如果host類型無法連接,嘗試次優先級的候選者即是srflx類型候選者,然后是prflx
上面3種都不行,那么就會嘗試使用relay方式建立連接
優先級: host > srflx > prflx >?relay
2.3 收集Candidate
host類型: 即本機內網的IP和端口
srflx類型:即本機NAT映射后的外網的IP和端口
prflx類型:對等反射候選者,通過對端數據包頭或者到對端的的地址獲取
relay類型: 即中繼服務器的IP和端口
2.4 STUN協議
srflx類型的Candidate是通過STURN協議進行收集的,簡單來說就是內網主機通過發送STUN消息binding request到STUN服務器,服務器收到請求后,會將請求的IP地址和端口填充到binding response消息中,然后返回給內網主機,內網主機就可以知道自己外網IP和端口。也需要通過STUN協議判斷當前網絡所處的NAT類型,比如是完全錐形,還是端口限制型,還是地址受限類型,還是對稱NAT類型
2.5 TURN協議
也是用STUN協議,只不過協議的類型不一樣,比如獲取中繼的Candidate,會向TURN發送Alllcation指令,relay服務就會在服務端分配一個relay端口,用于中轉數據,然后把地址和端口返回給客戶端
2.6 ICE
其實ICE就是上面說的獲取各種類型的Candidate(候選者)的過程,也就是分為
- 在主機收集所有的host類型的Candidate
- 通過STUN協議獲取srflx類型的Candidate
- 通過TURN協議獲取relay類型的Candidate
3、通信時序圖
3.1?媒體協商時序圖
圖3.1-1 媒體協商時序圖
3.1.1 媒體協商
媒體協商主要用SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力, 這里的能力指的是各端所支持的,比如主要有以下內容
- 音視頻編解碼器是什么,這些編解碼器設定的參數是什么,采用什么音視頻編碼格式
- 使用的傳輸協議是什么
3.1.2 涉及的通信協議
- Offer信令
- Answer信令
- Candidate信令
3.2 網絡協商時序圖
圖3.2-1 網絡協商時序圖
3.2.1 網絡協商說明
其實上面繪制的沒有完全體現媒體協商與網絡協商的同步進行,為了提高連接效率,媒體協商跟網絡協商應該同步進行在CreatePeerConnection(設置STUN/TURN服務器地址)后進行CreateOffer,在收到webrtc回調Offer信息,webrtc也在進行網絡協商,只要通過回調OnCandidate收到網絡協商信息,就通過信令服務把Candidate信息發送到對端去。
3.2.2 涉及的通信協議
- Candidate信令
3.3 局域網內端對端通信時序圖
圖3.3-1 局域網內通信時序圖
3.3.1 局域網內通信
如果兩個端同在一個局域網內,可以進行直連的,webrtc中的ICE框架會判斷兩個端是否在同一局域網,然后進行局域網內的通信
3.3.2 涉及的協議
- Candidate信令
3.4?NAT場景P2P連接時序圖
圖3.4-1?P2P打洞時序圖
3.4.1 NAT通信
這種屬于兩個端之間的P2P的直接連接,是要依靠NAT打洞(P2P穿越),需要借助STUN服務進行協調打洞的過程的,成功率的大小跟設備所處在的NAT類型(完全錐形、地址限制型、端口限制型、完全首先型)有很大的關系,當這種方式失敗了,將采用下面的第3種方式,即通過Relay中轉的方式進行通信
3.4.2 涉及的協議
- Candidate信令
3.5 通過Relay連接通信時序圖
圖3.5-1?通過Relay連接通信的時序圖
3.5.1 通過Relay連接通信
當P2P穿越失敗時候,采用這種中繼的方式進行通信交換數據,端側會向TURN服務器發送,Allocation 指令。通過向 TURN 服務器發送 Allocation 指令,Relay服務就會在服務器端分配一個新的 relay 端口,用 于中轉 UDP 數據報.
3.5.2 涉及的協議
- Candidate信令
4、瀏覽器通信例子
圖4-1 瀏覽器端接入WebRTC的示例圖
拿瀏覽器接入WebRTC來預覽設備端視頻的例子
- 先http請求從地址服務器上獲取信令服務器的地址,STUN/TURN服務器的地址
- 與信令服務器建立WebSocket連接
- 傳入STUN/TURN服務器的配置,創建RTCPeerConection(瀏覽器WebRTC核心類)
- 調用瀏覽器RTCPeerConection類的接口createOffer
- RTCPeerConection類回調onOffer
- 調用瀏覽器RTCPeerConection類的接口,setLocalDescriptions
- 從onOffer得到回調的SDP信息轉為信令發送到信令服務器
- 瀏覽器收到Answer,調用瀏覽器類型RTCPeerConnection類的接口,setRemoteDescription
- RTCPeerConection類回調OnCandidate
- 通過信令服務器發送candidate到對端
- 收到信令服務器發過來的candidate,調用瀏覽器類型RTCPeerConnection類的接口,addIceCandidate
- 連接成功后收到RTCPeerConection類的onTrack收到流信息
- h5的video標簽 設置onTrack返回的流進行播放