P2P學習(三)網絡傳輸基本知識---ICE


一:ICE了解

(一)ICE簡介

ICE的全稱Interactive Connectivity Establishment(互動式連接建立),由IETF的MMUSIC工作組開發出來的,它所提供的是一種框架,使各種NAT穿透技術可以實現統一。

ICE跟STUN和TURN不一樣,ICE不是一種協議,而是一個框架(Framework),它整合了STUN和TURN

(二)ICE框架

框架圖如下:其中所有的服務Relay Server與STUN Server都可以部署到同一服務器上

1.組成成員

第一個是雙方通信的Peer 有兩台機子A和B ,他們都是在NAT之后,並且這兩個終端都會在NAT后面形成一個映射后的公網的IP地址。

這里有兩個NAT,在NAT外面有兩個STUN  服務(其實也可以用一個STUN服務),這里的STUN服務主要用於Peer終端去穿越NAT時候進行NAT穿越使用的(去判斷NAT類型和獲取終端在公網中的IP)。所以這兩個可以是兩個,也可以是一個,甚至可以是多個。

relay server,就是前面文章所介紹的這個TURN Server。這個relay server的實際大多數情況下也具有STUN Server的功能,所以在這里呢,有可能這三個是合成一個的。那他也可以獲取到這個NAT映射后的這個公網IP,同時,它還有這個中繼的功能。

那最后一個呢,是這個網絡(最上側,雲圖案,其實上面的TURN與STUN服務也是在網絡中,都可以匯集在一個公網服務器中),整個這個信令是通過這個雲端然后進行交互的,這就是他整個這張圖包含了一些元素。

(三)ICE通訊流程

那我們就來看看這ICE是如何進行工作並且使這個兩個終端最終進行這個媒體流的通訊的?(左側peer---通信-->右側peer),兩側終端都是有網卡(IP),可以進行通訊

讓這個終端去得到所有能夠連接到這個終端B的通路。那這個終端都有哪些通路呢

1.內網直接通信

如果兩個對端是在同一個局域網內,那么這倆就直接通過這個本地的IP地址就可以進行通訊。

2.穿越NAT

終端首先訪問STUN服務,通過STUN服務,能獲取到NAT映射后的終端的公網地址(IP+端口)。

並且終端雙方可以通過服務器,獲取得到對方的公網地址,就可以進行NAT穿越了!!

那如果穿越成功了,他們也直接就能通過NAT進行通訊了。

那么如果不成功,那么還有地方,那么第三條路呢,

3.TURN服務進行中繼

就是走中繼。那這個終端通過NAT將數據轉給TURN中繼,中繼服務,再向另外一個端去轉發數據。

那是不是就這三個呢?其實不是啊,在這個終端上其實可能是多網卡。所以有可能是四個,但是可能有那個VPN那就有五個,有可能是虛擬IP那六個。那一個其實每一個都要做一些嘗試

4.ICE框架

所以ICE的基本的功能就是第一步,要收集終端雙方所有的通路(因為終端可能包含多個網卡,必定包含多個通路),那么第二步就是對所有通路進行檢測,看能不能通,那通了之后,那么ICE的這個工作就算結束了。

但一般情況下,經過relay,這是最后一條路的時候肯定會通的。

二:ICE基本概念

(一)ICE Candidate

獲取到這些candidate之后,終端之間要交換這些candidate,那使用什么進行交換呢?----通過候選者對(雙方各自取一個candidate,組成候選者對),形成通路(是否可以互通,還需要進行連通性檢查)

是使用SDP,那么它是對於這個媒體信息以及網絡信息的一個描述規范。

這個規范,最終是通過信令將這個SDP發送給對方,雙方拿到各自的對方的SDP,那么就能識別出對方都有哪些通路,並且同時了解自己有哪些通路。

它的格式是什么呢?

就是A代表一個屬性呢,屬性是一個Candidate,就是一個候選者。在這個這個candidate里面必須包含一些基本信息,那第一個就是這個類型的,它是UDP的還是TCP的,他的IP地址是多少?端口是多少?

類型是什么?是主機類型就是我們自己本機的這個網卡還是這個反射后的,經過NAT反射后地址還是中繼地址,他是有類型的)。---見(二)

Candidate類型包含以下種類:(上面案例使用的是主機候選者)

主機候選者就是主機網卡的IP地址還有端口

反射候選者就是經過NAT之后的這個公網IP地址和端口(不是偽公網)

