【Herm程序员开发指导】第2章 Herm Framework和网络通信组件

http://blog.csdn.net/herm_lib     daemon.huang # gmail # com

 

2.1 概述

本章从网络通信组件的结构开始,简单地介绍一种较常用的通信组件结构。接着结合通信组件的结构来说明Framework的实现,描述Framework的对象模型,Network、Peer和Session。最后,分析Framework实现的时候采用了哪些措施保证性能,以及哪些地方还可以继续提高性能。最后给出安全措施。

 

2.2 网络通信组件

一个网络应用程序很多情况下简单地分成两层:逻辑层和网络层,其关系如下:

      +---------------+

      |      逻辑层      |

      ------------------

      |      网络层      |

      +---------------+

 

本节要介绍的网络通信组件就是这里网络层的实现。

 

一个网络通信组件一般包含下面3个层次:

1) 接收和发送消息包(Message)

     通过Socket API从网络接口接收和发送UDP数据报或者TCP的数据流。

 

2) 消息包缓冲区

     大部分应用程序需要一个消息包缓冲区,这个缓冲区可以平衡收发与逻辑层处理速度的不匹配。

 

3) Dispatch消息

     网络组件的消息交给应用前的一个预处理;应用逻辑数据往下走时,也有可能在这一层作必要的处理。

 

2.3 Herm Framework

 

Herm Framework重点是实现一套FreeBSD&Linux上的高性能通信组件,实现了一个通用的网络层的功能,逻辑层通过几个C++接口操作组件内部功能。

Framework采用多路复用的机制实现数据的收发,Linux上用epoll,FreeBSD上用的是kqueue,Windows上是select。从实现可以肯定,在Windows上仅支持63个的TCP连接,不适合开发高并发的TCP Server;但开发UDP Server没问题。Framework内部会创建一个线程实现数据收发,这样在多核的机器中可以较充分的利用CPU。

 

Framework内部的消息缓冲区用的是一读一写non-lock的ring buffer,实现见utils/buffer.h&buffer.cpp。

 

对象模型

Herm Framework采用面向对象的方法抽象了网络组件的几个部分。Framework抽象出了Network, Peer和Session三种对象。

一个Network维护一个线程环境和控制一个或多个Peer对象;Peer可以认为是一个TCP Client、TCP Server、UDP Client或UDP Server的抽象,管理一个或多个Session;而Session就是TCP的一个连接或者是UDP的数据交互的两端。

 

2.4 性能和安全考虑

性能和简单有时候是一对矛盾,要保证性能,可能会使代码实现相对来说变得复杂一些。和Framework性能有关的有三方面:多路复用的收发机制、多线程对公共buffer读写加锁问题、数据拷贝次数以及对象的内存管理。

 

Linux的epoll有LT&ET模式,Framework通过一个编译宏让使用决定是否使用,从而达到数据收发的最高效。buffer的读写加锁的问题,Framework的做法是通过设计的方式避免加锁,消除加锁解锁是的性能损耗。

数据拷贝次数是很重要的一个性能关注点,理想的情况是,通信组件将某个Session的消息包交给逻辑层后,只经历一次内存拷贝,就是协议栈buffer到应用层空间的一次拷贝,就是调用Socket API recv()那一次拷贝。在写本文的时候,Framework内部是两次内存拷贝,另外一次是组件将消息包传给逻辑层时,作了一次拷贝。这是一种折中的方式,折中性能与实现复杂度、调用安全。直接将组件的消息包的地址传给逻辑层,实际使用的时候有些约束条件,使用不当会产生严重的错误。

最后就是对象的内存的管理问题,在一个TCP Server中,有时候有几W个Sessions,对象的管理对性能影响是很大的。Framework的实现的原则是,系统初始化是,所有的对象都已经预创建完成,在系统运行的过程中,绝对不允许对象的动态创建或销毁。但像Peer对象,考虑一个TCP Server的Peer,他是相当稳定的,所以在Network对象中,就直接用std::list管理,简单直接,代码容易维护。

 

安全方面主要是非法消息包控制,当各种网络对象出现不合法的状态是,严格地控制方法等。

 

下一章详细地介绍用Framework实现TCP Server&Client/UDP Server&Client。

1.1 什么是Herm Herm是一套快速开发高性能的网络应用的C++库。比如开发网络游戏、即时通信、流媒体、文件下载、P2P等基于TCP/IP网络应用。 Herm包括三个组件: (1)Utilities 最基础的组件,提供线程、一读一写线程不加锁的ring buffer、二进制消息解析器、支持多态的对象管理器等。 (2)Socket 用面向对象和泛型的方法抽象了TCP/UDP的Socket IOs;抽象了Win32 Select、Linux epoll和FreeBSD kqueue的多路复用API。统一了三者水平模式(Level Triggered)的语义(一套代码在Win32/Linux/FreeBSD运行结果是一样的),Linux上也支持了边缘模式(Edge Triggered)。 (3)Framework 基于Utilities和Socket的简化开发网络应用的框架,抽象出Peer和Session对象。Peer和Session对象以及Framework实现的功能将在第2介绍。 Herm目前仅支持Linux/Windows/FreeBSD 32bits平台。调用者可以基于不同的需求使用不用的组件。 1.2 最简单的例子 本节给出两个分别用Framework和Socket组件实现的简单TCP Server的例子。所有的例子可以参考examples frameworks和multiplexors目录。 1.2.1 用Framework实现TCP Server 首先,实现一个Listener, class Listener : public Herm::Listener { virtual void Accept(Herm::Session* session) { // 在这里得到一个于客户端通信的Session // 注册用于处理收到的消息的handler // 用Session::Push将数据写到发送buffer,最终数据传给client } }; 实现一个App, class App : public Herm::App { virtual bool Init() { // 1. 创建Network Herm::Network* net = CreateNetwork(); // 2. 创建一个TCP Server Peer,将Listener注册到Peer,进行监听 Herm::Peer* peer = net->CreateTCPServer(addr, new Listener); } }; 1.2.2 用Socket实现TCP Server 用Socket实现TCP Server更灵活,但实现者要做一些额外的工作,比如tcp stream解析,缓冲队列处理等等。 首先实现一个AcceptHandler,处理Client连接, class AcceptHandler : public Herm::EventHandler { virtual int Receive(int) { m_acceptor->Accept(streamHandler->GetStream()); g_reactor->Register(streamHandler, Herm::READ_MASK); ... } private: Herm::Acceptor* m_acceptor; }; 实现StreamHandler, 处理数据收发, class StreamHandler : public Herm::EventHandler { // Handle onle int param on FreeBSD, pls see the example of FreeBSD_tcp_server virtual int Receive(int) { m_stream->Recieve(buf, .......); ..... } private: Herm::Stream* m_stream; }; 最后,在一个线程里把上面Handler执行起来, while (true) g_reactor->Run(); 1.3 Herm地址 https://sourceforge.net/projects/speed/ 1.4 下一话题 下将较详细地介绍Framework组件,主要介绍如何用Framework实现真实可用的网络游戏的接入网关Server(gated)和逻辑Server(zoned) 转自CSDN的herm_lib http://blog.csdn.net/herm_lib
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值