ICE客户和服务器结构
百万用户同时在线游戏服务器架构实现

百万用户在线网络游戏服务器架构实现一、前言事实上100万游戏服务器,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高效率的编程语言、高性能的数据库、还有高性能的架构模型。
但是除了这几个方面,还没法根本解决面临的高负载和高并发问题。
当然用户不断地追求更高的机器性能,而升级单一的服务器系统,往往造成过高的投入和维护成本,性价比大大低于预期。
同时全天候的可用性的要求也不能满足要求,如果服务器出现故障则该项服务肯定会终止。
所以单独追求高性能的服务器不能满足要求,目前基本的解决方案是使用集群技术做负载均衡,可以把整体性能不高的服务器做成高可扩展性,高可用性,高性能的,满足目前的要求。
目前解决客户端和服务器进行底层通讯的交互的双向I/O模型的服务器的成熟方案。
1.windows下,比较成熟的技术是采用IOCP,完成端口的服务器模型。
2.Linux下,比较成熟的技术是采用Epoll服务器模型, Linux 2.6内核中提供的System Epoll为我们提供了一套完美的解决方案。
目前如上服务器模型是完全可以达到5K到20K的同时在线量的。
但5K这样的数值离百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。
而且目前几个比较成熟的开发框架,比如ICE,ACE等。
这样,当采用一种新的通信技术来实现通信底层时,框架本身就不用做任何修改了(或修改很少),而功能很容易实现,性能达到最优。
目前采用的ace框架个不错的选择方案,可以不受操作系统的影响,移植比较方便。
对于数据库选择可有许多成熟的方案,目前大多数选择的mysql Master/slave模式,以及oracle RAC方案。
基本可以满足目前的要求,但具体的瓶颈不是在数据库本身,应该还是硬件磁盘I/O的影响更大些。
建议使用盘阵。
这有其他成熟的方案,比如采用NAS解决分布数据存储。
其实最为关键的是服务器的架构和实现,数据流量的负载均衡,体系的安全性,关键影响度,共享数据的处理等等多个方面对100万用户的数据处理有影响,所以都要全面的考虑。
ICE建立数据传输的方法步骤

快速利用ICE建立数据传输的方法步骤一.Slice项目创建1.创建Silce 项目,创建自己的ice文件SaveData.ice,ice文件必须以.ice后缀结尾,ice编译器只识别该后缀的文件。
2.利用Silce2cpp命令对ice文件进行编译生成相应的cpp文件和h文件,将上述两文件添加到自己的应用程序里。
该部主要是生成服务,这里服务暂时定为SaveData(保存数据),那么就会生成SaveData.cpp和SaveData.h两文件,里面定义了一个SaveData类,该类的存储数据操作函数SaveData(MyData)是个纯虚函数,以后应用程序要用必须重载该纯虚函数。
3.自己的应用程序客户端和服务器端都要引用Silce 项目。
二.服务器端创建1.建立SaveData类的派生类MySaveData类,重载保存数据虚函数。
2.创建含有ICE run time主句柄的CommunicatorPtr 类型的实例。
调用语句Ice::CommunicatorPtr ic;3.初始化CommunicatorPtr实例ic。
调用语句ic = Ice::initialize(argc, argv); initialize函数的两个参数可不设置。
4.通过用途名创建适配器adapter,调用语句Ice::ObjectAdapterPtr adapter=ic->createObjectAdapterWithEndpoints("SaveDataAdapter", "default -p 8800"); "SaveDataAdapter " 就是适配器的名字,最好通过用途进行命名;"default -p 8800"是通过默认网络协议(TCP/IP)进行连接,监听的端口号是8800.5.为服务创建接口servant,调用语句Ice::ObjectPtr object = new MySaveData。
ICE

8.线程支持: 8.线程支持: Ice run time完全是线程化的,其API是 time完全是线程化的,其API是 线程安全的.作为应用开发都,你无需为 开发线程化的高性能客户和服务器付出额 外努力 ; 9.传输机制无关性: 9.传输机制无关性: ICE目前采用TCP/IP和UDP作为传输 ICE目前采用TCP/IP和UDP作为传输 协议.客户和服务器代码都不需要了解底 层的传输机制 ;
ICE服务 ICE服务
ICE有一些功能特性被实现成ICE服务器,自己开发的应用充当的是这 ICE有一些功能特性被实现成ICE服务器, 些服务器的客户端.ICE服务有:IcePack,IceBox,IceStorm,IcePath,Glacier. 些服务器的客户端.ICE服务有:IcePack,IceBox,IceStorm,IcePath,Glacier. 1. IcePack: IcePack: 我们在第 12页提到过, IcePack 是 Ice的定位服务,用于在使用间接 12页提到过, Ice的定位服务,用于在使用间接 绑定时把符号性的 (symbolic)适配器名解析为协议-地址对. 除了这样 symbolic)适配器名解析为协议-地址对. 的定位服务, IcePack还提供了其他特性: IcePack还提供了其他特性: IcePack 允许你注册服务器,进行自动启动:当客户发出请求时,服 务器无需在运行, IcePack 会在第一个客户请求到达时,随需启动服务器. IcePack 支持部署描述符 (deployment descriptors),能让你轻松地配 descriptors),能让你轻松地配 置含有若干服务器的复杂应用. IcePack 提供了一种简单的对象查找服务,客户可用来获取它们感兴趣 的对象的代理.
ICE整理