中繼候選者就是通過TURN服務給開通的這個IP地址和端口

(二)ICE具體工作內容 

1.實際剛才我們已經描述了那么第一個收集candidate,那怎么收集?剛才已經做了一些介紹,后面我們還會做更詳細的。

2.那收集到這些這個候選者之后呢,其實他要做一下排序,不是說每個候選者就直接進行檢測,這樣會浪費很多時間。

形成候選者對之后哪條路跟哪條路,形成多組的候選者對之后呢,然后要根據一套算法進行排序,根據優先級最高的那個先做測試,因為有可能是先通的,這樣就節省了時間。

3.那個最后呢,就是進行連通性測試,連通性測試就是嘗試,終端發送一個請求,然后對端給終端回一個請求。OK,那么雙方都收到了,這就連通的,如果說發出去之后超時了,沒有收到,這就是說明是不連通的。

以上這就是ICE具體做的一些事情。

(三)Candidate的獲取

那我們看一下這個candidate的關系圖,也就是說我們如何拿到這個candidate的?

本地這是一個agent,實際就相當於我們一個終端,但本地網卡,網卡有IP,那這個就是host的類型的主機候選者

經過NAT到那個TURN服務也可以到達STUN服務 ,一般情況下,像我們真實的這個配置的時候呢,是STUN服務和TURN服務是部署在同一台機子上的,程序同時具有STUN和TURN兩者的功能。

因此,通過STUN服務,就可以拿到主機的映射地址,就是NAT之后那個映射的公網地址(IP和端口),也就是說是反射候選者

此外,通過向TURN服務發送一個allocate請求,那么如果成功了,TURN服務端會開通中繼地址(IP地址和端口),作為中繼候選者

所以這三種類型就是通過以上方式獲取:通過發送一個請求獲取這幾種的候選者

主機候選者就是獲取自己本機所有IP和指定端口

發射候選者是通過向STUN/TURN服務發送請求的時候獲取到的映射后的這個NAT轉換后的公網IP和端口。

中繼候選者是通過這個TURN服務,我們發送一個allocate的請求申請的這個服務,為數據的轉發開通一個新的IP和端口,就是中繼地址。

那么拿到這些候選者之后,我們要交換信息,剛才已經說了,就是通過SDP交換信息

(四)SDP了解及基本格式

SDP案例: 下面這個例子中,就是一個標准的SDP案例

首先是版本信息v,一般都是0;

那第二個是o,表示為owner,這個SDP歸誰所有,比如案例中主機名字jdoe,有多個系列號,最后包含一個IP地址。但是這IP地址並不一定是最終要進行傳輸的IP的地址,在我們WEBRTC里並不是用這個IP,而是使用candidate中的ip。

c表示connection表示連接這個網絡的IPV4,OK,這些都不太重要。

那么這里呢,有一個媒體信息m,就是說在我這次交換媒體信息里,媒體就是一個audio也就是音頻,它使用的是RTP的協議,

對於這個音頻它有一個參數a=rtpmap,就是我使用的這個音頻的編碼方式是PCMU采樣率是8000,這里大家了解一下就好。

最重要的是最后兩行,它檢測到有兩種Candidate就是候選的路:

第一條是UDP的,IP 是 10.0.1.1端口是 8998,類型是host;

第二種也是UDP的,IP是192.0.2.3端口是45664,類型是穿越NAT的映射地址,

這里沒有中繼地址,就是最終不可能通過中繼傳輸數據,那要么就是說我們在同一局域網內可以互通,要么就是穿越NAT走P2P,這就是SDP。

(五)Candidate Pair

獲取得到所有的candidate之后,就要形成候選對,通過檢測連通性之后,形成通路!!!

(六)連通性檢測

獲取得到所有的候選對之后,開始做連通性檢測:

首先,要進行排序,要把優先級高的先排隊最先進行檢測,這樣可以節省時間,這在之前已經做過介紹。

然后,那在檢測的時候,首先是要進行發送檢測,就是測試能不能發出去。如果可以發送出去的話,接下來進行接收檢查。

最后,對每個候選對進行接收檢查。

其實在實際過程中,為了節省時間,發送跟接收是串行的,所以如果發送出去之后,然后再能收回我自己發送的信息,那么說明整個通路就是通過了,這其實在實現時還是非常簡單的,這么說起來呢,就是要分為發送檢測和接收檢測。

三:ICE工作流程

見:https://www.cnblogs.com/pannengzhi/p/5061674.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM