一种基于epoll模型的高效代理服务架构

2016-02-07 06:06何金狮
网络安全技术与应用 2016年12期
关键词:代理服务代理服务器描述符

◆何金狮

(福建富士通信息软件有限公司 福建 350003)

一种基于epoll模型的高效代理服务架构

◆何金狮

(福建富士通信息软件有限公司 福建 350003)

本文通过对epoll模型的灵活运用,结合多线程多队列模式,对socket描述符进行合理分配,介绍了一种高效的代理服务框架。

数据转发;代理服务;epoll

0 引言

代理服务被用于数据转发,需要同时管理客户端和服务器连接,并且能够准确的将一端的数据转发到对应的另一端,在连接数大的情况下对性能和稳定性都是一个非常大的考验。因此一个高效的代理服务框架显得非常重要。

1 EPOLL概述

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入准备队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少系统调用,提高应用程序效率。

2 网络拓扑

代理服务的主要功能是将一个网络终端的数据转发到另一个网络终端,两端设备不需要在同一个局域网内,只要网络可达即可。一个完整的代理服务过程分为,客户端与代理服务器建立连接,代理服务器根据自定义的代理协议与目标服务器创建连接,客户端与服务端通讯的所有数据都由代理服务器来转发。常见的代理服务有HTTP代理和Socks代理。

图1 网络拓扑

3 架构分析

架构设计的思想是主进程根据系统的cpu核心数创建对应数量的线程,并且为每个线程创建一个队列。主进程负责监听新的连接请求,一旦有新的请求进来,主进程会遍历所有的队列将新的请求的socket描述符以及相关信息放入数量最小的队列中。子线程实时扫描队列发现有新的请求就将请求从队列中移除并且放入线程内部的epoll队列中,子线程负责管理这些连接的数据收发。

子线程从对应的队列中获取新连接,创建客户端结构体一同放入本线程创建的epoll队列中。子线程进行epoll_wait等待事件触发,如果事件类型是EPOLLIN读事件同时是客户端并且首次触发,根据连接信息获取客户端要连接的服务器信息。子线程创建与服务端的连接,同时创建服务器结构体,并且客户端和服务端的结构体中分别存放对方的信息,这样当接收到任何一端的数据时都可以快速找到对端的连接。

图2 主进程流程

图3 线程流程

4 总结

将客户端的连接通过独立的队列均衡负载到不同的线程中,由每个独立的线程分别建立epoll监听极大的提高了数据处理能力。通过在同一种结构体中用字段表示连接是属于客户端还是服务端的方式,在epoll中可以同时对客户端和服务端连接进行管理使得架构更加灵活高效。

[1]宋敬彬,孙海滨.Linux网络编程.清华大学出版社,2010.

[2]https://banu.com/blog/2/how-to-use-epoll-a-complet --example-in-c/.

猜你喜欢
代理服务代理服务器描述符
基于结构信息的异源遥感图像局部特征描述符研究
基于AKAZE的BOLD掩码描述符的匹配算法的研究
基于深度学习的局部描述符
地铁信号系统中代理服务器的设计与实现
IP地址隐藏器
农村“三资”代理服务浅析
网络安全与防火墙技术
特征联合和旋转不变空间分割联合的局部图像描述符
一种容侵系统的设计