互动式连接建立(Interactive Connectivity Establishment ——ICE)草案是由IETF的MMUSIC 工作组开发出来的,它所提供的是一种框架,使各种NA T穿透技术可以实现统一。
该技术可以让基于SIP的V oIP客户端成功地穿透远程用户与网络之间可能存在的各类防火墙。
原文出自【比特网】,转载请保留原文链接:/91/2076091.shtml它通过综合利用现有协议,以一种更有效的方式来组织会话建立过程,使之在不增加任何延迟同时比STUN等单一协议更具有健壮性、灵活性。
2.1 ICE简介交互式连通建立方式ICE(Interactive Connectivity Establishment)并非一种新的协议,它不需要对STUN、TURN或RSIP进行扩展就可适用于各种NAT。
ICE 是通过综合运用上面某几种协议,使之在最适合的情况下工作,以弥补单独使用其中任何一种所带来的固有缺陷。
对于SIP来说,ICE只需要定义一些SDP(Session Description Protocol)附加属性即可,对于别的多媒体信令协议也需要制定一些相应的机制来实现交互式连接建立(Interactive Connectivity Establishment),一种综合性的NAT穿越的技术。
交互式连接建立是由IETF的MMUSIC工作组开发出来的一种framework,可整合各种NAT 穿透技术,如STUN、TURN(Traversal Using Relay NAT,中继NAT实现的穿透)、RSIP (Realm Specific IP,特定域IP)等。
该framework可以让SIP的客户端利用各种NAT 穿透方式打穿远程的防火墙。
4结束语ICE方式的优势是显而易见的,它消除了现有的UNSAF机制的许多脆弱性。
例如传统的STUN有几个脆弱点,其中一个就是发现过程需要客户端自己去判断所在NAT类型,这实际上不是一个可取的做法。
ICE简单实例-hello world

简单的ICE通信应用-Hello World参考《Ice分布式程序设计》马维达译、冯立彬的博客一、简述创建一个非常简单的客户-服务器ice应用。
这个应用提供远地打印功能:客户发送要打印的文本给服务器,再由服务器把文本发给打印机。
打印程序只是把文本打印到终端,而不是真正的打印机。
目的是说明客户怎样与服务器通信。
二、安装ICE下载安装包:/download.html1.安装ice2.配置路径测试slice2java命令配置环境变量:再次测试slice2java命令,显示如下信息,配置完成。
使用myeclipse开发,创建一个项目名为icetest的java工程,创建包demo、demo.servant、demo.client、demo.server。
三、编写Slice 定义编写任何Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所用的各个接口。
我们为我们的打印应用编写了这样的Slice 定义:module demo {interface Printer {void printString(string s);};};我们把这段文本保存在叫作printer.ice的文件中,存放在src目录下。
我们的Slice 定义含有一个接口,叫作Printer。
目前,我们的接口非常简单,只提供了一个操作,叫作printString。
printString 操作接受一个串作为它唯一的输入参数;这个串的文本将会出现在(可能在远地的)打印机上。
四、编写使用Java 的Ice 应用1. 编译printer.ice在cmd命令行中进入到printer.ice文件所在的目录输入命令:slice2java printer.iceslice2java编译器根据这个printer.ic e文件定义生成一些Java源文件。
我们目前无需关注这些文件的确切内容——它们包含的是编译器生成的代码,与我们在P rinter.ice 中定义的Printer接口相对应。
gridservice:ICE通信之IceGrid服务(二)gridservice

gridservice:ICE通信之IceGrid服务(二)gridservice话题:gridservice 使用方法节点一、简介Ice版本:3.1.1使用iceGrid服务实现一个简单的打印系统,主要说明iceGrid的使用方法,系统部署在4台主机上,注册器和打印服务器安装在同一台主机上,如下图所示:下图显示了一个客户端通过间接代理的初始调用,来激活目标服务器。
在这个架构当中不需要花时间手动启动服务。
客户端的寻址请求提示注册器去查询节点的服务器状态并且根据需要启动它。
一旦这个服务启动成功,这个寻址请求完成,并且随后客户端直接和服务端通信。
二、配置注册器、节点1注册器需要一个子目录,在这个目录中创建它的数据库,由注册器和节点1的配置信息在同一个配置文件中,在节点1的服务器上存储该配置文件,如存放在c盘根目录下c:\config,文件名为config。
有几个属性定义了Endpoints,但只有icegrid.registry.client.endpoints的值需要一个固定的端口。
此属性指定IceGrid定位服务的端口; IceGrid的客户端必须在他们的Ice.Default.Locator中包括这个端口。
三、配置节点2在节点2的服务器上存储该配置文件,如存放在c盘根目录下c:\config,文件名为config。
四、Slice 脚本打印服务器实现简单的打印功能,服务端接收客户端的打印信息,并负责将信息打印到终端,打印完成之后,返回给客户端一个打印完成的提示信息。
五、Servant代码六、服务端代码七、客户端代码八、配置客户端九、部署配置文件十、部署标签说明replica-group:定义一个适配器复制组,每一个应用中的适配器通过使用adapter标签中的replica-group属性,将适配器加入到这个复制组中,如:<adaptername=“PrinterAdapter”replica-group=“PrinterAdapters” endpoints=“tcp” />name= PrinterAdapter表明该适配器是复制组的成员。
ICE介绍

