`
isiqi
  • 浏览: 16562155 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论
阅读更多

1.通信协议的概念及其要素 在OSI开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。发送方N层实体从N+1层实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。N层实体只将其视为需要本实体提供服务的数据,将服务数据单元进行封装,使其成为一个对方能够理解的数据单元(Protocol Data Unit,PDU),封装过程实际上是为SDU增加对等实体间约定的控制信息(Protocol Control Information,PCI)的过程。 为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇。 网络协议的分层有利于将复杂的问题分解成多个简单的问题,从而分而治之。各层的协议由各层的实体实现,通信双方对等层中完成相同协议功能的实体称为对等实体。对等实体按协议进行通信,所以协议反映的是对等层的对等实体之间的一种横向关系,严格地说,协议是对等实体共同遵守的规则和约定的集合。 通信协议精确地定义了双方通信控制信息和解释信息:发送方能将特定信息(文本、图片、音频、视频)按协议封装成指定格式的数据包,最终以串行化比特流在网络上传输;接收方接收到数据包后,根据协议将比特流解析为本地化数据,从而获取对方发送过来的原始信息。 通信协议包括三个要素: (1)语法:规定了信息的结构和格式; (2)语义:表明信息要表达的内容; (3)同步:规则涉及双方的交互关系和事件顺序。 整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet互联网的核心协议。 2.通信协议开发步骤 (1) 协议的开发主要包括协议设计、协议形式描述、协议实现和协议一致性测试。协议的开发过程与步骤如图1所示。 图1 协议开发过程与步骤 (2) 协议设计过程中的分组发送接收模型如图2所示。 图2协议设计过程中的分组发送接收模型 (3)协议的一致性测试 协议的一致性测试是指测试协议能否按照预想的控制策略实现正确的通信,主要体现在数据包通过信道从信源传送到信宿后,信宿能够根据协议正确的解析出原始信息。 协议的一致性测试如图3所示。 图3 协议一致性测试环境 根据测试环境的可以分为局部测试和分布式测试,如图4所示。 图4局部测试法、分布式测试法 3.数据包和数据报 为方便描述自定义协议,还是借用数据包和数据报来描述封装数据单元和传输数据单元,但这里的数据包和数据报完全不同于TCP/IP架构中的Packet和Datagram概念。 下文所述的数据包指封装的基本单位,以TLV(Type-Length-Value)格式封装基本消息单位;数据报Package是传输的基本单位,头部包含序列号和命令信息。接收端根据命令信息分辨事件类型,做出不同的解析。报文实体是多个TLV数据包组成的链表。 4.数据包TLV的设计 从应用层HTTP协议,到超文本置标语言HTML(HyperText Mark-up Language),再到可扩展置标语言XML(Extensible Markup Language),它们提供了数据的格式化存储、传输和格式化显示的规范,是网络通信的基石。然而HTTP协议以及HTML/XML置标语言的本质就是定义一堆标签(Tag)对数据进行串行化序列化,然后接收方再根据标签解析、还原数据。 自定义通信协议的关键是对数据包的合理构造(construct)和正确解析(parse),即制定编解码规则。 抽象语法标记ASN(Abstract Syntax Notation) BER的长度确定的编码方式,由3部分组成Identifier octets、Length octets和Contents octets,实际上这就是一中TLV(Type-Length-Value)模型:类型字段(Type或Tag)是关于标签和编码格式的信息;长度字段(Length)定义数值的长度; 内容字段(Value)表示实际的数值。 因此,一个编码值又称TLV三元组。编码可以是基本型或结构型,如果它表示一个简单类型的、完整的显式值,那么编码就是基本型(primitive);如果它表示的值具有嵌套结构,那么编码就是结构型 (constructed)。 TLV编码就是指对Type(Tag)、Length和Value进行编码,形成比特流数据包;解码是编码的逆过程,是从比特流缓冲区中解析还原出原始数据。 采用C++编程语言设计TLV协议类,其类视图如图5所示。 图5 CTLV类视图 目前只提供设置整形值(int型)的setValue_Int和设置字符串值(C_String型)的SetValue_Cstring两个接口。 TLV将数据封装成包的格式如表1所示。 表1 TLV包格式 TLV包 头部 包实体 m_dwTag m_nLen m_pValue TLV的接口说明: (1)值类型标签m_vtTag是内部辅助枚举变量,它根据构造TLV时传递的服务类型标签m_dwTag来确定。 (2)TLV::m_nLen在为TLV设置具体值时确定。 (3)TLV包的封装: 1)使用Tag参数创建一个TLV对象后,调用TLV::setValue_*方法为TLV填充具体值; 2)调用TLV::toBuffer方法打包到缓冲区streamBuffer。 (4)TLV包的解析:创建一个TLV对象后,调用TLV::fromBuffer方法从缓冲区streamBuffer解析出TLV。 (5)封装和解析涉及到本机字节顺序和网络字节顺序的转换问题。 (6)调用TLV::setValue_*方法填充TLV时,统一字节边界数为4。 5.数据报Package的设计 不同于底层的数据包/数据报只是对数据层次的封装解析,实际应用程序是以事件驱动的,因此必须注册不同的信令(事件类型标签),然后填充到数据报中。接收端根据信令做出相应的事件处理。 例如在C/S通信系统中,客户端往往要先登录,通过服务器端的校验才能进行后续通信。因此客户端运行后,需要构造并向服务器端发送含有LOGIN信令的包含用户名字符串strUserName和密码字符串strPassWord的数据报;服务器端解析LOGIN信令后做校验处理,然后发送含有LOGIN_RESPONSE信令和校验结果的回执数据报给客户端。 采用C++编程语言设计Package类,其类视图如图6所示。 图6 CPackage类视图 Package类将TLV封装成包的格式如表2所示。 表2 Package包格式 Package包 头部 序列号 包实体 m_nCmdLen m_dwCmdID m_dwCmdState m_nSeqNo Count*Tlv Package的接口说明: (1)Package::m_nCmdLen是整个Package包的长度,将其作为首个字段的好处在于当传送大数据包时,接收方可以根据数据长度来控制读状态,从而将一个大数据包分批接收。 (2)Package::m_nCmdLen在构造函数中初始化为16,在调用Package::addTLV方法填充包实体时增长。 (3)Package包的封装: 1)创建Package对象后,调用Package::setHeader方法填充头部信令; 2)创建TLV对象并填充数据,再调用Package::addTLV方法填充包实体; 3)调用Package::toBuffer方法将Package打包到缓冲区streamBuffer。 (4)Package包的解析: 1)先创建一个Package对象,调用Package::fromBuffer方法从缓冲区streamBuffer先解析出Package的头部和序列号,再从剩余缓冲区中解析出TLV并将其串行化到链表。 2)调用Package::getTLV方法根据Tag从链表中查找具体TLV包,再调用TLV::getValue方法取得具体值。 (5)Package::toBuffer方法和Package::fromBuffer方法主要遍历Package::m_TLV_List列表,然后调用TLV::toBuffer方法和TLV::fromBuffer方法解析出TLV数据单元。 TLV数据包的功能测试(主要是本地测试) 鉴于实际通信数据最后都要转换成比特流,故只测试发送字符串类型的变量,仅测试协议能否正确打包、解析。其他类型的普通数据都可以转换成字符串传输,最后,接收方根据m_dwTag确定值类型m_vtTag,解析出具体值。 对TLV::setValue_C_String方法填充TLV的测试,需要考虑字节对齐问题。对于长度为4字节倍数的C状态字符串,打包时省去末尾的‘\0’结束标志符。需要测试长度非4倍数的字符串和长度为4倍数的字符串。 经本地测试,调用TLV::setValue_Int方法和TLV::setValue_C_String方法构造整形和字符串时,能够正确封装、正确解析。 Package数据报的功能测试,主要是将TLV组合成包,然后添加信令,完成特定的通信。对登陆LOGIN和发送消息SUBMIT_SM的测试表明Package协议能正确封装、正确解析。 在实际项目中使用Package通信协议,对于稍大一点的数据块需要控制好读的步骤,以便能接收整包完整的信息

分享到:
评论

相关推荐

    呕心沥血的java复杂聊天室(包括自定义应用层协议、CS多线程、多客户端登录、上下线提醒等等)

    Java复杂聊天室是一个涵盖多个关键技术点的项目,其中包括自定义应用层协议的设计、客户端-服务器(CS)架构下的多线程编程以及实现多客户端登录与上下线提醒功能。以下是对这些知识点的详细解释: 1. **自定义应用层...

    自定义串口数据通信协议的分析与设计

    ### 自定义串口数据通信协议的分析与设计 #### 一、引言 随着计算机技术的发展,串行通信作为一种常见的数据传输方式,在多种应用场景中扮演着重要的角色。特别是在需要进行实时数据交换的情况下,例如双机短信...

    基于UDP的广播系统中应用层通信协议的设计与实现

    【基于UDP的广播系统中应用层通信协议的设计与实现】 在现代信息技术的推动下,多媒体教学已经成为高等教育的重要组成部分。为了高效地传递多媒体信息,如幻灯片、图像、动画、音频和视频,以及同步控制指令,开发...

    自定义串口文件传输通信协议

    ### 自定义串口文件传输通信协议 #### 一、引言 随着计算机技术的发展,串行通信作为一种简单有效的数据传输方式被广泛应用。特别是在工业控制、远程监控等领域,串行通信接口(例如RS232)成为了重要的通信手段之...

    基于自定义应用层协议的分布式智能控制系统.pdf

    本文详细介绍了基于自定义应用层协议的分布式智能控制系统的设计与实现,重点在于解决宽带数字化接收系统规模增大带来的控制问题。该系统通过在分布式网络节点中部署自定义协议,确保了主控终端与各节点间指令和数据...

    winsock socket网络通信_解决粘包问题.zip

    文档"自定义应用层通信协议TLV type length value 自定义数据包格式.doc"提到了一种常见的解决方案——TLV(Type-Length-Value)协议。在TLV协议中,每个数据包由三部分组成:类型(T)、长度(L)和值(V)。类型...

    C实现基于Socket实现自定义协议通信

    本教程主要聚焦于如何使用C语言实现基于Socket的自定义协议通信,涵盖了客户端和服务端的实现。我们将深入理解Socket编程的基本概念,学习如何创建、连接、监听Socket,并探讨如何设计和实现自定义的数据传输协议。 ...

    Verilog串口之UART自定义应用层协议SLink.rar

    基于 Verilog HDL 编写的 UART 串口自定义协议 SLink 源程序,实现数据帧通信。 程序说明详见: https://blog.csdn.net/poetryTang/article/details/107671587

    Mina自定义协议通信的示例

    - 编码器:负责将应用层的对象转化为二进制数据流,根据协议结构添加报头,处理正文编码,并确保数据正确格式化。 - 解码器:从接收到的字节流中解析出报头,根据报头信息提取正文,并转换回应用层的对象。处理...

    自定义类QQ应用层协议,不同用户之间的在线交互

    TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保数据的正确传输。 在设计类QQ应用层协议时,我们需要考虑以下几个关键点: 1. **用户身份验证**:登录和退出功能是任何聊天应用的...

    网络游戏-基于深度循环神经网络的应用层通信协议识别的方法.zip

    本文将深入探讨一种基于深度循环神经网络(Deep Recurrent Neural Networks, DRNNs)在应用层通信协议识别中的方法,这对于优化网络性能、保障网络安全以及提升游戏体验具有重要意义。 网络游戏的通信协议识别是...

    串口通信协议的制定方法

    因此,为了充分发挥串口通信的优势,设计一个合适的应用层通信协议至关重要。 #### 制定串口通信协议的考虑因素 1. **项目应用特性**: - **实时控制与信息需求**:项目侧重实时控制还是实时信息传递? - **数据...

    用Wireshark解析自定义协议

    在通信领域,自定义协议是为特定应用或系统设计的通信规则,不同于标准的TCP/IP协议栈中的HTTP、FTP、DNS等通用协议。这些协议通常由开发者根据实际需求定制,以实现更高效的数据传输或者满足特殊的安全需求。 ...

    飞控通信协议、匿名地面站

    4. 网络层协议:在多无人机系统中,飞控通信协议可能还需要处理网络层的问题,如地址分配、路由选择等,以便无人机能够有效地在多个地面站之间进行通信。 匿名地面站,顾名思义,是一种没有特定身份标识的地面控制...

    通信软件V1.0(自定义通信协议)

    自定义通信协议允许开发者摆脱预设的通用协议(如TCP/IP或HTTP)的限制,根据应用的具体需求设计更加精细化的数据交换规则。例如,该协议可能包含特定的报文格式、错误处理机制、加密算法等,以适应通信软件中的登录...

    基于扩展帧格式的CAN较高层通信协议设计

    在进一步提高通信效率、扩展通信功能的不断需求推动下,基于扩展帧格式的CAN较高层通信协议应运而生,本文将从技术规范、协议设计、应用场景三个方面详细解读这项技术。 在技术规范层面,扩展帧格式的定义为CAN通信...

    基于STM32F103ZET6的自定义通信协议电梯监控系统设计.pdf

    RS485是一种常用的物理层通信协议,具有远距离传输和多设备连接的优点。通过RS485,可以实现电梯监控终端与中央服务器或云平台间的可靠通信。 6. 云计算平台与数据管理: 电梯监控系统的监测服务平台将电梯的状态和...

    基于应用层自定义消息驱动的面向对象通用C/S应用程序框架

    标题中的“基于应用层自定义消息驱动”指的是该框架的核心设计是通过应用层自定义的消息传递机制来协调各个组件之间的交互。这种设计使得系统更加灵活,可以处理多种类型的数据,同时允许开发者根据需求定制消息处理...

    如何设计一个通信协议.docx

    设计自定义通信协议时,我们可以根据实际需求简化上述模型,例如对于简单的数据传输,可能只需要物理层、数据链路层和应用层。在数据链路层,可以根据实际情况选择适合的协议,如以太网协议,它定义了帧的结构和MAC...

    火灾自动报警系统数据输出通信协议_采用RS485协议.pdf

    1. 应用层概述:应用层规定与具体应用相关的通信协议。 2. 通信方式:火灾报警控制器有火灾、故障等信息时,通过RS485发送信息。平时会每隔2S发送一条心跳信息(通信线路上行测试)。 3. 数据包结构:每个完整的...

Global site tag (gtag.js) - Google Analytics