转自:http://wenda.chinabaike.com/b/38322/2013/1103/614756.html

一、ICE产生的背景

基于信令协议的多媒体传输是一个两段式传输。首先,通过信令协议(如SIP)建立一个会话连接,通过该连接,会话双方(Agent)通过SIP交互所承载的SDP消息彼此学习传输媒体时所必须的信息,针对媒体传输机制达成共识。然后,通常采用RTP协议进行媒体传输。

基于传输效率的考虑,通常在完成第一阶段的交互之后,通信双方另外建立一条直接的连接传输媒体。这样就会减少传输时延、降低丢包率并减少开销。这样,用于SIP传输的链路就不再用于传输媒体。现在,问题出现了,由于不采用原来的链路,当传输双方中任一方位于NAT之后,新的传输链接必须考虑NAT穿越问题。

通常有四种形式的NAT,对于每一中NAT方式,都有相应的解决方案。然而,每一种NAT穿越解决方案都局限于穿越对应得NAT方式,对于复杂的网络环境来说,将会出现无法进行媒体传输的情况,同时这些方案给整个系统带来了在不同程度上的脆弱性和复杂性。

在这种背景下,Interactive Connectivity Establishment(交互式连通建立方式)也即ICE解决方案应运而生。ICE方式能够在不增加整个系统的复杂性和脆弱性的情况下,实现对各种形式的NAT进行穿越,使得媒体流在通信双方顺利传输。

二、ICE工作的基本原理及特性

ICE是一种探索和更新式的解决方案。通过收集自己的和通信对端的尽可能多的网络信息(各种网络地址),尝试在这些地址之间建立数据通道,并在此过程中不断更新先前收集到的信息,从而找到和选择一条能够进行NAT穿越的数据通道。

其特性如下:ICE实现不是很复杂,支持TCP穿透,对NAT设备没有要求,支持所有类型的NAT,必须在客户端实现ICE,在网络结构中需要STUN/TURN服务器,具有与协议无关性和良好的可扩展性,安全性和健壮性都比较好。

三、ICE工作的核心

如下内容是ICE实现NAT穿透的所要完成的核心处理。包括收集地址,对地址进行排序、配对,然后执行连通性检查。

1、收集地址

Agent必须确定所有的候选的地址。这些地址包括本地网络接口的地址和由它派生的其他所有地址。本地网络地址包括本地网卡地址、VPN网络地址、MIP网络地址等。派生地址指的是通过本地地址向STUN服务器发送STUN请求获得的网络地址,这些地址分为两类,一类是通过STUN的绑定发现用法得到的地址,称为服务器反向候选地址(Server Reflexive Candidates)或服务器反向地址。另一类是通过中继用法得到的,称为中继地址(RELAYED CANDIDATES)。上面提到的两种用法在相应的规范中提出。

服务器反向地址实际上就是终端的网络包经过一重或多重NAT穿透之后,由STUN服务器观察到的经过NAT转换之后的地址。中继地址是STUN服务器收到STUN请求后,为请求发起方在本机上分配的代理地址,所有被路由到该地址的网络包将会被转发到服务器反向地址,继而穿透NAT发送到终端,因此如名字所示,它是STUN服务器完成中继功能的地址。

为了找到服务器反向地址,Agent通过每一个主机候选地址(通过绑定主机某个接口和端口而获取的候选地址),使用绑定发现用法(Binding Discovery Usage [11])发送一个STUN绑定请求给STUN服务器(STUN服务器的地址已经配置或者可以通过某种途径学习到)。当Agent发送绑定请求,NAT将分配一个绑定,它映射该服务器反向地址到主机候选地址。这样,通过主机候选地址发送的外发包,将通过NAT转换为通过服务器反向地址发送的包。发往服务器反向候选地址的包,将被NAT转换为发往该主机候选地址的包,并转发给Agent。

当Agent与STUN服务器之间存在多重NAT,那么STUN请求将会针对每一个NAT创建一个绑定,但是,只有最外部的服务器反向地址会被Agent发现。如果Agent不在任何NAT之后,那么,基候选传输地址将与服务器反向地址相同,服务器反向地址可以忽略。

关于中继地址,STUN中继用法允许STUN服务器作为一个媒体中继器进行工作,在L与R之间进行转发。为了发送消息到L,R必须发送消息给媒体中继器,通过媒体中继器转发给L。反之亦然。

从L到R的消息其地址信息将两次被重写:第一次被NAT,第二次被STUN中继服务器。这样,R所了解的想与之通信的地址就是STUN中继服务器的地址。这个地址就是中继地址。

2、连通性检查

Agent L收集到所有的候选地址后,就将它们按优先级高低进行排序,再通过信令信道发送给Agent R。这些候选地址作为SDP请求的属性被传输。当R收到请求,它执行相同的地址收集过程,并且把它自己的候选地址作为响应消息发给请求者。这样,每个Agent都将有一个完整的包含了双方候选地址的列表,然后准备执行连通性检查。

连通性检查的基本原理是:

l按照优先顺序对候选地址进行排序。

l利用每个候选地址发送一个检查包。

l收到另一个Agent的承认检查包。

