1、ICE协议由三部分组成:<o:p></o:p>
1)数据编码规范,用来进行各种数据类型的序列化。<o:p></o:p>
2)客户端与服务器端的交互的消息类型,以及在何种情况下应发出何种消息的规范。<o:p></o:p>
3)客户端与服务器端如何协商二者所用协议及编码版本的规范。<o:p></o:p>
2、数据编码规范:<o:p></o:p>
1)数值类型的编码是little-endian(x86的都是这个,所以基本上不用管了,除非你用Mac...)。即0x12345678存放在内存中是0x78 0x56 0x34 0x12。<o:p></o:p>
2)size,数据长度(string)或者数据计数(sequence):若长度或计数小于255,则用一个byte来表示,如果大于等于255,则用1byte+1int(共五个byte)来表示,其中第一个byte值为255。即:若长度或者计数为254,则size为0xFE,若长度或者计数为256,则size为0xFF 0x01 0x00 0x00 0x00。<o:p></o:p>
3)数据封装:数据封装是指将某可变长度的未知数据及其相关信息(大小、编码版本等)打包成一个单元包。其结构如下:<o:p></o:p>
struct Encapsulation {<o:p></o:p>
int size; //整包的长度<o:p></o:p>
byte major; //编码的主版本号<o:p></o:p>
byte minor; //编码的次版本号<o:p></o:p>
// [... size - 6 bytes ...] 数据,长度可为0(size值为6)<o:p></o:p>
};<o:p></o:p>
4)Slices:考虑到Exception和Class到达接收端后,由于接收端仅理解其部分信息(比如只有父类型定义而无子类型定义),因此Exception和Class的编码也具有一定的层次性,每一个继承层次的数据编码叫做一个slice。每个slice由一个int型(slice的总size)+数据组成。接收端接收到数据进行解码时,可以通过slice的size,直接由当前的slice跳转定位到下一个slice。<o:p></o:p>
5)基本类型:<o:p></o:p>
bool 1字节 1为true,0为false<o:p></o:p>
byte 1 字节<o:p></o:p>
short 2字节<o:p></o:p>
int 4字节<o:p></o:p>
long 8字节<o:p></o:p>
float 4字节 IEEE标准 23位小数,8位指数,1位标志<o:p></o:p>
double 8字节 IEEE标准 52位小数,11位指数,1位标志<o:p></o:p>
6)string 字符串:字符串由一个size和一串UTF-8编码的数据组成,size见2),字符串不是以NULL结束的。空字符串的size为0。<o:p></o:p>
7)sequence 序列:序列由一个size和一系列按各自类型编码的数据组成,size见2)。<o:p></o:p>
8)dictionary 字典: 字典由一个size和一系列键值对编码的数据组成,size见2),键值对是一个struct的数据结构,这个数据结构有两个成员,一个是key,一个是value。<o:p></o:p>
9)enumerator 枚举:枚举数据的编码是由其定义的枚举个数决定的,如果枚举个数在1-127之间,每个枚举值为一个byte,若个数在128-32767之间,其值为short,大于32767的,其值为int。<o:p></o:p>
10)structure 结构:结构中的每个元素,依次按各自的类型编码,按各自在声明中的位置排列。<o:p></o:p>
11)exception 异常:异常是由以下几部分组成:<o:p></o:p>
Uses Classes (bool) 是否存在后面的Class instances<o:p></o:p>
Type ID(string) Type ID和下面的Slice for members是一组的,一个Exception中可能存在多组。<o:p></o:p>
//Slice for members……<o:p></o:p>
//Class instances(optional) 指Exception引用或者间接引用的Class实例的编码。<o:p></o:p>
首先Exception第一个字节是一个bool类型,标志是否Exception包括有Class实例的编码,若有的话,在Exception的尾部会有Class实例的编码。紧接着是一系列的键值对,键为Type ID(string),值为Type ID所对应的member编码(slice)。这些键值对的排列顺序是按先子类后父类,每个slice中的member排列顺序是按其类定义中的顺序。接在键值对后面的是Class实例编码。<o:p></o:p>
举个例子,看下面这个Exception类层次(member后面括号中为假定值):<o:p></o:p>
exception Base {<o:p></o:p>
int baseInt; (99)<o:p></o:p>
string baseString; (”Hello”<o:p></o:p>
};<o:p></o:p>
exception Derived extends Base{<o:p></o:p>
bool derivedBool; (true)<o:p></o:p>
string derivedString; (”World!”)<o:p></o:p>
double derivedDouble;(3.14)<o:p></o:p>
};<o:p></o:p>
其编码后的数据为:<o:p></o:p>
0x0 (不存在Class实例的引用)<o:p></o:p>
0x10 “::Derived” (Type Id string的长度及内容)<o:p></o:p>
0x14 0x00 0x00 0x00(slice的长度)<o:p></o:p>
0x1(derivedBool)<o:p></o:p>
0x7 “World!” (derivedString的长度及内容)<o:p></o:p>
3.14D (derivedDouble,占8字节)<o:p></o:p>
0x7 “::Base” (Type Id string的长度及内容)<o:p></o:p>
0x0E 0x00 0x00 0x00(slice的长度)<o:p></o:p>
0x99 0x00 0x00 0x00(baseInt)<o:p></o:p>
0x06 “Hello” (baseString的长度及内容)<o:p></o:p>
当接收端接收到这数据时,会首先取第一个字节,判断是否需要解码Class实例(上面这个例子没有),然后会检查第一个Type ID(::Derived)。如果接收端拥有这个Type的定义,则它会将其解码,如果接收端没有这个Type的定义,它可以根据Slice的长度size,跳过这个Type的Slice,处理下一个Type的Slice,直到所有的Type ID都处理完。如果接收端不识别所有的Type,则会抛出一个MarshalException异常(这种情况往往是由于Client和Server各自采用不同的定义文件造成的)。<o:p></o:p>
若Exception包括有Class实例的编码,其编码规则按Class的规则来处理。
分享到:
相关推荐
ICE协议文档是一份由互联网工程任务组(IETF)发布的标准协议文档,其核心是关于交互式连接建立(Interactive Connectivity Establishment, ICE)的内容。文档的作者是J.Rosenberg,文档编号RFC5245,发布于2010年4月...
在Python中,使用ICE协议时,通常需要以下步骤: 1. **安装ICE**: 首先,你需要通过官方的下载页面获取最新版本的ICE,并按照文档指示安装到你的系统中。安装完成后,需要将ICE的库路径添加到PYTHONPATH环境变量中...
ice中间件是一个和CORBA同样强大却摒除了CORBA的缺陷的...ICE协议定义了客户和服务器通信的规则。本文使用Pi演算描述分析ICE协议, 从交互过程和协议实体两方面对协议进行了刻画, 揭示其并发、 分布的对象计算特征。
ICE协议是为了解决P2P(点对点)通信中遇到的网络障碍而设计的。在P2P通信中,由于NAT的存在,直接的端到端连接可能无法建立。ICE通过结合多个候选的传输路径,包括本地IP地址、公共IP地址以及NAT映射的地址,来尝试...
ICE101协议是电力行业中一种常用的远动协议,主要用于远动设备及系统的传输规约。该协议的格式、特点、使用方法和实例将在下面详细介绍。 一、基本概念 ICE101协议是电力行业标准ICE60870-5-101的实现,主要用于...
该项目提供了ICE协议的Java实现,该协议可由SIP和XMPP应用程序使用。 该项目还提供了套接字共享等功能,并支持Pseudo TCP。 ice4j由社区维护。 使用Jitsi的进行问题和讨论。 谢谢 该项目的工作由慷慨资助。 谢谢!
需要注意的是,这些第三方产品的授权协议需要用户自行查看和遵守。 在ICE的基础概念部分,文档首先对ICE架构进行了综述,介绍了ICE服务以及ICE在架构上提供的优势。此外,还通过与CORBA的对比,进一步阐述了ICE的...
在Java编程环境中,ICE(Integration Communication Environment)是一种用于构建分布式应用程序的中间件,它提供了丰富的接口和工具,使得开发者能够方便地实现跨平台的通信。这个"用JAVA写的ICE小例子(类似聊天室...
《冈萨雷斯数字图像处理MATLAB版源码:ICE源码解析》 在计算机科学领域,数字图像处理是一项至关重要的技术,广泛应用于医学影像、遥感、机器视觉等多个领域。MATLAB作为强大的数学计算和数据分析工具,是进行图像...
本文档描述了一个用于网络地址转换器(NAT)遍历的协议,即 Interactive Connectivity Establishment(ICE),该协议用于 UDP 基础的多媒体会话建立,使用offer/answer 模型。ICE 协议利用了 Session Traversal ...
它通过抽象掉底层网络细节,如协议栈、序列化/反序列化过程以及错误处理机制,使开发者能够专注于业务逻辑的编写。这种设计使得Ice在多个领域得到了广泛应用,包括游戏、金融、医疗、科研等。 #### 1.2 Internet ...
在电力自动化领域,ICE104规约是一种广泛使用的通信协议,主要用于远程终端单元(RTU)和主站之间的数据交换。ICE104规约是IEC60870-5-104标准的简称,它规定了如何在以太网环境下进行远动通信,包括遥测、遥信、...
ICE,全称Interactive Connectivity Establishment,是一种中间件技术,主要用于分布式系统中的对象通信。它由ZeroC公司开发,提供了一种高效、安全且跨平台的通信框架,广泛应用于软件开发,尤其是在需要不同系统间...
ZeroC Ice 3.7 手册 Ice(Internet Communications Engine)是ZeroC公司的杰作,继承了CORBA的血统,是新一代的面向对象的分布式系统中间件。Ice是RPC通讯领域里最稳定、强大、高性能、跨平台、多语言支持的老牌开源...
ICE的服务协议是基于其自定义的二进制协议,旨在提供高效的数据传输。此外,ICE还支持HTTP tunneling,可以在防火墙后进行通信。了解这些协议的工作原理和配置方法对于优化ICE应用的网络性能至关重要。 在实际开发...
2. **二进制协议**:ICE使用高效的二进制协议进行通信,提高了数据传输速度和网络性能。 3. **接口定义语言(IDL)**:ICE使用称为“Slice”的接口定义语言来描述服务接口, Slice文件可以被编译成不同语言的客户端...
这些库文件包含了ICE的核心组件,如通信协议、序列化机制、多线程支持等,使得开发者能够方便地在自己的应用中集成ICE的功能。 工具集(tools)是ICE开发中的辅助工具,包括编译器插件、配置工具、测试工具等。例如...
coturn 服务器完整的实现了 STUN/TURN/ICE 协议,支持 P2P 穿透防火墙。主要用于 webrtc 等点对点视频音频通话。 coturn 支持 tcp, udp, tls, dtls 连接;支持 linux bsd solaris mac os, 暂不支持windows
开发者Michi Henning可能会讲解ICE的核心概念,如代理(Proxy)、骨架(Skeleton)、ICE接口(ICE Interface)和ICE协议,同时引导读者理解ICE如何实现服务发布和订阅,以及客户端和服务端之间的通信流程。...
- **多协议支持**:除了TCP/IP,Ice还支持UDP和其他自定义协议,适应不同的网络环境需求。 - **身份验证与授权**:内置的身份验证和授权机制提供了一层安全保障,保护了通信过程中的数据安全。 - **负载均衡与...