日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebRTC 之ICE浅谈

發布時間:2025/3/8 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebRTC 之ICE浅谈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

ICE全稱Interactive Connectivity Establishment:交互式連通建立方式。

ICE參照RFC5245建議實現,是一組基于offer/answer模式解決NAT穿越的協議集合。
它綜合利用現有的STUN,TURN等協議,以更有效的方式來建立會話。

客戶端側無需關心所處網絡的位置以及NAT類型,并且能夠動態的發現最優的傳輸路徑。

Classic STUN(RFC3489)的劣勢:

Classic STUN 有著諸多局限性,例如:

  • 不能確定獲得的公網映射地址能否用于P2P通信
  • 沒有加密方法
  • 不支持TCP穿越
  • 不支持對稱型NAT的穿越
  • 不支持IPV6
  • STUN(RFC5389)協議

    RFC5389是RFC3489的升級版

  • 支持UDP/TCP/TLS協議
  • 支持安全認證
  • ?

    ICE利用STUN(RFC5389) Binding Request和Response,來獲取公網映射地址和進行連通性檢查。同時擴展了STUN的相關屬性:

  • PRIORITY:在計算candidate pair優先級中使用
  • USE-CANDIDATE:ICE提名時使用
  • tie-breaker:在角色沖突時使用
  • TURN協議

    ICE使用TURN(RFC 5766)協議作為STUN的輔助,在點對點穿越失敗的情況下,借助于TURN服務的轉發功能,來實現互通。端口與STUN保持一致

    ?

    TURN消息都遵循 STUN 的消息格式,除了ChannelData消息。

    ?

  • 支持UDP/TCP/TLS協議,適用于UDP被限制的網絡。
  • 支持IPV6。
  • ?

    TURN的流程:

  • 創建Allocation
  • client 使用allocation transaction創建relay 端口,并在allocation的響應中回復給client。

    當allocation創建后需要使用refresh request來保活,默認lifetime為10分鐘。

    ?

  • 創建Permission
  • 由allocation創建Permission,每個Permission 由 IP 地址 和lifetime組成。

    有兩種方法來創建和刷新Permission

  • CreatePermission
  • ChannelBind
  • ?

  • 收發數據:
  • CreatePermission使用Send and Data indication消息
  • ChannelBind使用ChannelData消息
  • ?

    ICE介紹

  • ICE 的角色
  • 分為 controlling和controlled。

    Offer 一方為controlling角色,answer一方為controlled角色。

    ?

  • ICE的模式
  • 分為FULL ICE和Lite ICE:

    FULL ICE:是雙方都要進行連通性檢查,完成的走一遍流程。

    Lite ICE: 在FULL ICE和Lite ICE互通時,只需要FULL ICE一方進行連通性檢查, Lite一方只需回應response消息。這種模式對于部署在公網的設備比較常用。

    ?

  • Candidate
  • 媒體傳輸的候選地址,組成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
  • ?? 由本端和遠端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。

    ?

  • Checklist
  • 由candidate pair生成按優先級排序的鏈表,用于ICE連通性檢查。

    ?

  • Validlist
  • 由連通性檢查成功的candidate pair按優先級排序的鏈表,用于ICE提名和選擇最終路徑。

    ICE過程

  • Gather candidates
  • 根據Componet ID:

    • 獲取本機host address.
    • 從STUN服務器獲取 srvflx address.
    • 從TURN服務器獲取 relay address.
    • 同時生成foundation。

    ?

  • 刪除重復的candidate
  • 收集地址完成后,需要去掉重復的candidate,如果兩個candidate的地址一樣,并且Base地址也一樣,則刪除它。

    ?

  • 交換candidates
  • 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

    ?

  • 生成candidate pairs
  • 在本端收到遠端candidates后,將Component ID和transport protocol相同的candidates組成pair。

    修整candidate pair,如果是srvflx地址,則需要用其base地址替換。

    對端也是同樣的流程。

    ?

  • 生成checklist
  • 將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。

    ?

    ?

  • 生成validlist
  • 將連通性檢查成功的candidate pair并按優先級排序加入validlist,這時本地candidate填寫的是公網映射地址,remote candidate填寫的是對端發送的STUN binding request地址。

    ?

  • 提名candidate pair
  • 由controlling來提名哪對candidate pair為valid pair

    ?? ?提名方式又分為普通提名和進取型提名

    普通提名方式會做兩次連通性檢查,在第一次做連通性檢查時不會帶上USE-CANDIDATE屬性,而是在生成的validlist里選擇pair再進行一次連通性檢查,這時會帶上USE-CANDIDATE屬性,并且置位nominated flag。

    ?

    進取型方式則是每次發送連通性檢查時都會帶上USE-CANDIDATE屬性,并且置位nominated flag,不會再去做第二次連通性檢查。

    ?

  • 選擇最終傳輸地址
  • ICE在提名的valid pair里選擇優先級最高那對作為本次ICE流程傳輸地址。

    ICE狀態

  • Waiting:還未開始連通性檢查,從checklist中選擇合適優先級的pair進行檢查
  • In-Progress:連通性檢查已經開始,但還未結束
  • Succeeded:該pair 連通性檢查已經完成并且成功
  • Failed:失敗
  • Frozen:連通性檢查還未開始
  • ICE保活

  • 對于每個ICE通道,都需要為其會話進行保活。
  • 采用STUN binding request或者STUN binding indication。
  • 如果沒有收到響應,則會重傳,直到最大重傳次數。
  • ?

    ICE角色沖突解決

  • 當兩端角色都為controlling或者controlled角色沖突時,在連通性檢查階段,要求發送binding request消息里必須要帶上tie-breaker屬性。
  • 當出現沖突時,比較tie-breaker大小,值比較大的則被認為是controlling,同時回應487錯誤給對端,對端收到487錯誤后切換角色。
  • ?

    結束語

    隨著WebRTC的應用越來越普遍,無論是Native端還是Web端,由于廣泛的適應 ??????能力以及對未來網絡的支持,ICE作為一種綜合的解決方案將有著非常廣闊的應用前景。

    網易云信翻譯了W3C推薦標準WebRTC 1.0: Real-time CommunicationBetween Browsers,并提供《WebRTC1.0: 瀏覽器間實時通訊》中文版免費下載。

    • 對于WebRTC初學者,本文檔可以作為學習教程,幫助你快速對WebRTC有全面且詳細的了解,學習相關API的使用,其附帶的示例代碼也是很好的學習資料;
    • 對于WebRTC資深開發者,本文檔可以作為開發中的使用手冊,根據所提供的函數調用鏈或是算法流程進行開發或bug定位;
    • 對于高階玩家,也可通過閱讀本文檔對WebRTC工作組反饋改進意見。

    ?

    限時免費下載,WebRTC開發者必備。

    總結

    以上是生活随笔為你收集整理的WebRTC 之ICE浅谈的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。