WebRTC通信原理與流程

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(候選者)的過程,也就是分為

  1. 在主機收集所有的host類型的Candidate
  2. 通過STUN協議獲取srflx類型的Candidate
  3. 通過TURN協議獲取relay類型的Candidate

3、通信時序圖

3.1?媒體協商時序圖

圖3.1-1 媒體協商時序圖

3.1.1 媒體協商

媒體協商主要用SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力, 這里的能力指的是各端所支持的,比如主要有以下內容

  1. 音視頻編解碼器是什么,這些編解碼器設定的參數是什么,采用什么音視頻編碼格式
  2. 使用的傳輸協議是什么

3.1.2 涉及的通信協議

  1. Offer信令
  2. Answer信令
  3. Candidate信令

3.2 網絡協商時序圖

圖3.2-1 網絡協商時序圖

3.2.1 網絡協商說明

其實上面繪制的沒有完全體現媒體協商與網絡協商的同步進行,為了提高連接效率,媒體協商跟網絡協商應該同步進行在CreatePeerConnection(設置STUN/TURN服務器地址)后進行CreateOffer,在收到webrtc回調Offer信息,webrtc也在進行網絡協商,只要通過回調OnCandidate收到網絡協商信息,就通過信令服務把Candidate信息發送到對端去。

3.2.2 涉及的通信協議

  1. Candidate信令

3.3 局域網內端對端通信時序圖

圖3.3-1 局域網內通信時序圖

3.3.1 局域網內通信

如果兩個端同在一個局域網內,可以進行直連的,webrtc中的ICE框架會判斷兩個端是否在同一局域網,然后進行局域網內的通信

3.3.2 涉及的協議

  1. Candidate信令

3.4?NAT場景P2P連接時序圖

圖3.4-1?P2P打洞時序圖

3.4.1 NAT通信

這種屬于兩個端之間的P2P的直接連接,是要依靠NAT打洞(P2P穿越),需要借助STUN服務進行協調打洞的過程的,成功率的大小跟設備所處在的NAT類型(完全錐形、地址限制型、端口限制型、完全首先型)有很大的關系,當這種方式失敗了,將采用下面的第3種方式,即通過Relay中轉的方式進行通信

3.4.2 涉及的協議

  1. Candidate信令

3.5 通過Relay連接通信時序圖

圖3.5-1?通過Relay連接通信的時序圖

3.5.1 通過Relay連接通信

當P2P穿越失敗時候,采用這種中繼的方式進行通信交換數據,端側會向TURN服務器發送,Allocation 指令。通過向 TURN 服務器發送 Allocation 指令,Relay服務就會在服務器端分配一個新的 relay 端口,用 于中轉 UDP 數據報.

3.5.2 涉及的協議

  1. Candidate信令

4、瀏覽器通信例子

圖4-1 瀏覽器端接入WebRTC的示例圖

拿瀏覽器接入WebRTC來預覽設備端視頻的例子

  1. 先http請求從地址服務器上獲取信令服務器的地址,STUN/TURN服務器的地址
  2. 與信令服務器建立WebSocket連接
  3. 傳入STUN/TURN服務器的配置,創建RTCPeerConection(瀏覽器WebRTC核心類)
  4. 調用瀏覽器RTCPeerConection類的接口createOffer
  5. RTCPeerConection類回調onOffer
  6. 調用瀏覽器RTCPeerConection類的接口,setLocalDescriptions
  7. 從onOffer得到回調的SDP信息轉為信令發送到信令服務器
  8. 瀏覽器收到Answer,調用瀏覽器類型RTCPeerConnection類的接口,setRemoteDescription
  9. RTCPeerConection類回調OnCandidate
  10. 通過信令服務器發送candidate到對端
  11. 收到信令服務器發過來的candidate,調用瀏覽器類型RTCPeerConnection類的接口,addIceCandidate
  12. 連接成功后收到RTCPeerConection類的onTrack收到流信息
  13. h5的video標簽 設置onTrack返回的流進行播放

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80571.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Beta分布--貝葉斯建模概率或比例常用分布

Beta分布是一種定義在區間 ([0, 1]) 上的連續概率分布,常用于描述比例或概率的不確定性。它的形狀由兩個正參數 (\alpha)(alpha)和 (\beta)(beta)控制,能夠呈現多種形態(如對稱、偏態、U型等&am…

深度學習算法:開啟智能時代的鑰匙

引言 深度學習作為機器學習的一個分支,近年來在圖像識別、自然語言處理、語音識別等多個領域取得了革命性的進展。它的核心在于構建多層的神經網絡,通過模仿人腦處理信息的方式,讓機器能夠從數據中學習復雜的模式。 深度學習算法的基本原理…

深入了解linux系統—— 自定義shell

shell的原理 我們知道,我們程序啟動時創建的進程,它的父進程都是bash也就是shell命令行解釋器; 那bash都做了哪些工作呢? 根據已有的知識,我們可以簡單理解為: 輸出命令行提示符獲取并解析我們輸入的指令…

Redux和Vuex

為什么React和Vue需要Redux和Vuex 狀態管理需求的演變 #mermaid-svg-GaKl3pkZ82yc1m8E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GaKl3pkZ82yc1m8E .error-icon{fill:#552222;}#mermaid-svg-GaKl3pkZ82yc1m8E…

Kubernetes排錯(十三):Pod間偶發超時問題排查

在微服務架構中,Pod間偶發的通信超時是最令人頭疼的問題之一。本文將通過生產環境中的真實案例,手把手教你定位這類"幽靈問題"。 一、快速定位問題方向(5分鐘縮小范圍) 1. 基礎檢查三板斧 # 檢查Service與Endpoint映…

Nginx 源碼安裝成服務

一、環境準備 一臺裝有 CentOS 7.9 的虛擬機(IP: 192.168.40.81)nginx-1.21.6.tar.gz 安裝包一個(版本隨意) 二、安裝 1)解壓 nginx-1.21.6.tar.gz tar -xzvf nginx-1.21.6.tar.gz -tar:這是一個在 Linu…

