框架设计网络通信论文

时间:2017-01-23 20:43:31 来源:论文投稿

1BillingNTC的由来

1.1网络通信框架

1.1.1UNIXSAP/TERMSAP

轻量级的unixsap,termsap网络通讯组件,是对Socket的封装结合系统消息队列,但不支持跨平台,且只负责数据的收发,不涉及协议分析和组包。

1.2业界的相关库

1.2.1ACE

ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候,要根据情况,看从哪一层来进行使用。支持跨平台。

1.2.2Libevent

Libevent是一个C语言写的网络库,官方主要支持的是类Linux操作系统,最新的版本添加了对Windows的IOCP的支持。在跨平台方面主要通过“select”模型来进行支持。

1.2.3Libev

与Libevent一样,Libev系统也是基于事件循环的系统,它在poll()、“select”()等机制的本机实现的基础上提供基于事件的循环。Libev实现的开销更低,能够实现更好的基准测试结果。

1.3BillingNTC

在IO多路复用为基础的,ACE,Libevent,Libev这些网络框架要不就是非常庞大(ACE),不利于集成;要不就是使用Callback的回调机制,对于固定的事件不如C++的虚函数多态方式。此外并没有对协议进行细分,至多实现了一些常用协议(如HTTP)的扩展接口,对于数据的处理(如协议解析、粘包、数据缓存)都需要上层自己实现。BillingNTC支持了以下的能力:

(1)支持跨平台(WIN32,LINUX,AIX,HPUX,SOLARIS,FREEBSD/MACOS)。

(2)支持同步和异步模型的网络编程。

(3)支持按协议适配拼接消息,缓存复用,并解决粘包问题。

(4)支持同一端口,多种协议混合的解决方案。

(5)支持事件扩展,动态增加事件泵,自定义事件分发和处理动作。

(6)支持流量统计和流量控制。

(7)支持链路超时控制。

(8)支持4类协议原型,以及扩展的HTTP协议和WIN-NTCP协议。

(9)支持连接代理设置。

2BillingNTC设计

2.1IO多路复用

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

2.2IO事件分离

