標籤:
[轉]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
[轉]ICE介紹 (RFC 5245)