ICE资料整理概念ICE: (The Internet Communications Engine)互联网通信引擎。
是由前CORBA专家开发的新一代面向对象中间件,ICE之轻量级分布式通讯中间件。
介绍:ICE是一种面向对象的中间件平台。
从根本上说,这意味着Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。
Ice 应用适合于异构平台环境中使用:客户和服务器可以采用不同的编程语言,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。
无论部署环境如何,这些应用的源码都是可移植的。
其采用C/S 模式结构,支持同步调用方式和异步调用方式,异步派发调用方式。
支持跨语言的对象调用。
多种语言之间采用共同的Slice(Specification Language for Ice)进行沟通。
支持ice到C,JAVA,C#,VB,Python,Ruby,PHP等多种语言的映射。
Ice源代码发布包包含一系列的第三方产品(Berkeley DB,bzip2/libbzip2,The OpenSSL Toolkit,SSLeay,Expat,STLport,mcpp)。
特点:1.平台无关性。
无论客户端或者服务端均可用现在流行的开发语言(C++ /JAVA/C#/php)进行开发,并且屏蔽语言差异性。
现在比较流行的方式是客户端用C#开发,与用C++开发的服务端直接通讯。
2.通讯协议多样性。
现在可选择TCP、UDP、HTTP进行通讯,如果对安全要求较高,可选择SSL对传输的数据进行加密。
3.Ice具有丰富的特性。
其性能远是基于jms 所不能比的。
4.ICE注重的是通讯,异构平台,多语言之间,支持远程对象的通讯中间件。
ICE学习总结

ICE概念交互式连接建立(Interactive Connectivity Establishment ——ICE)草案是由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。
ICE定义的是一种标准化的方法,能够确定客户端之间存在的是哪一种类型的NAT 防火墙,并且确定一连串可以用于实现连接的IP地址。
通过使用多种协议及网络连接机制,如STUN(Simple Traversal of UDP Through NATs——STUN),TURN(Traversal Using Relay NAT——TURN),ICE可以了解到客户端所在网络结构以及这些设备可以实现通信的各类网络地址。
ICE的基本流程其实很清晰,分两个步骤,第一步就是收集各种类型的地址,第二步就是将本地和远端的地址进行配对,排序,然后执行连通性检查。
1.NAT穿越技术分析如果通信的双方有一方或者两方在NAT后,就需要进行NAT穿越。
2.1 NAT类型NAT有4种不同的类型1) Full Cone2) Address Restricted Cone3) Port Restricted Cone以上三种NAT通称Cone NAT(圆锥形NAT).我们只能用这种NAT进行UDP打洞.4) Symmetric(对称形)对于这种NAT。
连接不同的外部Server,NAT打开的端口会变化。
也就是内部机器A连接外网机器B时,NAT会打开一个端口,连接外网机器C时又会打开另外一个端口。
2.2常用穿越技术的比较比较常用的NAT穿越技术有STUN,TURN,但是STUN不支持TCP连接的穿越,也不支持对称NAT。
TURN虽然支持TCP连接的应用也可以穿越对称NAT,但是TURN的局限性在于所有报文都必须经过TURNServer转发,增大了包的延迟和丢包的可能性,而且服务器的负担比较大。
ICE将STUN与TURN相结合,如果可以用STUN穿越,就建立P2P连接,否则就通过TURN服务器进行中转,建立relay连接。
Intel CPU架构解析2020

Sunny Cove内核结构图
Sunny Cove内核微架构
缓冲区部分对比
缓存对比
可以看到Intel这次把乱序重排缓冲区(ReOrder Buffer,主要是用于乱 序执行后将执行的微指令根据原本顺序提交的指令缓冲区)大小做到 了可以容纳352条微指令,直接提升了128条/57%之多,而Haswell到 Skylake才仅仅提升了32条。同样在访存上面也进行了不小的提升, Load(加载)队列增加了56,Store(存储)队列增加了16,比Haswell 到Skylake的改变都明显要多。
Uncore部分
当 然 也 不 是 所 有 的 厂 商 都 会 给 足 四 个 TB3 接 口 , 具 体 怎 么 配 置 还 是 得 看 OEM厂商,毕竟其他的配套芯片诸如USB PD所需要的独立IC都是会增加成 本 的 , 而 TB 接 口 还 需 要 额 外 的 Retimer 芯 片 , 不 过 Intel 已 经 减 半 了 所 需 的 Retimer,两条TB3只需要1个Retimer就可以了。
Thunderblot 3
原来阻挡人们使用Thunderblot(以下简称TB)设备的一大原因就是这个接口的 使用成本略高,当TB3开始以USB Type-C接口的形式出现之后,使用率确实高上 去不少,但是还有其他的拦路虎,其中一个就是TB需要主板搭载额外的芯片来使 用,这个控制芯片并不便宜。终于在Ice Lake上面,Intel把TB控制器整合到了 处理器里面,并且再也不会占据掉处理器提供的PCI-E总线数量或者是与PCH一起 挤原本就已经拥挤不堪的DMI 3.0总线,而是在环形总线上面拥有了自己的位置 。
第11代图形架构新Fra bibliotek口版本和加强的硬件编码电路
Ice个人整理资料

