信令、Stun册着、Turn拴孤,ICE

WebRTC支持P2P,但是仍需要Server:

  • 協(xié)調(diào)通訊過程中甲捏,Client之間需要交換Meta Data
  • 需要處理NAT或FW

什么是信令

信令就是協(xié)調(diào)通訊的過程演熟,為了建立一個WebRTC的通訊過程,客戶端需要交換如下信息:

  • Session司顿,用來開始和結(jié)束通話
  • 處理錯誤的消息
  • Meta Data芒粹,如各自的音視頻解碼方式、帶寬
  • 網(wǎng)絡(luò)數(shù)據(jù)大溜,如對方的公網(wǎng)IP化漆、端口、內(nèi)網(wǎng)IP及端口
    信令處理過程需要Client能夠來回傳遞消息钦奋,這個過程WebRTC沒有實現(xiàn)获三,需要自己創(chuàng)建。

TURN和STUN

Meta Data是通過信令服務(wù)器中轉(zhuǎn)發(fā)給Client锨苏,但是對于流媒體數(shù)據(jù)疙教,一旦會話建立,首先嘗試使用P2P連接伞租。
WebRTC通過ICE框架來處理復(fù)雜的網(wǎng)絡(luò)環(huán)境

  • ICE試著找最好的路徑來讓Client建立連接贞谓,嘗試所有可能的選項,選擇最優(yōu)的方案
  • ICE首先嘗試P2P連接葵诈,如果失敗就會通過TURN服務(wù)器進行轉(zhuǎn)發(fā)
    換一個說法:
  • STUN服務(wù)器是用來取外網(wǎng)地址的
  • TURN服務(wù)器是在P2P失敗時進行轉(zhuǎn)發(fā)的
    STUN和TURN服務(wù)的主要作用是處理打洞和轉(zhuǎn)發(fā)裸弦,配合完成ICE協(xié)議

首先嘗試使用P2P,如果失敗將求助于TCP作喘,使用TURN轉(zhuǎn)發(fā)兩個端點的音視頻數(shù)據(jù)理疙,TURN轉(zhuǎn)發(fā)的是兩個端點之間的音視頻數(shù)據(jù)不是信令數(shù)據(jù)。因為TURN服務(wù)器是在公網(wǎng)上泞坦,所以他能被各個客戶端找到窖贤,另外TURN服務(wù)器轉(zhuǎn)發(fā)的是數(shù)據(jù)流,很占用帶寬和資源贰锁。

ICE技術(shù)

基于IP的語音赃梧、數(shù)據(jù)、視頻等業(yè)務(wù)在NGN(Next Generation Network)網(wǎng)絡(luò)中所面臨的一個實際困難就是如何有效地穿透各種NAT/FW的問題豌熄。對此授嘀,SIP(會話初始化協(xié)議)以往的解決方法由ALGs((Application Layer Gateway Service))、STUN锣险、TURN等方式蹄皱。
現(xiàn)在有一種新的媒體會話信令穿透NAT/FW的解決方案-交互式連通建立方式ICE览闰。它通過綜合利用現(xiàn)有協(xié)議,以一種更有效的方式來組織會話建立過程巷折,使之在不增加任何延遲同時比STUN等單一協(xié)議更具有健壯性焕济、靈活性。多媒體會話信令協(xié)議是在準(zhǔn)備建立媒體流傳輸?shù)拇碇g交互信息的協(xié)議盔几,例如SIP晴弃、RTSP(real time streaming protocol)等。
媒體流與信令流截然不同逊拍,它們所采用的網(wǎng)絡(luò)通道也不一致上鞠。由于協(xié)議自身設(shè)計上的原因,使得媒體流無法直接穿透網(wǎng)絡(luò)地址轉(zhuǎn)換/防火墻(NAT/FW)芯丧。因為它們生存期的目標(biāo)只是為了建立一個在信息中攜帶IP地址的分組流芍阎,這在遇到NAT/FW 時會帶來許多問題。而且這些協(xié)議的目標(biāo)是通過建立P2P(Peer to Peer)媒體流以減小時延缨恒,而協(xié)議本身很多方面卻與NAT存在兼容性問題谴咸,
這也是穿透 NAT/FW的困難所在。