一般地I/O多路复用机制都依赖于一个事件多路分离器(EventDemultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(EventHandler)。两个与事件分离器有关的模式是Reactor和Proactor。Re-actor模式采用同步IO,而Proactor采用异步IO。在Reactor中,事件分离器负责等待文件描述符或Socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。

而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从Socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。比如,在Windows上,处理器发起一个异步IO操作,再由事件分离器等待IOComple-tion事件。典型的异步模式实现,都建立在操作系统支持异步API的基础之上,这种实现被称为“系统级”异步或“真”异步,因为应用程序完全依赖操作系统执行真正的IO工作。

2.3事件驱动模型

对于事件驱动模型,接触最多的便是界面的UI编程,它们都有一个事件队列,线程便是从事件队列中获取事件,然后执行事件对应的处理函数,周而复始地循环。事件驱动模型着重于弹性以及异步化,使得编程更为灵活。

在BillingNTC中,需要这样几个构件(前摄器,事件分发器,事件泵,事件处理器)来完成事件的流转,如图1所示。

2.3.1前摄器

前摄器(Proactor)是一个负责摄取事件,并将事件分发到事件泵的事件队列中。而连接前摄器便是利用I/O复用监测多个IO上的事件,并进行分离IO事件,派发到上层模块。

(1)多路复用模型

实用的多路复用模型都是多路分离的(“select”/poll/epoll等),而且是非阻塞的。将常用的I/O复用进行封装,提供统一的接口,达到I/O事件前摄器的多样性。根据操作系统的不同,自动选择适合的I/O复用模型。

(2)异步IO

前摄器需要负责事件的监测和控制,并同时承担非阻塞读写操作(某些平台下不支持异步IO,这样达到模拟异步IO),IO操作与业务逻辑处理分离在不同的线程中,使用消息队列来进行数据缓冲。即使某个数据包的处理时间过长,也不会影响到IO线程的数据接收。

(3)动态控制监听

在某些场景下,可能需要对连接上事件的监听做动态的控制,做到实时地添加和移除指定的事件。如当达到最大连接数的时候停止accept,或对指定连接限定读写速度的场景。前摄器通过socket_pair(Unix域套接字)创建出两个套接字,假设分别叫A和B,将A放入监听集合中。当需要更改监听集合时,只需要往B写入数据,则A即变得可读,从而唤醒正在监测集合事件的前摄器线程,来处理集合变更的通知。

2.3.2事件分发器

事件分发器(eventdiuspatcher)本身并不是运行态线程,而是一个执行过程,被前摄器线程所执行。它负责为事件选择一个合适的事件队列。一个套接字上的事件往往有处理的顺序性,当连接刚建立的时候,产生的连接建立事件,会选择最小负载的队列,并且后续此连接上的事件都会放入此队列。其他类型的事件(如信号事件)会每次选择最小负载的队列放入。上层模块可以自定义事件分发器的分发动作,实现个性化地分发逻辑。

2.3.3事件泵

事件泵(eventpump)是基于事件循环(eventloop),阻塞读取事件队列,将事件调用相应的事件处理器接口进行处理。可以有0个或多个事件泵,如果没有初始化事件泵,则事件的处理由前摄器直接调用事件处理器接口进行处理。

2.3.4事件处理器

事件处理器本身并不是运行态线程,而是一个执行过程,被事件泵线程所执行。提供一个事件处理的统一入口Proces-sEvent,再根据不同的事件执行不用的处理函数。

2.4同步和异步模式

2.4.1同步模式

同步模式在客户端网络程序中使用较为便捷,从程序代码逻辑上看是顺序执行下去,能够更方便地控制逻辑执行顺序。因为事件处理器的执行过程是由事件泵线程或前摄器线程执行,与主线程并不是一个线程,那么如何才能让主线程接管消息的处理?可以通过设置一个阻塞消息队列,当有一个完整消息达到的时候,放入到此消息队列,而主线程则可以阻塞读消息队列(也可以配合超时)。当主线程还在阻塞读,而链路断开了,则需要自动将主线程从阻塞中唤醒,返回失败。主线程中只需要通过GetMessage就可以获得待处理的消息,然后进行消息处理,这一点就如同对系统消息队列的收取似的,处理逻辑简单。

2.4.2异步模式

异步模式在服务端网络程序,或者客户端网络程序需要连接多条链路的情况下,最为适合。因为事件处理器的执行完全由网络框架直接执行。同时由于I/O操作并不是在事件泵中完成,故事件泵便是工作线程,可以开设多个事件泵来达到更好的负载表现。

3结语

描述了BillingNTC网络通信框架的出现背景,以及其设计和实现。它能够帮助快速搭建基于网络通信的服务端和客户端,并为常见的需求提供了解决方案。同时预留了很多高级接口,方便更高程度的自定义。BillingNTC适用于轻量级、快速开发、跨平台要求、连接数目多、响应时间要求高的场合。BillingNTC让开发更专注业务处理逻辑,从网络通信中涉及的跨平台,消息协议,收发消息包,线程调度中解脱出来,更有效率也更省心。

作者:刘启铨 单位:中兴软创科技股份有限公司方案架构部


更多财政金融论文详细信息: 框架设计网络通信论文 论文代写
http://m.400qikan.com/lw-111964 论文代发

相关专题:即时口译 青岛理工大学学报

相关论文
相关学术期刊
《辽宁师专学报》 《疾病监测与控制》 《管理现代化》 《中华腔镜泌尿外科杂志》 《湖南警察学院学报》 《现代泌尿生殖肿瘤杂志》 《上海针灸杂志》 《人才开发》 《中国航海》 《中国防汛抗旱》

< 返回首页