Ice个人整理资料1.客户与服务器(Clients and Servers)2.Ice 对象(Ice Objects )3.代理(Proxies )4.串化代理(Stringified Proxies )代理中的信息可以用串的形式表示。
例如:SimplePrinter:default -p 100005.直接代理(Direct Proxies )协议标识符(比如TCP/IP 或UDP)针对具体协议的地址(比如主机名和端口号)6.间接代理(Indirect Proxies)7. 同步方法调用(Synchronous Method Invocation)8. 异步方法调用(Asynchronous Method Invocation)9. 异步方法分派(Asynchronous Method Dispatch)10. 单向方法调用(Oneway Method Invocation )11. 成批的单向方法调用(Batched Oneway Method Invocation )12. 数据报调用(Datagram Invocations)13. 成批的数据报调用(Batched Datagram Invocations)14. 运行时异常(Run-Time Exceptions )15. 用户异常(User Exceptions )16. 属性(Properties )17. 骨架(skeleton)代码也是根据你的Slice 定义生成的,因此,与你用Slice 定义的对象和数据的类型是对应的。
骨架代码是客户端代理代码的服务器端等价物:它提供了向上调用(up-call)接口,允许Ice runtime 把控制线程转交给你编写的应用代码。
骨架也含有整编和解编代码,所以服务器可以接收客户发送的参数,并把参数和异常返回给客户。
18. 对象适配器(object adapter)是专用于服务器端的Ice API 的一部分:只有服务器才使用对象适配器。
基于ICE中间件的分布式网管系统的研究与设计

了集 中的 思想 。首先 是集 中 维护 ,然 后有 了 集 中 监 控 、 集 中管 理 。 处 理 更分 布 。 与建 设 规模 更 集 中相 反 ,
系统 的处理 方 式将 更分 布 。一 方面 由于大规
都有一个或多个接 口,并且都有一个唯一的
对象标 识 (be t ie t y 。对 象标 识的 o jc d n i ) t
I CE对 象是 本 地或 远地 的 地址 空 间 中、
&I和追 良槛 蠢论 文 畸 簦贰 取肇 氛 的 纯 、 鼙 统
构进 行 了深 入的 分析和 研 究 提 出 了 种 基 一 于iE年阃 许呐务 戈 管 乐绞÷ 壁 毳簧诚单 丧
阐述 了}E C 中阐件的原理 和在构建分布式 网管 l
作用是 把一个对象 与其他 所有对象区别开来的 懿曝 鞲 髓 Nhomakorabea 皤 镶
确 静
斌B 峨 吣鸯
毒 谚蕊毋 a 龋缓始 釉 毋誊 缮 翩蛹瞎。 霸髓谚 . | 铷 簿 媳 鳓 ≮ 甜曲 憾 婚旗设 舔 蛳 媾 蠛嘲啦 e
模 的集 中导 致 系统 处 理负 荷 急剧 增加 ,从 负 载 平衡 和健 壮性 的角 度考 虑 ,分布 式 的处 理 都 是 最佳 的解 决办 法 。另一 方 面 合理 的分 布
对 象 的设 计 角度而 言 ,每 一个能 够 供调 用的 对 象 ,均 可看 作一 个服 务 ,而对 象 的宿 主进 程 , 可 以 认 为是 一 个 服 务 载 体 。 因此 ,最
根 本上 说 ,I E为构 建面 向对 象 的客 户 一服 C
务 器应 用提 供 了工具 、AP I和 库 支持 。I E C
然而 开发 这样 复杂 、扩 展性 强 、高性 能 的 、与 平 台无关 的 网管 系统 ,必然 需要 选择
ICE

