ICE全稱Interactive Connectivity Establishment:交互式連通創建方式。算法
ICE參照RFC5245建議實現,是一組基於offer/answer模式解決NAT穿越的協議集合。
它綜合利用現有的STUN,TURN等協議,以更有效的方式來創建會話。瀏覽器
客戶端側無需關心所處網絡的位置以及NAT類型,而且可以動態的發現最優的傳輸路徑。安全
Classic STUN 有着諸多侷限性,例如:服務器
RFC5389是RFC3489的升級版網絡
ICE利用STUN(RFC5389) Binding Request和Response,來獲取公網映射地址和進行連通性檢查。同時擴展了STUN的相關屬性:架構
ICE使用TURN(RFC 5766)協議做爲STUN的輔助,在點對點穿越失敗的狀況下,藉助於TURN服務的轉發功能,來實現互通。端口與STUN保持一致tcp
TURN消息都遵循 STUN 的消息格式,除了ChannelData消息。函數
TURN的流程:學習
l 建立Allocation:加密
client 使用allocation transaction建立relay 端口,並在allocation的響應中回覆給client。
當allocation建立後須要使用refresh request來保活,默認lifetime爲10分鐘。
l 建立Permission:
由allocation建立Permission,每一個Permission 由 IP 地址 和lifetime組成。
有兩種方法來建立和刷新Permission
l 收發數據:
分爲 controlling和controlled。
Offer 一方爲controlling角色,answer一方爲controlled角色。
分爲FULL ICE和Lite ICE:
FULL ICE:是雙方都要進行連通性檢查,完成的走一遍流程。
Lite ICE: 在FULL ICE和Lite ICE互通時,只須要FULL ICE一方進行連通性檢查, Lite一方只需迴應response消息。這種模式對於部署在公網的設備比較經常使用。
媒體傳輸的候選地址,組成candidate pair作連通性檢查,肯定傳輸路徑,有以下屬性:
Type 類型有:
Host/Srvflx/Relay/Prflx
Componet ID
傳輸媒體的類型,1表明RTP;2表明 RTCP。
WebRTC採用Rtcp-mux方式,也就是RTP和RTCP在同一通道內傳輸,減小ICE的協商和通道的保活。
Priority
Candidate的優先級。
若是考慮延時,帶寬資源,丟包的因素,Type優先級高低通常建議以下順序:
host > srvflx > prflx > relay
Base
是指candidate 的基礎地址。
Srvflx address 的base 是本地host address。
host address和 relayed address 的base 是自身。
由本端和遠端candidate組成的pair,有本身的優先級。
pair優先級的計算是取決candidate的priority。
priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
G:controlling candidate 優先級
D:controlled candidate 優先級
ICE選擇高優先級的candidate pair。
由candidate pair生成按優先級排序的鏈表,用於ICE連通性檢查。
由連通性檢查成功的candidate pair按優先級排序的鏈表,用於ICE提名和選擇最終路徑。
根據Componet ID:
獲取本機host address.
從STUN服務器獲取 srvflx address.
從TURN服務器獲取 relay address.
同時生成foundation。
收集地址完成後,須要去掉重複的candidate,若是兩個candidate的地址同樣,而且Base地址也同樣,則刪除它。
ICE 使用offer/answer方式,雙方經過SDP協商交換candidate信息.
Candidate信息包括type,foundation,base,component id,transport
SDP a行格式以下:
「a=candidate:1 1 UDP 9654321 212.223.223.223 12345 typ srflx raddr 10.216.33.9 rport 54321」
表示 foundation爲1,媒體是RTP,採用UDP協議,公網映射地址爲212.223.223.223:12345,優先級爲9654321,type爲srflx,base地址爲10.216.33.9:54321
在本端收到遠端candidates後,將Component ID和transport protocol相同的candidates組成pair。
修整candidate pair,若是是srvflx地址,則須要用其base地址替換。
對端也是一樣的流程。
將candidate pairs按照優先級排序,生成checklist,供連通性檢查使用。
Ordinary checks 兩端都按照各自checklist分別進行檢查。
Triggered checks 收到對端的檢查時,也在對應的candidate pair上發起連通性檢查,以提升效率
若是checklist裏有relay candidate,則必須首先爲relay candidate建立permission。
ICE 使用STUN binding request/response,包含Fingerprint檢驗校驗機制。
若是A收到B的response,則表明連通性檢查成功,不然須要進行重傳直到超 時。
在創建鏈接時,若是沒有響應,則會以RTO時間進行重傳,每次翻倍,直到最大重傳次數。
STUN請求 採用STUN short-term credential方式認證,
STUN USERNAME屬性 」RemoteUsername:localUsername」
兩端在SDP協商時交換ice-pwd和ice-ufrag,以得對端用戶名和密碼。
STUN 檢查請求中須要檢查地址的對稱性,請求的源地址是響應的目的地址,請求的目的地址是響應的源地址,不然都設置狀態爲 Failed。
將連通性檢查成功的candidate pair並按優先級排序加入validlist,這時本地candidate填寫的是公網映射地址,remote candidate填寫的是對端發送的STUN binding request地址。
由controlling來提名哪對candidate pair爲valid pair
提名方式又分爲普通提名和進取型提名
普通提名方式會作兩次連通性檢查,在第一次作連通性檢查時不會帶上USE-CANDIDATE屬性,而是在生成的validlist裏選擇pair再進行一次連通性檢查,這時會帶上USE-CANDIDATE屬性,而且置位nominated flag。
進取型方式則是每次發送連通性檢查時都會帶上USE-CANDIDATE屬性,而且置位nominated flag,不會再去作第二次連通性檢查。
10. 選擇最終傳輸地址
ICE在提名的valid pair裏選擇優先級最高那對做爲本次ICE流程傳輸地址。
隨着WebRTC的應用愈來愈廣泛,不管是Native端仍是Web端,因爲普遍的適應 能力以及對將來網絡的支持,ICE做爲一種綜合的解決方案將有着很是廣闊的應用前景。
網易雲信翻譯了W3C推薦標準WebRTC 1.0: Real-time CommunicationBetween Browsers,並提供《WebRTC1.0: 瀏覽器間實時通信》中文版免費下載。
限時免費下載,WebRTC開發者必備。
想要閱讀更多技術乾貨、行業洞察,歡迎關注網易雲信博客。
瞭解網易雲信,來自網易核心架構的通訊與視頻雲服務。
網易雲信(NeteaseYunXin)是集網易18年IM以及音視頻技術打造的PaaS服務產品,來自網易核心技術架構的通訊與視頻雲服務,穩定易用且功能全面,致力於提供全球領先的技術能力和場景化解決方案。開發者經過集成客戶端SDK和雲端OPEN API,便可快速實現包含IM、音視頻通話、直播、點播、互動白板、短信等功能。