ICE簡介

交互式連通建立方式ICE(Interactive Connectivity Establishment)并非一種新的協(xié)議骗露,它不需要對STUN岭佳、TURN或RSIP進行擴展就可適用于各種NAT。
ICE是通過綜合運用上面某幾種協(xié)議萧锉,使之在最適合的情況下工作珊随,以彌補單獨使用其中任何一種所帶來的固有缺陷。對于SIP來說柿隙,ICE只需要定義一些SDP(Session Description Protocol)附加屬性即可叶洞,對于別的多媒體信令協(xié)議也需要制定一些相應(yīng)的機制來實現(xiàn)。

流程

1. 收集傳輸?shù)刂?/h6>

會話發(fā)起者需要收集的對象包括:

  • 本地傳輸?shù)刂?Local Transport Address)
  • 來源傳輸?shù)刂?Derived Transport Address)禀崖。

本地傳輸?shù)刂?
通常由主機上一個物理(或虛擬)接口綁定一個端口而獲得衩辟。
會話發(fā)起者還將訪問提供UNSAF(Unilateral self-address fixing)的服務(wù)器,例如STUN波附、TURN或TEREDO艺晴。
對于每一個本地傳輸?shù)刂罚瑫捳叨伎梢詮姆?wù)器上獲得一組來源傳輸?shù)刂贰?br> 顯然叶雹,實現(xiàn)物理或虛擬連通方式越多财饥,ICE將工作得越好换吧。
但為了建立對等通信折晦,ICE通常要求至少有一個來源地址由位于公網(wǎng)上的中繼服務(wù)器(如TURN)所提供的,而且需要知道具體是哪一個來源傳輸?shù)刂贰?/p>

2. 啟動STUN

會話發(fā)起者獲得一組傳輸?shù)刂泛笳赐撸瑢⒃诒镜貍鬏數(shù)刂穯覵TUN服務(wù)器满着,這意味著發(fā)送到來源地址的STUN服務(wù)將是可達的谦炒。
與傳統(tǒng)的STUN不同,客戶端不需要在任何其它IP或端口上提供STUN服務(wù)风喇,也不必支持TLS宁改, ICE用戶名和密碼已經(jīng)通過信令協(xié)議進行交換』昴客戶端將在每個本地傳輸?shù)刂飞贤瑫r接受STUN請求包和媒體包还蹲,所以發(fā)起者需要消除STUN消息與媒體流協(xié)議之間的歧義。
在RTP和RTCP中實現(xiàn)這個并不難耙考,因為RTP與RTCP包總是以0b10(v=2)打頭谜喊,而STUN是0b00。對于每個運行STUN服務(wù)器的本地傳輸?shù)刂肪胧迹蛻舳硕急仨氝x擇相應(yīng)的用戶名和密碼斗遏。用戶名要求必須是全局唯一的,用戶名和密碼將被包含在初始化消息里傳至響應(yīng)者鞋邑,由響應(yīng)者對STUN請求進行鑒別诵次。

3. 確定傳輸?shù)刂返膬?yōu)先級

STUN服務(wù)器啟動后,下一步就是確定傳輸?shù)刂?/strong>的優(yōu)先級枚碗。
優(yōu)先級反映了UA在該地址上接收媒體流的優(yōu)先級別逾一,取值范圍在0到1之間,通常優(yōu)先級按照被傳輸媒體流量來確定肮雨。
流量小者優(yōu)先嬉荆,而且對于相同流量者的Ipv6地址比Ipv4地址具有更高優(yōu)先級。因此物理接口產(chǎn)生的本地Ipv6傳輸?shù)刂?/code>具有最高的優(yōu)先級酷含,然后是本地Ipv4傳輸?shù)刂?/code>鄙早,然后是STUNRSIP椅亚、TEREDO來源地址限番,最后是通過VPN接口獲得的本地傳輸?shù)刂贰?/p>