实现原理
实现原理
客户与服务器
按照常规的理解,客户与服务器的划分在于两者承担的角色不同:客户是发出请求的一方,服务器是响应请 求、提供服务的一方。然而在实际应用中,很多服务器并不是纯粹的服务器,它们常常充当某些客户的服务器, 但为了完成它们的客户的请求,它们又会充当其他的服务器的客户。
ICE同理,很多客户机也不是纯粹的客户。例如,客户可以在服务器上启动一个长时间运行的操作,在启动 该操作时,客户可以向服务器提供回调对象( callback object),供服务器用于在操作完成时向客户发出通知。 在这种情况下,客户在启动操作时充当客户,而在接收操作完成通知时充当服务器。
在设计网站架构的时候可以使用ICE实现对网站应用的基础对象操作,将基础对象操作和数据库操作封装在 这一层,在业务逻辑层以及表现层(java,php,.net,python)进行更丰富的表现与操作,从而实现比较好的架构。 基于ICE的数据层可以在未来方便的进行扩展。ICE支持分布式的部署管理,消息中间件,以及网格计算等等。
ቤተ መጻሕፍቲ ባይዱ术简介
技术简介
中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件 与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上 层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。
ICE
面向对象中间件
01 技术简介
03 实现过程 05 优点
目录
02 实现原理 04 设计目标
基本信息
网络通信引擎ICE(Internet Communications Engine)是Zero C公司的分布式系统开发专家实现的一种新 的高性能的面向对象中间件平台。从根本上说, ICE为构建面向对象的客户-服务器应用提供了工具、 API ( Application Program Interface)和库支持。 基于ICE可以实现电信级的解决方案。
ice协议工作原理

ice协议工作原理
ICE(Interactive Connectivity Establishment)协议是用于
在网络上建立对等连接的一种技术。
它的工作原理涉及到多个方面,包括网络地址和端口的发现、NAT(Network Address Translation)穿越和对等连接的建立。
首先,ICE协议通过使用STUN(Session Traversal Utilities for NAT)服务器来帮助确定网络上的公共IP地址和端口。
STUN服
务器允许设备发现自己在NAT后面的真实IP地址和端口,这对于建
立对等连接至关重要。
其次,ICE协议利用TURN(Traversal Using Relays around NAT)服务器来克服NAT的限制。
如果两个设备无法直接通信(比如
由于双方都在NAT后面),它们可以通过TURN服务器进行通信,TURN服务器充当中继,帮助在NAT后面的设备进行数据传输。
最后,ICE协议使用候选地址来描述设备的网络地址和端口,
这些地址可以是设备的本地地址、STUN服务器返回的公共地址或者TURN服务器提供的中继地址。
ICE协议会根据这些候选地址进行筛
选和优先级排序,然后尝试进行连接,直到找到可行的对等连接路
径。
总的来说,ICE协议通过STUN和TURN服务器的协助,以及候
选地址的筛选和排序,帮助设备在网络上建立对等连接,克服了
NAT带来的限制,从而实现了实时通信和多媒体传输等应用场景的
需求。
ICE协议的工作原理是非常复杂和精密的,但通过这些机制,它能够有效地解决网络通信中的一系列挑战。
ICE技术研究

ICE专题ICE简介ICE(Internet Communications Engine)是一个为现实中程序员而写的中间件平台。
作为一个高性能的互联网通信平台,ICE包含了很多分层的服务和插件(Plug-ins),并且简单、高效和强大。
ICE的自由使用遵从GNU的GPL(GNU General Public Licens)许可的条款。
ICE 也有商业的许可证,如果你想将ICE使用在你的私有产品中,那么你应该使用ICE的商业许可证。
可以联系sales@来获得这方面的更多信息。
ICE当前支持C++、Java、C#、Visual Basic、Python和PHP编程语言,并支持在多种操作系统上运行。
更多的操作系统和编程语言将会在以后的发布中支持。
ICE有以下几部分组成:SliceICE的规范语言,跟CORBA的IDL(Interface Definition Language)等价的东西。
Slice建立了客户端和服务器端共同遵守的契约:接口。
Slice也用来描述对象持久数据。
Slice CompilersSlice的规范语言可以影射成多种编程语言。
目前ICE支持C++,Java,Python,PHP,C#和VB的语言影射。
Ice的客户端和服务器端协同工作,而不会知道分别实现的是何种编程语言。
IceIce的核心库。
在众多的特性当中,Ice核心库通过一个高效的协议(包含TCP/UDP 层上协议压缩)来管理所有的通信任务,为多线程服务器提供了一个灵活的线程池,并且有特别的功能来支持上百万对象的可扩展性。
IceUtil一些常用的功能函数集。
例如Unicode处理和多线程编程,是用C++写成。
IceBox一个专用于ICE应用的应用服务器。
ICEBox可以方便地运行和管理动态加载、共享库或java类的形式Ice的服务。
IcePack一个成熟的服务激活和部署工具。
IcePack能大大简化在异构网络之间部署应用的复杂性。
ice协议看明白

