应用层通信协议开发浅析

Original:http://blog.csdn.net/phunxm/article/details/5086080

1.通信协议的概念及其要素

在OSI开放互联参考模型中,对等实体(peer)之间数据单元在发送方逐层封装(encapsulation),在接收方的逐层解析(decapsulation)。发送方N层实体从N+1层实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。N层实体只将其视为需要本实体提供服务的数据,将服务数据单元进行封装,使其成为一个对方能够理解的数据单元(Protocol Data Unit,PDU),封装过程实际上是为SDU增加对等实体间约定控制信息(Protocol Control Information,PCI)的过程。

为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇(Protocol Family)。

网络协议的分层有利于将复杂的问题分解成多个简单的问题,从而分而治之。各层的协议由各层的实体(entity)实现,通信双方对等层中完成相同协议功能的实体称为对等实体。对等实体按协议进行通信,所以协议反映的是对等层的对等实体之间的一种横向关系,严格地说,协议是对等实体共同遵守的规则和约定的集合。

通信协议精确地定义了双方通信控制信息和解释信息:发送方能将特定信息(文本、图片、音频、视频)按协议封装成指定格式的数据包,最终以串行化比特流在网络上传输;接收方接收到数据包后,根据协议将比特流解析为本地化数据,从而获取对方发送过来的原始信息。

通信协议包括三个要素:

(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所示。


TLV包


头部


包实体


m_dwTag


m_nLen


m_pValue

表1 TLV包格式

TLV的接口说明:

(1)值类型标签m_vtTag是内部辅助枚举变量,它根据构造TLV时传递的服务类型标签m_dwTag来确定。

(2)TLV::m_nLen在为TLV设置具体值时确定。

(3)TLV包的封装:

  • 使用Tag参数创建一个TLV对象后,调用TLV::setValue_*方法为TLV填充具体值;
  • 调用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所示。


Package包


头部


序列号


包实体


m_nCmdLen


m_dwCmdID


m_dwCmdState


m_nSeqNo


Count*TLV

表2 Package包格式

Package的接口说明:

(1)Package::m_nCmdLen是整个Package包的长度,将其作为首个字段的好处在于当传送大数据包时,接收方可以根据数据长度来控制读状态,从而将一个大数据包分批接收。

(2)Package::m_nCmdLen在构造函数中初始化为16,在调用Package::addTLV方法填充包实体时增长。

(3)Package包的封装:

  • 创建Package对象后,调用Package::setHeader方法填充头部信令;
  • 创建TLV对象并填充数据,再调用Package::addTLV方法填充包实体;
  • 调用Package::toBuffer方法将Package打包到缓冲区streamBuffer。

(4)Package包的解析:

  • 先创建一个Package对象,调用Package::fromBuffer方法从缓冲区streamBuffer先解析出Package的头部和序列号,再从剩余缓冲区中解析出TLV并将其串行化到链表。
  • 调用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通信协议,对于稍大一点的数据块需要控制好读的步骤,以便能接收整包完整的信息。

本文示例代码下载:《TLV应用层协议开发示例

参考:

《计算机网络协议和实现技术》 鲁士文

TLV
格式及编解码示例

XML和TLV打包解包性能比较

时间: 2024-10-15 10:39:24

应用层通信协议开发浅析的相关文章

web前端开发浅析

原文地址:http://www.cnblogs.com/babyzone2004/articles/1807381.html 摘 要:前端开发作为一项新的领域,经历的时间随然较短,却显示了强大的生命里,在web2.0时代,扮演着极其重要的角色,它是RIA时代的幕后推手,同时,也是数字媒体技术的应用之一.   关键词:数字媒体技术:web开发:前端开发,网页重构 什么是前端技术  前端技术包括JavaScript.ActionScript.CSS.xHTML等"传统"技术与Adobe R

Android省电开发 浅析

相信对于Android App省电的开发,一切性能优化都可以达到App的省电开发,所以一个省电的Android应用,性能优化占据很重要的位置.除此之外整理了几点关于Android应用省电的开发技巧. 一.Android省电开发之性能优化 可参考,just a little,http://blog.csdn.net/wtyvhreal/article/details/44172125 二.Android省电开发之CPU降频 众所周知,在android系统的耗电量排行里,cpu的耗电占 了比较大的一

Android蓝牙开发浅析【转】

本文转载自:http://blog.csdn.net/geekdonie/article/details/7487761 由于近期正在开发一个通过蓝牙进行数据传递的模块,在参考了有关资料,并详细阅读了Android的官方文档后,总结了Android中蓝牙模块的使用. [更新]之前承诺的蓝牙通讯模块的源码已经放出,详情请点击一下链接 http://blog.csdn.net/gd920129/article/details/7552110 1. 使用蓝牙的响应权限 [html] view plai

移动端web开发 浅析

1. viewport ① viewport在移动端承载网页的区域:具有默认格式 ②设置viewport属性,适配移动端设备 主流设置: <meta name = "viewport" content = "width = device-width , initial-scale = 1.0 , user-scalable = 0"> 主流设置快捷键:meta: vp  tab键 name = "viewport"    viewpo

iOS多线程开发——GCD的使用与多线程开发浅析(二)

对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己.最近刚看完了<Objective-C高级编程 iOS与OS X多线程和内存管理>这本书后,对多线程有了更为深入的理解,故在此做一个总结与记录.这本书我已经上传至网盘  https://pan.baidu.com/s/1c2fX3EC ,这本书是iOS开发者必读的书之一,写得很不错,欢迎大家下载阅读.书的封面如下,故也称狮子书: . (1)多线程会遇到的问题 . 多线程会出现什么问题呢?当多个线程对同一

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

Web开发入门学习笔记

公司web项目终于要启动了,本以为django学习可以在实战中进行,结果最终使用了Drupal框架,好吧,那我们就PHP走起,买了本<细说PHP>,先跟着过一遍Web开发入门. HTTP协议 HTTP协议:所有的WWW文件都必须遵守HTTP协议,HTTP是客户端浏览器或者其他程序与Web服务器之间的应用层通信协议.HTTP协议建立在TCP/IP协议,也就是说,是一种可靠的传输协议,意味着两台设备在传输之前必须先建立可靠连接(握手),由客户端发起到服务器端的指定端口(默认为80)HTTP请求,并

JavaWeb开发学习(一)-JavaWeb开发概述

1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网站的目的是提供信息服务,重在内容,程序往往比较简单.但一个Web程序往往比较复杂,背后结合数据库等技术. 按照是否需要访问网络,程序可分为网络程序和非网络程序.其中网络程序又分为B/S和C/S结构.C/S是指客户端(Client)/服务器(Server)模式.这种模式的客户端需要安装一个桌面程序.桌

Eclipse IDE配置PHP开发、调试环境

前言 使用java语言开发的朋友想必对Eclipse开发工具已经不陌生了,那么Eclipse作为java主流的开发工具,是否能够开发PHP项目呢?答案如你所想,肯定是可以的!以下就是该IDE下如何配置PHP开发及调试环境的内容.亲身实践,已测试通过. 安装 1.安装php development tools(PDT)工具 选择[帮助]-[Eclipse marketplace],如下图所示: 查找“php development tool”,选择“PHP Development Tool 6.1