[轉]ICE介紹 (RFC 5245)
http://blog.csdn.net/dxpqxb/article/details/22040017
?
1關于ICE的10個事實
1 ICE使用STUN和TURN
2 ICE是一種P2P的NAT穿越方式
3 ICE只需要網絡提供STUN或TURN服務器
4 ICE允許在很復雜的網路環境下傳輸媒體流
5 ICE只在確定媒體流可到達情況下才讓電話進行振鈴
6 ICE動態發現終端間媒體流的最短路徑
7 ICE可以附帶消除DoS攻擊
8 ICE可以幾乎和任意類型的NAT和防火墻設備一起工作
9 ICE不需要終端去發現NAT類型以及它們的存在
10 ICE只有在最壞的情況下才只用中繼(兩邊都在對稱NAT之后)
2 ICE的步驟
ICE 是一種探索、學習和更新式的解決方案。在ICE 算法的開始,通信的2 個代理并不知道自己的拓撲部署——在NAT 后還是不在NAT 后。
2.1 初始請求的發送
為了探索本地拓撲,代理 A 執行如下操作,收集 3 類候選地址(Candidates):
(1)A 從本地接口上獲得主機候選地址(Host Candidates)192.168.1.22: 8484;
(2)發送STUN 綁定請求到STUN 服務器獲得服務器反射候選地址(Server Reflexive Candidates)202.199.112.102: 61866;
(3)發送TURN 分配請求到TURN 服務器獲得中繼候選地址(Relay Candidates)202.199.112.105: 5006,同時也獲得了服務器反射候選地址202.199.112.102: 62072。
這些候選地址是隨后可能用于接收媒體流的地址。
計算候選的優先級。設置主機候選的類型優先參數為最高值126,服務器反射候選的類型優先參數為100,中繼候選的類型優先參數為最低值0。本地參 數設為65 535,分組ID為1。經計算,主機候選的優先級為2 130 706 431,服務器反射候選的優先級為1 694 498 815,中繼候選的優先級為16 777 215。按候選優先級高低排序。分配主機候選的基礎(Foundation)屬性為1,服務器反射候選的基礎屬性為2,中繼候選的基礎屬性為3。
按中繼候選、服務器反射候選、主機候選次序選擇默認候選(該候選包含了默認用于接收媒體流的地址和端口),由于A 獲得了中繼候選,因此優先選擇連通概率較大的中繼候選202.199.112.105:5006 作為默認候選。
將默認候選的 IP 地址和端口編輯進SDP 的c 行和m 行,并添加收集到的3 個候選地址到a 屬性,形成發送請求Offer,通過信令信道傳給B,請求消息內容如下所示,修改的參數和添加的屬性值用粗體顯示。
v=0
o=UserA 2890844526 2890842807 IN IP4 192.168.1.22
s=
c=IN IP4
202.199.112.105
t=0 0
a=ice-pwd:asd88fgpdd777uzjYhagZg
a=ice-ufrag:8hhY
m=audio
5006
RTP/AVP 0
b=RS:0
b=RR:0
a=rtpmap:0 PCMU/8000
a=candidate:1 1 UDP 2130706431
192.168.1.22 8484
typ host
a=candidate:2 1 UDP 1694498815
202.199.112.102 61866
typ
srflx raddr 192.168.1.22 rport 8484
a=candidate:3 1 UDP 16777215
202.199.112.105 5006
typ relay
raddr 202.199.112.102 rport 62072
2.2 應答的發送
當 B 收到請求,就知道了A 所處的拓撲環境(反射候選和主機候選地址不同,說明A 處于NAT 后)。B 執行和A 相同的操作,收集候選,計算候選優先級,設置基礎(Foundation)屬性,選擇默認候選,進行SDP 編碼,并發送應答消息Answer 給A。這樣A 也知道B 所處的拓撲環境了,反射候選和主機候選地址不同,說明B 也處于NAT 后。應答消息內容如下所示:
v=0
o=UserB 2808849004 2808849004 IN IP4 172.16.10.102
s=
c=IN IP4 202.199.112.105
t=0 0
a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh
a=ice-ufrag:9uB6
m=audio 49152 RTP/AVP 0
b=RS:0
b=RR:0
a=rtpmap:0 PCMU/8000
a=candidate:1 1 UDP 2130706431 172.16.10.102 8484 typ host
a=candidate:2 1 UDP 1694498815 202.199.112.87 63756 typ srflx
raddr 172.16.10.102 rport 8484
a=candidate:3 1 UDP 16777215 202.199.112.105 49152 typ relay
raddr 202.199.112.87 rport 63768
決定代理角色。由于A 和B 都是Full 型代理,且A 是請求的發起端,因此A 充當控制代理(Controlling Agent),B 為被控制代理(Controlled Agent)。A和B 開始對候選進行配對。A, B 各有3 個候選,A, B 各選1 個候選組成對,共有9 個對。由于不能從服務器反射選和中繼候選發送請求,因此剪掉冗余對,A, B 每一方只剩下3 個對,即從主機候選分別到對端的主機候選、服務器反射候選、中繼候選。
計算候選對的優先權并對候選對排序。對于控制代理A而言,按優先級排序候選對,形成檢查列表所示。
對于被控制代理B,同樣也計算候選對的優先級,并按優先級排序,形成自己的檢查列表。
檢查列表的次序決定了將來連通性檢查的次序。設置檢查列表中最高優先級對的狀態為等待態,其余對為凍結態。
2.3 連通性檢查
B 開始它的連通性檢查。B 依次從檢查列表移出最高優先級對,對的狀態由等待態遷移為進行態(這同時會觸發次高優先級對轉換為最高優先級對,狀態由凍結態變為等待態),開始連通性檢 查。對第1 個對從本地候選172.16.10.102: 8484到遠程候選192.168.1.22: 8484 發送STUN綁定請求([RFC5389]),由于遠程候選處于NAT 后是私有的,不能被路由,檢查失敗。對第2 個對執行連通性檢查,當數據包抵達NAT A 時,NAT 會發現傳輸地址202.199.112.102: 61866 已經映射202.199.112.108: 3478 了。而此時STUN請求的源地址并非202.199.112.108: 3478,所以數據包必然會被NAT A 丟棄。
對第 3 個對執行連通性檢查。由于遠程候選等于中繼候選,為了有效利用帶寬,應從本地候選172.16.10.102: 8484 向遠程候選202.199.112.105: 5006 發送信道綁定請求[5]。請求中指出了信道號0x4001 及通信對端A 的地址,請求到達TURN 服務器,綁定成功。該綁定的成功,激勵其學習對端反射候選202.199.112.102: 62072,經該反射候選到達對端A,然后產生了一個成功的響應,A 的檢查終于成功。B 產生了一個新的對(202.199.112.105: 49152,202.199.112.105: 5006),該對被增加到有效列表,媒體流分組的ICE 處理遷移到完成態。至此B 可以利用信道0x4001發送媒體流分組到A 了。
當 A 收到應答后,也按照候選對的優先級次序開始自己的連通性檢查。和B 類似,也失敗了。當A 一收到B 檢查成功的消息,馬上開始觸發檢查,在信道綁定請求中指定信道號0x4002 以及對端B 的地址。由于A 是控制代理,在檢查里可包含USE-CANDIDATE 屬性執行強制提名算法,結果檢查也成功了。代理A 產生了一個新的對(202.199.112.105:5006, 202.199.112.105:49152),該對被增加到有效列表,并設置提名標志(nominated flag)為TRUE,媒體流分組的ICE 處理遷移到完成態。A 可以通過信道0x4002 發送媒體流到B。
至此,通過該算法最終找到了媒體流傳輸的有效候選對,對應的最優路徑也就隨之確定了。由于有效候選是公網地址,因此通過該路徑媒體流可順利穿越NAT。
參考文獻
[1] 魏立峰等。 一種媒體流穿越 NAT 的算法設計與實現,? 《計算機工程》, 2009 年12 月
[2]RFC5245: Interactive Connectivity Establishment (ICE):? A Protocol for Network Address Translator (NAT) Traversal for????? Offer/Answer Protocols, 2010 April
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