竭诚为您提供优质文档/双击可除ice协议看明白篇一:基于stun,turn,ice协议的nat穿越基于stun,turn,ice协议的nat穿越分类:Voiptech20xx-10-0820:23115人阅读评论(0)收藏举报stun,turn,ice协议概述stun,turn,ice是ietf提出的处理voip网络中nat穿越问题的协议族。
stun可以处理大部分nat问题,turn是stun协议的一个增强版,专用于处理对称形nat问题,而ice则是综合stun 及turn的产物,是一个框架,综合运用stun和tuRn的结构,它提供可靠的Voip或视频通话配置以及媒体传输,通过一个sip供给/应答模型供端点交换多个候选ip地址和端口(比如私有地址和tuRn服务器地址)。
采用此框架可以完美解决voip中媒体传输中遇到的nat 及防火墙问题,而信令穿越则需要另一套机制,过去人们提出了多种处理nat问题的方案,但都有局限性,采用ice则完全解决了这些问题,ice的另一个特点时能够通过一定机制检测nat类型,从而决定采用何种方案处理,比如对于大多数呼叫,媒体可能直接用p2p方式即可,而有些方案可能不论什么nat类型都用media-relay方式,这种方式增加了端到端延时及丢包概率。
stun和turn都是client/server协议,说白了就是客户端向服务器要自己的公网地址及端口,然后放在自己invite请求的sdp消息体及对invite的200oksdp消息体中。
大多数sip客户端和服务器支持stun协议,所以都有一定缺陷。
/perfectpdl/article/details/763 6067tuRn协议深入剖析概括一下:若一个主机位于nat后面,那么在特定的环境下,它不可能跟其他主机通信。
这种情况下,这台主机有必要通过一个转发的主机来实现通信。
有种协议叫tuRn,允许主机通过转发来和其他主机通信。
ICE简单介绍及使用示例

ICE简单介绍及使用示例1、ICE是什么?ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够以最小的代价构建分布式应用程序。
ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数等。
2、为什么会有ICE?ICE是分布式应用的一种比较好的解决方案,虽然现在也有一些比较流行的分布式应用解决方案,如微软的.NET(以及原来的DCOM)、CORBA及WEB SERVICE 等,但是这些面向对象的中间件都存在一些不足:.NET是微软产品,只面向WINDOWS系统,而实际的情况是在当前的网络环境下,不同的计算机会运行不同的系统,如LINUX上面就不可能使用.NET;CORBA虽然在统一标准方面做了很多的工作,但是不同的供应商实现之间还是缺乏互操作性,并且目前还没有一家供应商可以针对所有的异种环境提供所有的实现支持,且CORBA的实现比较复杂,学习及实施的成本都会比较高;WEB SERVICE最要命的缺点就是他的性能问题,对于要求比较高的行业是很少会考虑WEB SERVICE的。
ICE的产生就是源于.NET、CORBA及WEB SERVICE这些中间件的不足,它可以支持不同的系统,如WINDOWS、LINUX等,也可以支持在多种开发语言上使用,如C++、C、JAVA、RUBY、PYTHON、VB等,服务端可以是上面提到的任何一种语言实现的,客户端也可以根据自己的实际情况选择不同的语言实现,如服务端采用C语言实现,而客户端采用JAVA语言实现,底层的通讯逻辑通过ICE的封装实现,我们只需要关注业务逻辑。
3、ICE是如何工作的?Ice 是一种面向对象的中间件平台,这意味着 Ice为构建面向对象的客户-服务器应用提供了工具、API 和库支持。
Ice通信框架简介解析

slice2py
示例演示
。。。
ICE在500wan的应用
消息中心
个人中心最新动态 (php->python) 数据库执行日志 (php->python) 告警平台 (icestorm 订阅方式)
ICE的应用(续)
账务中心 交易服务器
目前500wan核心交易都已经全部移植到ICE通 信平台上 开发语言:C++ 客户端php 稳定性,效率 表现不错
网络编程相关
进程/线程模式 进程线程的管理
one per request 预fork 线程的监控,重生
数据的共享 互斥 同步
共享内存 管道 信号量
网络编程相关(续)
队列等常用数据结构 锁 同步 互斥
ICE方式的编程
Slice 接口 不需要我们再去编解码,定义复 杂的socket协议 Leader/follow 线程池 不需要我们再去管理 线程,任务调度 本身epoll select 模型 简化了通信模型 内置的互斥 同步处理库 我们只需要关注于我们的业务,面向接口 编程
SLICE语言
客户端与服务器之间接口协议,描述应用 程序互相通信所使用的各种类型及对象接 口 由编译器编译特定语言的类型定据类型 枚举,结构体,序列,字典 异常。。。 具体可以参考手册
Slice示例-过关服务
module GuoguanService { interface Lottery { void doGuoguan(int lotid, string expect, string opencode); void doUpdate(int lotid, string expect); string getStatus(int lotid); string postXml(int lotid, string expect); string postExpect(int lotid, string expect); string sendMsg(int lotid, string expect,string openCode); string doCompare(int lotid, string expect); void restart(); void shutdown(); }; };
ice协议看明白

