关于ICE
转自: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的更多相关文章
- ZeroC Ice启用SSL通讯的配置
Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...
- 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...
- c#Ice开发之环境配置(一)
第一步,基于Windows下的安装,所以下载windows版的Ice,官网最新版本是Ice3.5.1: http://www.zeroc.com/download/ 安装完成可以在vs-工具的最下面看 ...
- Ice分布式程序设计—IceBox(Hello World Application)
忙了三天,总算浏览完此书.藉此记下 Ice 的 IceBox 服务框架. 在此用 IceBox 框架写 Hello World 程序,即以载体来体现其特性. 第一步:编写 Slice 文件,映射生成 ...
- ZeroC Ice 暂记
摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...
- webrtc进阶-信令篇-之三:信令、stun、turn、ice
webRTC支持点对点通讯,但是webRTC仍然需要服务端: . 协调通讯过程中客户端之间需要交换元数据, 如一个客户端找到另一个客户端以及通知另一个客户端开始通讯. . 需要处理NAT(网 ...
- VS2012配置使用ICE通信接口
1.下载安装Ice-3.5.1.msi http://www.zeroc.com/download.html 2.添加安装路径到环境变量path,D:\Program Files (x86)\Zero ...
- clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)
相关介绍资料如下: Boost编译http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz/downlo ...
- Ice的HelloWorld(Java)
Ice是一种面向对象的中间间平台,入门ice,简单的HelloWorld是必不可少的. 转载请注明http://www.cnblogs.com/zrtqsk/p/3745286.html,谢谢. 一. ...
- 记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客!
在开始正文之前,请帮忙为当前 排名前 10 唯一的 .Net 开源软件 FineUI 投一票: 投票地址: https://code.csdn.net/2013OSSurvey/gitop/code ...
随机推荐
- c# Dictionary的遍历和排序
c# Dictionary的遍历和排序 c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 ...
- 多节点 devstack 部署
1, 网络配置 每个节点 /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.42.11 netmask ...
- 用Kibana和logstash快速搭建实时日志查询、收集与分析系统
Logstash是一个完全开源的工具,他可以对你的日志进行收集.分析,并将其存储供以后使用(如,搜索),您可以使用它.说到搜索,logstash带有一个web界面,搜索和展示所有日志. kibana ...
- [20160731][转]JAVA当中变量什么时候需要初始化
1. 对于类的成员变量,不管程序有没有显式的进行初始化,Java虚拟机都会先自动给它初始化为默认值. 默认值如下: Boolean false ...
- poj 2153
题意:题目还是很简单的,就是求Li Ming 在班上的排名,而且成绩是相加的. 思路:用map就行.不然好像用qsort+二分也可以,不过我在那里碰到了一些状况,然后就没用这种方法了,简单的map就可 ...
- Python QRCODE
- ios 修正waring:Method override for the designated initializer of the superclass '-init' not found
swift引入后,为了使oc和swift更相近,对oc的初始化方法也进行了修正,具体说明,见下面的链接,这个waring的最简单的修正方法是,到相应类的头文件中,去掉在自定义初始化方法后面的 NS_D ...
- redis与memcache区别总结
2015年9月2日 14:04:19 总会被问到两者的区别, 在这里总结下: redis 有内置的多种数据结构, list(可用于实现小型队列), hash, set, zset...; memcac ...
- tortoiseSVN svn+ssh
2015年6月28日 11:45:10 星期日 今天实验用小海龟svn客户端的svn+ssh协议去链接版本库, 期望会快一点儿 首先在设置里 记着将连接ssh用的用户名和密码一块儿写到输入框中: -l ...
- 跟着 8 张思维导图学习 Javascript
学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将po出8张javascript相关的思维导图. 思维导图小tips:思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又 ...