首先,Agent将本地地址集和远程地址集进行配对,如本地有n个地址,远程有m个地址,那么配成n*m对。对这些地址对进行连通性检查是通过发送和接收STUN请求和响应完成的,此时,Agent在每个地址对的本地地址上,必须同时充当STUN服务器和STUN客户端的角色。若通信双方以某一地址对通过一个完整的四次握手,那么该地址对就是有效地址对。

四次握手是指:当通过地址对中的本地地址向地址对中远程地址发送一个STUN请求,并成功收到STUN响应,称该地址对是可接收的;当地址对中的本地地址收到地址对中远程地址的一个STUN请求,并成功地响应,则称该地址对为可发送的。若一个地址对是可接收的,同时又是可发送的,则称该地址对是有效的,即通过连通性检查。则此地址对可用于媒体传输。

通常在对称NAT的情况下,在地址对验证过程中,会出现发现以前收集地址时没有收集到的地址对,这时就要对这些新的地址对进行连通性检查。

3、对候选地址进行排序

关于ICE的更多相关文章

  1. ZeroC Ice启用SSL通讯的配置

    Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...

  2. 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数

    1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...

  3. c#Ice开发之环境配置(一)

    第一步,基于Windows下的安装,所以下载windows版的Ice,官网最新版本是Ice3.5.1: http://www.zeroc.com/download/ 安装完成可以在vs-工具的最下面看 ...

  4. Ice分布式程序设计—IceBox(Hello World Application)

    忙了三天,总算浏览完此书.藉此记下 Ice 的 IceBox 服务框架. 在此用 IceBox 框架写 Hello World 程序,即以载体来体现其特性. 第一步:编写 Slice 文件,映射生成 ...

  5. ZeroC Ice 暂记

    摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...

  6. webrtc进阶-信令篇-之三:信令、stun、turn、ice

    webRTC支持点对点通讯,但是webRTC仍然需要服务端:  . 协调通讯过程中客户端之间需要交换元数据,    如一个客户端找到另一个客户端以及通知另一个客户端开始通讯.  . 需要处理NAT(网 ...

  7. VS2012配置使用ICE通信接口

    1.下载安装Ice-3.5.1.msi http://www.zeroc.com/download.html 2.添加安装路径到环境变量path,D:\Program Files (x86)\Zero ...

  8. clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)

    相关介绍资料如下: Boost编译http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz/downlo ...

  9. Ice的HelloWorld(Java)

    Ice是一种面向对象的中间间平台,入门ice,简单的HelloWorld是必不可少的. 转载请注明http://www.cnblogs.com/zrtqsk/p/3745286.html,谢谢. 一. ...

  10. 记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客!

    在开始正文之前,请帮忙为当前 排名前 10 唯一的 .Net 开源软件 FineUI  投一票: 投票地址: https://code.csdn.net/2013OSSurvey/gitop/code ...

随机推荐

  1. Android常用控件

     Android 中使用各种控件(View) DatePicker - 日期选择控件 TimePicker - 时间选择控件 ToggleButton - 双状态按钮控件 EditText - 可编辑 ...

  2. eclipse中手动导入DTD文件的方式

    DTD一般应用在应用程序中定义数据交换类型的文档,一般用在xml配置文件中,有些时候在eclipse中并不能加载一些提示,这个时候需要手动导入,导入方法如下: 1.首先根据声明的网址下载.dtd的文件 ...

  3. SAP 凭证类别

    文章摘要:基本分为收.付.转三类,和传统的会计凭证分类一样.SA,总帐凭证.(转帐凭证)KA,供应商凭证.(付款凭证)KR,应付供应商凭证.(付款凭证)KG,供应商转来的红字发票,SAP称为贷方凭证. ...

  4. LINUX查看系统日志

    cat tail -f 日 志 文 件 说    明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安 ...

  5. JAVA导出pdf实例

    一.直接导出成PDF   Java代码 1. import java.io.FileNotFoundException; 2. import java.io.FileOutputStream; 3.  ...

  6. 【python】list,dict赋值不要用等号,要用extend,update

    如果有一个list,我们用连等号的方式赋值 c = d = [1], 则当c改变时,d同样会改变.字典同理 正确做法应该是: d = [1] c = [1] 或者 d = [1] c.extend(d ...

  7. (2016弱校联盟十一专场10.5) F. Fibonacci of Fibonacci

    题目链接 题目大意就是这个,先找出下标的循环节,再快速幂对20160519取余就行了. 找出下标循环节: #include <cstdio> #include <iostream&g ...

  8. HDU 5821 Ball (贪心排序) -2016杭电多校联合第8场

    题目:传送门. 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组. 题 ...

  9. CodeSign error: code signing is required for product type Application in SDK iOS

    在真机测试的时候往往会突然出现这样一个错误,code signing is required for product type 'Application' in SDK 'iOS 7.0'  ,就是说 ...

  10. php与xpath使用操作文本节点

    <?php $html="<p> 对于2014年,省统计局的统计分析显示,我省消费流通领域受诸多因素的影响,有机遇也有挑战.但值得注意的是,消费增长还存在不少制约因素,比如 ...