竭诚为您提供优质文档/双击可除ice协议看明白篇一:基于stun,turn,ice协议的nat穿越基于stun,turn,ice协议的nat穿越分类:Voiptech20xx-10-0820:23115人阅读评论(0)收藏举报stun,turn,ice协议概述stun,turn,ice是ietf提出的处理voip网络中nat穿越问题的协议族。
stun可以处理大部分nat问题,turn是stun协议的一个增强版,专用于处理对称形nat问题,而ice则是综合stun 及turn的产物,是一个框架,综合运用stun和tuRn的结构,它提供可靠的Voip或视频通话配置以及媒体传输,通过一个sip供给/应答模型供端点交换多个候选ip地址和端口(比如私有地址和tuRn服务器地址)。
采用此框架可以完美解决voip中媒体传输中遇到的nat 及防火墙问题,而信令穿越则需要另一套机制,过去人们提出了多种处理nat问题的方案,但都有局限性,采用ice则完全解决了这些问题,ice的另一个特点时能够通过一定机制检测nat类型,从而决定采用何种方案处理,比如对于大多数呼叫,媒体可能直接用p2p方式即可,而有些方案可能不论什么nat类型都用media-relay方式,这种方式增加了端到端延时及丢包概率。
stun和turn都是client/server协议,说白了就是客户端向服务器要自己的公网地址及端口,然后放在自己invite请求的sdp消息体及对invite的200oksdp消息体中。
大多数sip客户端和服务器支持stun协议,所以都有一定缺陷。
/perfectpdl/article/details/763 6067tuRn协议深入剖析概括一下:若一个主机位于nat后面,那么在特定的环境下,它不可能跟其他主机通信。
这种情况下,这台主机有必要通过一个转发的主机来实现通信。
有种协议叫tuRn,允许主机通过转发来和其他主机通信。
ice是什么软件