L51.【LeetCode題解】438. 找到字符串中所有字母異位詞(四種方法)

目錄 1.題目 2.分析 暴力解法 方法1:排序(超時) 方法2:哈希表(險過) ★判斷兩個哈希表是否相同算法(通用方法,必須掌握) 能相等的前提:兩個哈希表的大小相等 哈希表有迭代器,可以使用范圍for從頭到尾遍歷 提交結果 優化方法:定長滑動窗口 提交結果 使用哈希數組更快…

Qt模塊化架構設計教程 -- 輕松上手插件開發

概述 在軟件開發領域,隨著項目的增長和需求的變化,保持代碼的可維護性和擴展性變得尤為重要。一個有效的解決方案是采用模塊化架構,尤其是利用插件系統來增強應用的功能性和靈活性。Qt框架提供了一套強大的插件機制,可以幫助開發者輕松實現這種架構。 模塊化與插件系統 模…

深入理解 HashMap 的索引計算:右移與異或的作用

在 Java 中,HashMap 是一種高效的數據結構,它通過將鍵映射到數組中的索引位置來實現快速的插入和查找。但之前看源碼總是理解到它要hash之后散列到數組中某一個位置,但卻從未深究它究竟怎么散列的,如果不夠散那就意味著hash沖突增…

overleaf較高級的細節指令

換行命令 原來代碼是將三個矩陣表達式在同一行顯示,使用aligned環境(需引入amsmath宏包,一般文檔導言區默認會引入),把三個矩陣的定義分別放在不同行,可通過\\換行。 對齊命令 &放在等號前&#xff0…

LiteLLM:統一API接口,讓多種LLM模型調用如臂使指

在人工智能迅猛發展的今天,各種大語言模型(LLM)層出不窮。對開發者而言,如何高效集成和管理這些模型成為一個棘手問題。LiteLLM應運而生,它提供了一個統一的API接口,讓開發者可以輕松調用包括OpenAI、Anthropic、Cohere等在內的多種LLM模型。本文將深入介紹LiteLLM的特性、…

Google語法整理

以下是從整理出的 Google 語法: site:指定域名,如 “apache site:bbs.xuegod.cn”,可查詢網站的收錄情況 。 inurl:限定在 url 中搜索,如 “inurl:qq.txt”,可搜索 url 中包含特定內容的頁面&a…

python 寫一個工作 簡單 番茄鐘

1、圖 2、需求 番茄鐘(Pomodoro Technique)是一種時間管理方法,由弗朗西斯科西里洛(Francesco Cirillo)在 20 世紀 80 年代創立。“Pomodoro”在意大利語中意為“番茄”,這個名字來源于西里洛最初使用的一個…

Compose Multiplatform iOS 穩定版發布:可用于生產環境,并支持 hotload

隨著 Compose Multiplatform 1.8.0 的發布,iOS 版本也引來的第一個穩定版本,按照官方的原話:「iOS Is Stable and Production-Ready」 ,而 1.8.0 版本,也讓 Kotlin 和 Compose 在移動端有了完整的支持。 在 2023 年 4 …

Jenkins 服務器上安裝 Git

安裝 Git # 更新包列表 sudo apt update# 安裝 Git sudo apt install git 驗證安裝 # 檢查 Git 版本 git --version 查看所有全局配置 git config --global --list 查看特定配置項 # 查看用戶名配置 git config --global user.name# 查看郵箱配置 git config --global u…

OpenHarmony SystemUI開發——實現全局導航欄和狀態欄關閉

在實際生產中,進場遇到需要關閉導航欄和狀態欄的需求,現分享解決辦法: 開發環境 OpenHarmony 5.0.0r 代碼分析 思路: launcher本身可以關閉 導航欄(實際是 公共事件,發送消息給systemUI來實控制&#x…

大模型微調終極方案:LoRA、QLoRA原理詳解與LLaMA-Factory、Xtuner實戰對比

文章目錄 一、微調概述1.1 微調步驟1.2 微調場景 二、微調方法2.1 三種方法2.2 方法對比2.3 關鍵結論 三、微調技術3.1 微調依據3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 適用場景 四、微調框架4.1 LLaMA-Factory4.2 Xtuner4.3 對比 一、微調概述 微調(Fine-tun…

單片機-STM32部分:10-2、邏輯分析儀

飛書文檔https://x509p6c8to.feishu.cn/wiki/VrdkwVzOnifH8xktu3Bcuc4Enie 安裝包如下:根據自己的系統選擇,目前這個工具只有window版本哦 安裝方法比較簡單,都按默認下一步即可,注意不要安裝到中文路徑哦。 其余部分參考飛書文檔…

uniapp-商城-48-后臺 分類數據添加修改彈窗bug

在第47章的操作中,涉及到分類的添加、刪除和更新功能,但發現uni-popup組件存在bug。該組件的函數接口錯誤導致在小程序中出現以下問題:1. 點擊修改肉類名稱時,回調顯示為空,并報錯“setVal is not defined”&#xff0…

STM32-ADC模數轉換器(7)

目錄 一、ADC簡介 二、逐次逼近型ADC 三、ADC基本結構圖 四、規則組的四種轉換模式 五、轉換時間 對GPIO來說,它只能讀取引腳的高低電平,使用了ADC模數轉化器之后,就可以對高電平和低電平之間的任意電壓進行量化,最終用一個變…