4. 構(gòu)建Initiate Message

Initiate Message由一系列媒體流組成,每個媒體流都有一個缺省地址候選地址列表呀舔。
缺省地址通常被Initiate Message映射到SIP信令消息傳遞地址上弥虐,而候選地址列表用于提供一些額外的地址。
對于每個媒體流來說媚赖,任意Peer之間實現(xiàn)最大連通可能性的傳輸?shù)刂肥怯晒W(wǎng)上轉(zhuǎn)發(fā)服務(wù)器(如TURN)提供的地址霜瘪,
通常這也是優(yōu)先級最低的傳輸?shù)刂贰?br> 客戶端將可用的傳輸?shù)刂肪幊梢粋€候選地址列表(包括一個缺省地址),并且為每個候選元素分配一個會話中唯一的標(biāo)識符惧磺。
該標(biāo)識符以及上述的優(yōu)先級都被編碼在候選元素的id屬性中颖对。一旦初始化信息生成后即可被發(fā)送。

5. 響應(yīng)處理:連通性檢查和地址收集

會話應(yīng)答方接收到Initiate Message后磨隘,會同時做幾個事情:
首先執(zhí)行收集傳輸?shù)刂?/strong>中描述的地址收集過程缤底。這些地址可以在呼叫到達前預(yù)收集顾患,這樣可以避免增加呼叫建立的時間。
當(dāng)獲得來源地址以后个唧,應(yīng)答方會發(fā)送STUN Bind請求江解,該請求要求必須包含Username屬性和Password屬性,屬性值為從 alt中得到的用戶名和密碼徙歼。
STUN Bind請求還應(yīng)包括一個Message-Integrity屬性犁河,它是由Initiate Message中候選元素的用戶名和密碼計算得來的。
此外魄梯,STUN Bind請求不應(yīng)有Change-RequestResponse-Address屬性呼股。當(dāng)一個客戶端收到Initiate Message時,它將通過其中的缺省地址端口發(fā)送媒體流画恰。如果STUN Bind請求消息引起錯誤應(yīng)答彭谁,則需要檢查錯誤代碼。
如果是401允扇,430缠局,432500,說明客戶端應(yīng)該重新發(fā)送請求考润。如果錯誤代碼是400狭园,431600,那么客戶端不必重試糊治,直接按超時處理即可唱矛。

6. 生成Accept Message

應(yīng)答者可以決定是接受拒絕該通信,若拒絕則ICE過程終止井辜,若接受則發(fā)送Accept消息绎谦。
Accept消息的構(gòu)造過程與Initiate Message類似。

7. Accept Message的處理

Accept過程有兩種可能粥脚。如果Initiate Message的接受者不支持ICE窃肠,則Accept Message將只包含缺省的地址信息,這樣發(fā)起方就知道它不用執(zhí)行連通性檢查了刷允。然而如果本地配置信息要求發(fā)起者通過TURN服務(wù)器發(fā)包來進行連通性檢查冤留,這將意味著那些直接發(fā)給響應(yīng)者的包會被對方防火墻丟棄。為解決這個問題树灶,發(fā)起者需要重新分配一個TURN來源地址纤怒,然后使用Send命令。一旦Send命令Accept天通,發(fā)起者將發(fā)送所有的媒體包到TURN服務(wù)器泊窘,由服務(wù)器轉(zhuǎn)發(fā)至響應(yīng)者。如果Accept Message包含候選項,則發(fā)起方處理Accept Message的過程就與響應(yīng)方處理Initiate Message很相似了州既。

8. 附加ICE過程

InitiateAccept消息交換過程結(jié)束后谜洽,雙方可能仍將繼續(xù)收集傳輸?shù)刂仿苡常@通常是由于某些STUN事務(wù)過長而未結(jié)束引起吴叶,另一種可能是由于Initiate/Accept消息交換時提供了新的地址。