Ice是什么软件Ice 是一种高效的网络通信框架,用于分布式系统中的对象间通信。
它提供了强大的网络传输和服务调用机制,使得不同语言和平台间的分布式通信变得简单而可靠。
本文将对 Ice 软件进行介绍,包括其基本原理、主要特性和应用领域。
基本原理Ice(Internet Communications Engine)最早由 ZeroC 公司开发,是一种基于RPC(Remote Procedure Call,远程过程调用)的分布式对象通信框架。
RPC 是一种编程模式,允许应用程序通过网络调用远程计算机上的函数或方法,而不需要了解底层的网络细节。
在 Ice 中,远程对象被定义为接口(interfaces),接口中包含了一组方法的签名(signatures)。
通过在接口上定义服务端和客户端的操作,可以实现对象间的远程调用。
Ice 框架提供了一种 IDL(Interface Definition Language,接口定义语言)来描述接口和数据类型。
IDL 文件经过编译器处理后,可以生成不同语言的代码,因此可以在不同的编程语言中使用 Ice 框架。
主要特性Ice 提供了许多强大的特性,使得分布式通信变得简单而可靠:强类型接口Ice 使用 IDL 来定义接口,通过编译器生成强类型的接口代码。
这意味着在编译时就可以检查接口的正确性,避免了在运行时发生的类型错误。
平台独立性Ice 框架支持多种编程语言,包括 C++, Java, Python 等。
这使得开发人员可以根据自己熟悉的编程语言来使用 Ice,而不需要关心底层的网络通信细节。
灵活的网络传输Ice 支持多种传输协议,包括 TCP、UDP、SSL 等。
可以根据具体需求选择适合的传输协议,并且可以在运行时动态切换协议。
内置的容错机制Ice 提供了丰富的容错机制,包括超时、重试、故障转移等。
在网络不稳定或出现故障的情况下,Ice 可以自动处理通信失败并进行恢复,保证分布式系统的稳定性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参考《Ice分布式程序设计》马维达译
一、客户与服务器的结构
Ice 客户与服务器内部的逻辑结构如下图所示:
客户与服务器都由这样一些代码混合而成:应用代码、库代码、根据Slice 定义生成的代码:
●Ice 核心为远地通信提供了客户端和服务器端运行时支持。
其中的大量代码
所涉及的是网络通信、线程、字节序,以及其他许多与网络有关的问题,我们的应用代码应该与这些问题隔离开来。
●代理代码是根据你的Slice 定义生成的。
如果你调用代理的某个函数,就会
有一个RPC 消息被发给服务器,调用服务端目标对象上的某个对应的函数。
在上文中提到,如下客户代码中,PrinterPrx代理类是由slice2java命令编译printer.ice文件生成的,
Ice.ObjectPrx base = ic
.stringToProxy("SimplePrinter:default -p 10000"); PrinterPrx printer = PrinterPrxHelper.checkedCast(base);
printer.printString("Hello World!");
当调用printer代理中的printString方法,客户会发送RPC消息,调用服务器上PrinterI类对象中的printString方法。
要想与某个Ice 对象联系,客户必须持有这个对象的代理。
对客户而言,代理就是Ice 对象的代表(该对象可能在远地)。
一个代理充当的是一个Ice 对象的本地大使,客户端中PrinterPrx代理对象就是PrinterI类在客户端的本地的大使。
当客户调用代理上的操作时,Ice run time 会:
1.定位Ice 对象
2.如果Ice 对象的服务器没有运行,就激活它
3.在服务器中激活Ice 对象
4.把所有in 参数传送给Ice 对象
5.等待操作完成
6.把所有out 参数及返回值返回给客户(或在发生错误的情况下抛出异常)
代理封装了完成这一系列步骤所必需的全部信息。
特别地,代理包含有:
●寻址信息:用于让客户端run time 联系正确的服务器
●对象标识:用于确定服务器中的哪一个对象是请求的目标
●可选的facet 标识符:用于确定代理所引用的是对象的哪一个facet
●骨架代码也是根据你的Slice 定义生成的,因此,与你用Slice 定义的对象
和数据的类型是对应的。
骨架代码是客户端代理代码的服务器端等价物:它提供了向上调用接口,允许Ice runtime 把控制线程转交给你编写的应用代码。
●对象适配器是专用于服务器端的Ice API 的一部分:只有服务器才使用对象
适配器。
对象适配器有若干功能:
1、对象适配器把来自客户的请求映射到servant对象上的特定方法。
换句话说,对象适配器会跟踪在内存中,都有哪些servant,其对象标识又是什么。
对象适配器与一个或多个传输端点关联在一起。
servant就是服务器开发者编写的类,客户端发送的请求,最终调用的是servant实例上的方法。
如上文中的服务端代码片段,
Ice.ObjectAdapter adapter =
ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -p 10000");
端点“default -p 10000”与adapter适配器绑定,
串“SimplePrinterAdapter”代表适配器的名称。
如果与某个适配器关联的传输端点不止一个,你可以通过多种传输机制到达在该适配器中的servant。
例如,为了提供不同的服务质量和性能,你可以把一个TCP/IP 端点和一个UDP 端点与一个适配器关联在一起。
2、对象适配器要负责创建可以传给客户的代理。
对象适配器知道它的每个对象的类型、标识,以及传输机制的详细情况,并且会在服务器端应用代码要求创建代理时在其中嵌入正确的信息。
每个对象适配器都维护有一个叫作活动servant 映射表(active servant map)的数据结构。
活动servant 映射表(简称为ASM)是一个查找表,用于把对象标识映射到servant。
当客户把操作调用发给服务器时,请求的目标是特定的传输端点。
传输端点隐含地标识了请求所针对的对象适配器(因为同一个端点只能绑定到一个对象适配器)。
客户藉以发送请求的代理含有对应的对象的标识,客户端run time 会在线路上随调用一起发送这个对象标识。
对象适配器继而使用这个对象标识、在它的ASM 中查找正确的servant,把调用分派给它。
如上文中的服务端代码片段:
Ice.Object object = new PrinterI();
adapter.add(object,
Ice.Util.stringToIdentity("SimplePrinter"));
Add方法将object对象注册到adapter适配器中,并使用串“SimplePrinter”创建一个对象标识,这样在适配器的ASM表中就有了一个
以串“SimplePrinter”标识的servant对象object。
在客户端代码中,使用串"SimplePrinter:default -p 10000"创建PrinterI在客户端的代理对象,串“default -p 10000”即代表适配器,串“SimplePrinter”即为ASM表中的对象标识,当客户端使用代理对象调用PrinterI上的printString方法时,就可以在ASM中定位到对应的对象。
二、Slice(Ice 规范语言)简介
每个Ice 对象都有一个接口,该接口具有一些操作。
接口、操作,还有在客户及服务器间交换的数据的类型,都是用Slice 语言定义的。
如上文中的printer.ice文件:
module demo {
interface Printer {
void printString(string s);
};
};
Slice 允许你以一种独立于特定编程语言(比如C++ 或Java)的方式定义客户-服务器的合约。
Slice 定义由一个编译器编译成特定编程语言的API,也就是说,与你所定义的接口和类型对应的那一部分API,会由生成的代码组成。
1. 客户和服务器使用相同的开发环境
编写任何Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所用的各个接口。
下图说明客户和服务器都用C++ 开发的情况。
Slice 编译器根据源文件Printer.ice 中的Slice 定义生成了两个文件:一个头文件(Printer.h)和一个源文件(Printer.cpp)。
下图说明客户和服务器都用java 开发的情况。
Slice 编译器根据源文件Printer.ice 中的Slice 定义生成了若干个文件,这些主要分成两部分,一部分是客户端程序依赖的类文件,一部分是服务端程序依赖的类文件。
Slice
开发者Printer.ice Slice-to-Java
编译器
_PrinterDel.java _PrinterDisp.java
_PrinterDelD.java PrinterPrx.java PrinterPrxHolder.java _PrinterOperationsN C.java
Printer.java
PrinterHolder.java
_PrinterOperations.
java
_PrinterDelM.java PrinterPrxHelper.java 客户端
开发者服务端
开发者
java
Ice Run-
Time 库
客户端
可执行程序
服务端可执行程序Client.java Server.java RPC
2. 客户和服务器使用不同的开发环境
如果客户和服务器是用不同的语言开发的,它们不能共享任何源文件或二进制组件。
例如,用Java编写的客户不能包括C++头文件。
下图说明客户用Java编写,而对应的服务器用C++编写的情况。
在这种情况下,客户和服务器开发者是完全独立的,分别使用自己的开发环境和语言映射。
客户和服务器开发者之间的唯一链接是它们各自使用的Slice 定义。