9. ICE到SIP的映射

使用ICE方式穿透NAT序臂,必須映射ICE定義的參數(shù)到SIP消息格式中蚌卤,同時對其SDP屬性進行簡單擴展——在SDPMedia塊中定義一個新的屬性alt來支持ICE。它包含一個候選IP地址端口奥秆,SDP的接受端可以用該地址來替換m和c中的地址逊彭。
Media塊中可能會有多個alt屬性,這時每個alt應(yīng)該包括不重復(fù)的IP地址端口构订。

總結(jié)

ICE方式的優(yōu)勢是顯而易見的侮叮,它消除了現(xiàn)有的UNSAF機制的許多脆弱性。例如悼瘾,傳統(tǒng)的STUN有幾個脆弱點:

  • 一個是發(fā)現(xiàn)過程需要客戶端自己去判斷所在NAT類型囊榜,這實際上不是一個可取的做法。而應(yīng)用ICE之后亥宿,這個發(fā)現(xiàn)過程已經(jīng)不需要了卸勺。
  • 另一點脆弱性在于STUNTURN等機制都完全依賴于一個附加的服務(wù)器烫扼, 而ICE利用服務(wù)器分配單邊地址的同時曙求,還允許客戶端直接相連咧虎,因此即使STUNTRUN服務(wù)器中有任何一個失敗了自晰,ICE方式仍可讓呼叫過程繼續(xù)下去衷敌。
  • 此外棺蛛,傳統(tǒng)的STUN最大的缺陷在于它不能保證在所有網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中都正常工作摄闸,最典型的問題就是Symmetric NAT僚焦。對于TURN或類似轉(zhuǎn)發(fā)方式工作的協(xié)議來說茶凳,由于服務(wù)器的負(fù)擔(dān)過重择示,很容易出現(xiàn)丟包或者延遲情況豆赏。 而ICE方式正好提供了一種負(fù)載均衡的解決方案挣菲,它將轉(zhuǎn)發(fā)服務(wù)作為優(yōu)先級最低的服務(wù),從而在最大程度上保證了服務(wù)的可靠性和靈活性掷邦。
  • 此外白胀,ICE的優(yōu)勢還在于對Ipv6的支持,目前Cisco等公司正在設(shè)計基于ICE方式的NAT/FW解決方案抚岗。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末或杠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宣蔚,更是在濱河造成了極大的恐慌向抢,老刑警劉巖认境,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挟鸠,居然都是意外死亡叉信,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門艘希,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硼身,“玉大人,你說我怎么就攤上這事覆享〖阉欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵撒顿,是天一觀的道長丑罪。 經(jīng)常有香客問我,道長凤壁,這世上最難降的妖魔是什么吩屹? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮客扎,結(jié)果婚禮上祟峦,老公的妹妹穿的比我還像新娘。我一直安慰自己徙鱼,他們只是感情好宅楞,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袱吆,像睡著了一般厌衙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绞绒,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天婶希,我揣著相機與錄音,去河邊找鬼蓬衡。 笑死喻杈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狰晚。 我是一名探鬼主播筒饰,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壁晒!你這毒婦竟也來了瓷们?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谬晕,沒想到半個月后碘裕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡攒钳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年帮孔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夕玩。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡你弦,死狀恐怖惊豺,靈堂內(nèi)的尸體忽然破棺而出燎孟,到底是詐尸還是另有隱情,我是刑警寧澤尸昧,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布揩页,位于F島的核電站,受9級特大地震影響烹俗,放射性物質(zhì)發(fā)生泄漏爆侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一幢妄、第九天 我趴在偏房一處隱蔽的房頂上張望兔仰。 院中可真熱鬧,春花似錦蕉鸳、人聲如沸乎赴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榕吼。三九已至,卻和暖如春勉失,著一層夾襖步出監(jiān)牢的瞬間羹蚣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工乱凿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顽素,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓徒蟆,卻偏偏與公主長得像胁出,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子后专,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容