CN103237035A - 可控分布式代理平台 - Google Patents
可控分布式代理平台 Download PDFInfo
- Publication number
- CN103237035A CN103237035A CN2013101573218A CN201310157321A CN103237035A CN 103237035 A CN103237035 A CN 103237035A CN 2013101573218 A CN2013101573218 A CN 2013101573218A CN 201310157321 A CN201310157321 A CN 201310157321A CN 103237035 A CN103237035 A CN 103237035A
- Authority
- CN
- China
- Prior art keywords
- function
- socks
- realizes
- call
- event
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Computer And Data Communications (AREA)
Abstract
可控分布式代理平台,涉及一种代理平台,为了解决一股平台没有审计和信任机制,致使不法用户对系统进行DDOS攻击或访问不法网站获取不良信息的问题。代理模块提供代理服务和分布式代理机群间协作功能,支持SOCKS4和SOCKS5版本的SOCKS协议;进程管理模块创建、运行、维护和销毁部分模块的进程和线程;配置文件管理模块为其他模块提供配置文件解析与加载;日志输出模块为其他模块提供日志输出;事件管理模块,处理各种请求;内存管理模块为部分模块内存管理;I/O管理模块为接收和发送网络数据;监控模块,用于接收控制中心发送的命令,根据所述命令执行相应操作。它用于为用户提供SOCKS代理服务。
Description
技术领域
本发明涉及一种代理平台,特别涉及一种可控分布式代理平台。
背景技术
在经济高速发展的今天,互联网成为越来越多的人生活不可缺少的一部分。网络的完善与发达在给人们带来便利、促进国民经济发展的同时,也使得有害信息传播更为便利和迅速,不法分子对网络的攻击和窃取变得更为容易和隐蔽。因此,我们需要一种高效的手段对敏感信息进行检测,防范不法分子的攻击。代理平台即是在这种环境下应运而生。
一股的代理平台为用户提供HTTP(超文本传送协议)网页代理或者SOCKS(防火墙安全会话转换协议)代理。HTTP代理需要对用户的HTTP协议进行解析处理,譬如著名的开源软件nginx。SOCKS代理软件不解析用户的HTTP协议请求。常规的代理平台基本上都能够为用户提供代理请求,然而它们没有或者缺少审计和信任机制,致使不法用户可能对系统进行DDOS等攻击行为,或者访问不法网站,获取不良信息,造成网络上不良信息的泛滥,给社会主义文化建设带来隐患。因此我们需要一个能为用户提供便捷高效代理功能,同时又能给管理人员提供审计和接入控制的分布式代理平台。代理平台应该方便自身服务器的扩充或者减少,分布式平台之间应该自我学习,自动更新相关运行信息。
发明内容
本发明的目的是为了解决一股平台没有审计和信任机制,致使不法用户可能对系统进行DDOS等攻击行为,或者访问不法网站,获取不良信息的问题,本发明提供一种可控分布式代理平台。
本发明的可控分布式代理平台,它包括进程管理模块、配置文件管理模块、日志输出模块、事件管理模块、内存管理模块、I/O管理模块、代理模块和监控模块;
进程管理模块,用于创建、运行、维护和销毁配置文件管理模块、日志输出模块、事件管理模块、内存管理模块的进程以及线程;
配置文件管理模块,用于为所述代理平台的其他各模块提供配置文件的解析与加载;
日志输出模块,用于为所述代理平台的其他各个模块提供日志输出功能;
事件管理模块,用于处理来自外界的连接请求、来自I/O管理模块的I/O事件请求、代理模块的SOCKS4或SOCKS5代理请求和监控模块的监测请求;
内存管理模块,用于为进程管理模块、事件处理模块和I/O管理模块进行内存管理;
I/O管理模块,用于接收和发送网络数据;
代理模块,用于提供代理服务和提供分布式代理机群问协作功能,支持SOCKS4版本和SOCKS5版本的SOCKS协议;
监控模块,用于接收控制中心发送的命令,并根据所述命令执行相应的操作。
本发明的优点在于,本发明的可控分布式代理平台为普通因特网用户提供SOCKS代理服务。该代理系统实现了信任管理机制,将阻断用户对不良网站的访问,限制不良用户的网络访问。本系统运行在Linux服务器上,可以使用多台服务器进行分布式服务,形成代理集群。集群之间可以方便的同步各项运行参数。系统通过监控模块提供了完整的自我监测功能,用于对自身运行状态进行监测,方便维护人员进行系统管理。代理系统可以将获取到的用户请求转发给缓存服务器,缓存服务器可以直接返回拥有的数据,否则将向源站点转发请求,获取目的数据。所以本发明的代理平台具有审计和信任机制,有效的阻止用户对系统进行DDOS和访问不法网站,获取不良信息的行为。
附图说明
图1为本发明的可控分布式代理平台的的原理示意图。
图2为具体实施方式三所述的可控分布式代理平台的SOCKS4模块的函数调用流程示意图。
图3为具体实施方式四所述的可控分布式代理平台的SOCKS5模块的函数调用流程示意图。
图4为具体实施方式五所述的可控分布式代理平台的cluster模块的函数调用流程示意图。
图5为具体实施方式六所述的可控分布式代理平台的upserving模块的函数调用流程示意图。
图6为具体实施方式七所述的可控分布式代理平台的监控模块的函数调用流程示意图。
图7为具体实施方式八所述的可控分布式代理平台的进程管理模块函数调用流程示意图。
图8为具体实施方式九所述的可控分布式代理平台的事件管理模块的函数调用流程示意图。
图9为具体实施方式十所述的可控分布式代理平台的I/O管理模块的函数调用流程示意图。
图10为对单台代理服务器构成的代理平台的并发测试结果曲线示意图。
图11为对本发明的代理平台的并发测试结果曲线示意图。
具体实施方式
具体实施方式一:结合图1说明本实施方式,本实施方式所述的可控分布式代理平台,它包括进程管理模块、配置文件管理模块、日志输出模块、事件管理模块、内存管理模块、I/O管理模块、代理模块和监控模块;
进程管理模块,用于创建、运行、维护和销毁配置文件管理模块、日志输出模块、事件管理模块、内存管理模块的进程以及线程;
配置文件管理模块,用于为所述代理平台的其他各模块提供配置文件的解析与加载;
日志输出模块,用于为所述代理平台的其他各个模块提供日志输出功能;
事件管理模块,用于处理来自外界的连接请求、来自I/O管理模块的I/O事件请求、代理模块的SOCKS4或SOCKS5代理请求和监控模块的监测请求;
内存管理模块,用于为进程管理模块、事件处理模块和I/O管理模块进行内存管理;
I/O管理模块,用于接收和发送网络数据;
代理模块,用于提供代理服务和提供分布式代理机群间协作功能,支持SOCKS4版本和SOCKS5版本的SOCKS协议;
监控模块,用于接收控制中心发送的命令,并根据所述命令执行相应的操作。
本实施方式中的内存管理模块主要负责系统内部内存的申请,维护与释放工作。管理器在工作时,采用预分配的机制,先分配一个足够大的内存池——cache,而后通过ss5_palloc族函数从内存池中申请内存。待内存使用过后,利用ss5_destroy_pool()函数将内存池销毁,以将其释放到操作系统中。该模块为系统内存管理模块,可以有效避免内存碎片产生,同时还能起到cache的作用。该内存管理机制采用内建的方式存在于系统之中。
本实施方式中的日志输出模块主要提供系统的日志输出功能,该模块中的组件是为其他模块提供服务而存在的。在实际系统开发时,经常用到的函数接口仅为ss5_log_error(),ss5_log_debugx()等,其余的函数均由这两个函数调用,最终完成日志输出功能。日志输出分为dubug模块和非dubug模式。DEBUG模式用于开发阶段对系统进行调试,可以只打印输出待调试的模块信息。非DEBUG模块用于系统正常使用阶段的打印输出,从高到低分为若干级别,输出的内容也越来越多。模块中的两种模式具有互斥性,不能同时开启。
具体实施方式二:本实施方式是对具体实施方式一所述的可控分布式代理平台的进一步限定,所述代理模块包括SOCKS4模块、SOCKS5模块、cluster模块和upserving模块;
SOCKS4模块,用于提供SOCKS代理服务;
SOCKS5模块,用于提供SOCKS代理服务;
cluster模块,用于处理集群之间配置信息同步,协调不同代理服务器之间的运行状态;
upserving模块,用于完成集群内部连接服务请求转移的功能。
每个服务器的代理系统,都包含了SOCKS4和SOCKS5的功能,是一个同一的整体,只是在运行的过程中根据客户请求类型的不同进入到不同的处理流程。不同的代理服务器指的是代理服务器A和服务器B,cluster负责在这两台服务器之间同步各自代理系统的配置文件。
具体实施方式三:结合图3说明本实施方式,本实施方式是对具体实施方式二所述的可控分布式代理平台的进一步限定,SOCKS4模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_socks5_handler()、
ss5_socks4_handler()、
ss5_rule_check()、
ss5_4_parse_request()、
ss5_socks4_process_handler()、
ss5_4_process_request()、
ss5_4_connect_serving()、
ss5_4_bind_serving()、
ss5_4_nonblocking_connect_handler()、
ss5_socks_upserving()、
ss5_socks_prepare_connection()、
ss5_socks_prepare_data_queue()、
ss5_install_data_transfer_hanlders()和ss5_handle_read_event();
上述函数模块的调用流程如下:
函数ss5_socks_init_connection()实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,根据所述结构为发送客户请求的客户选择相应的代理服务器,并设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断客户请求类型,设置句柄函数指针为相应的处理函数,并判断客户请求解析状态,如果是SOCKS4代理请求,则进入SOCKS4代理处理流程,调用函数ss5_socks4_handler();
函数ss5_socks4_handler()先调用函数ss5_4_parse_request()实现完整解析客户请求信息的功能,并根据解析的结果填充相关数据结构,再调用函数ss5_rule_check()实现判断IP地址或者域名是否在黑名单中,如果在,则关闭与发送客户请求的客户端的连接的功能;然后调用函数ss5_socks4_process_handler();
函数ss5_socks4_process_handler()实现调用函数ss5_4_process_request()处理客户请求,设置相应事件的处理函数的功能,
函数ss5_4_process_request()实现处理客户请求,根据SOCKS4协议处理相应的请求,获取客户所请求网站的真实地址列表,当客户请求为CONNECT请求时,调用函数ss5_4_connect_serving(),当客户请求为BIND请求时,调用函数ss5_4_bind_serving();
函数ss5_4_connect_serving()实现根据SOCKS4协议,向远端真实服务器发送请求,建立代理系统和远端真实服务器的TCP连接,然后根据TCP连接的建立情况,向发送客户请求的客户返回响应报文,指明是否成功建立转发连接;如果CONNECT连接被拒绝,则代理平台向发送客户请求的客户端发送响应报文后会关闭连接的功能,然后调用函数ss5_4_nonblocking_connect_handler();
函数ss5_4_bind_serving()实现根据SOCKS4协议,处理SOCKS4命令为BIND的情况,建立bind套接字,填充相关数据结构,设置相关句柄指针,向发送客户请求的客户端发送第一次BIND响应报文的功能,然后调用函数ss5_4_nonblocking_connect_handler();
函数ss5_4_nonblocking_connect_handler()实现当本地代理平台无法提供代理服务时,调用函数ss5_socks_upserving(),返回函数ss5_4_nonblocking_connect_handler(),当本地代理平台或其他SOCKS代理平台能提供代理服务时,填充相关数据结构,设置相关句柄,设置无阻塞连接,向发送客户请求的客户端发送第一次响应报文的功能,然后调用函数ss5_socks_prepare_connection();
ss5_socks_upserving()实现向其他SOCKS代理平台转发客户请求的功能;
ss5_socks_prepare_connection()实现填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_socks_prepare_data_queue(),
函数ss5_socks_prepare_data_queue()实现申请发送缓冲区和接收缓冲区,填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_install_data_transfer_hanlders();
函数ss5_install_data_transfer_hanlders()实现填充和读写相关的数据结构,设置相关句柄的功能,调用函数ss5_handle_read_event(),
函数ss5_handle_read_event()实现读取事件的功能。
具体实施方式四:结合图3说明本实施方式,本实施方式是对具体实施方式二所述的可控分布式代理平台的进一步限定,SOCKS5模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_socks5_handler()、
ss5_socks5_handler()、
ss5_rule_check()、
ss5_5_parse_request()、
ss5_socks5_process_handler()、
ss5_5_process_request()、
ss5_5_connect_serving()、
ss5_5_bind_serving()、
ss5_5_nonblocking_connect_handler()、
ss5_socks_upserving()、
ss5_socks_prepare_connection()、
ss5_socks_prepare_data_queue()、
ss5_install_data_transfer_hanlders()、
ss5_5_udp_associate_serving()和ss5_handle_read_event();
上述函数模块的调用流程包括如下:
函数ss5_socks_init_connection(),实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,根据所述结构为发送客户请求的客户选择代理服务器,设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断请求类型,设置句柄函数指针为相应的处理函数,并判断请求解析状态,,若客户端请求为SOCKS5,则进入SOCKS5处理流程,调用函数ss5_socks5_handler();
函数ss5_socks5_handler()先调用函数ss5_5_parse_request()实现完整解析客户请求信息的功能,并根据解析的结果填充相关数据结构,再调用函数ss5_rule_check()实现判断IP地址或者域名是否在黑名单中,如果在,则关闭与发送客户请求的客户端的连接功能,否则,调用函数ss5_socks5_process_handler();
函数ss5_5_parse_request()实现解析客户请求的功能,
函数ss5_socks5_process_handler()实现调用函数ss5_5_process_request()处理客户请求,设置相应事件的处理函数的功能,
函数ss5_5_process_request()实现处理客户请求,根据SOCKS5协议处理相应的请求,获取客户所请求网站的真实地址列表,当客户的请求为CONNECT请求时,调用函数ss5_5_connect_serving(),当客户的请求为BIND请求时,调用函数ss5_5_bind_serving(),当客户的请求为UDP ASSOCAITE请求时,调用函数ss5_5_udp_associate_serving();
函数ss5_5_connect_serving()实现根据SOCKS5协议,向远端真实服务器发送请求,建立代理系统和远端真实服务器的TCP连接,然后根据TCP连接的建立情况,向发送客户请求的客户返回响应报文,指明是否成功建立转发连接;如果CONNECT连接被拒绝,则代理平台向发送客户请求的客户端发送响应报文后会关闭连接的功能,然后调用函数ss5_5_nonblocking_connect_handler();
函数ss5_5_bind_serving()实现根据SOCKS5协议,处理SOCKS5命令为BIND的情况,建立bind套接字,填充相关数据结构,设置相关句柄指针,向发送客户请求的客户端发送第一次BIND响应报文的功能,然后调用函数ss5_5_nonblocking_connect_handler();
函数ss5_5_udp_associate_serving()实现建立bind套接字,该套接字主要用于从发送客户请求的客户端接收UDP数据包,然后填充相关数据结构,设置相关句柄,向发送客户请求的客户端发送响应报文的功能,然后调用函数ss5_5_nonblocking_connect_handler();
函数ss5_5_nonblocking_connect_handler()实现当本地代理平台无法提供代理服务时,调用函数ss5_socks_upserving(),返回函数ss5_5_nonblocking_connect_handler(),当本地代理平台或其他SOCKS代理平台能提供代理服务时,填充相关数据结构,设置相关句柄,设置无阻塞连接,向发送客户请求的客户端发送第一次响应报文的功能,然后调用函数ss5_socks_prepare_connection();
ss5_socks_upserving()实现向其他SOCKS代理平台转发客户请求的功能;
ss5_socks_prepare_connection()实现填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_socks_prepare_data_queue(),
函数ss5_socks_prepare_data_queue()实现申请发送缓冲区和接收缓冲区,填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_install_data_transfer_hanlders();
函数ss5_install_data_transfer_hanlders()实现填充和读写相关的数据结构,设置相关句柄的功能,调用函数ss5_handle_read_event(),
函数ss5_handle_read_event()实现读取事件的功能。
具体实施方式五:结合图4说明本实施方式,本实施方式是对具体实施方式二所述的可控分布式代理平台的进一步限定,cluster模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_socks_cluster_handler()、
ss5_socks_cluster_req_process_handler()、
ss5_socks_cluster_recv_handler()、
ss5_socks_cluster_signal_reload_wblist()、
ss5_cluster_process_init()、
ss5_cluster_nanager_process_handler()、
ss5_socks_cluster_notify_handler()、
ss5_socks_cluster_file_notify(rule_file)、
ss5_socks_cluster_scatter_file()、
ss5_socks_cluster_create_thread()、
ss5_socks_cluster_scatter_thread()和
ss5_socks_cluster_send_file_data();
上述函数模块的调用流程包括如下:
函数ss5_socks_init_connection(),实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,根据该结构为发送客户请求的客户选择代理服务器,设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断出命令类型为CLUSTER时则进入集群处理模块的功能;然后调用函数ss5_socks_cluster_handler();
函数ss5_socks_cluster_handler()实现读取命令CLUSTER完整命令头部,解析命令,设置相关句柄的功能,所述命令CLUSTER由配置文件同步和黑白名单同步两部分构成;然后调用函数ss5_socks_cluster_req_process_handler();
函数ss5_socks_cluster_req_process_handler()实现首先判断待同步文件的名称是否一致,然后在本地打开用于同步的临时文件,填充相关数据结构,设置句柄,向请求端发送响应报文的功能,所述待同步文件包括配置文件和黑白名单文件;然后调用函数ss5_socks_cluster_recv_handler()。
函数ss5_socks_cluster_recv_handler()实现接收同步文件的数据,然后写入临时文件,重命名临时文件并关闭,最后关闭与发送客户请求的客户端连接的功能,当黑白名单文件发生变化时,调用函数ss5_socks_cluster_signal_reload_wblist();
函数ss5_socks_cluster_signal_reload_wblist()实现向各个进程发送信号,命令各个进程重新加载黑白名单的功能;
所述同步文件的数据的获得方法为:
函数ss5_cluster_process_cycle()实现初始化cluster模块的运行环境的功能;然后调用函数ss5_cluster_manager_process_handler();
函数ss5_cluster_manager_process_handler()实现判断集群选项是否打开,当集群选项打开时调用函数ss5_socks_cluster_notify_handler(),设置超时时间然后调用函数ss5_socks_cluster_notify_handler();
函数ss5_socks_cluster_notify_handler()实现监测配置文件和黑白名单的MD5是否发生变化的功能,当配置文件或黑白名单文件发生变化时,调用函数ss5_socks_cluster_file_notify(rule_file);
函数ss5_socks_cluster_file_notify(rule_file)实现判断文件发生变化的原因,当时所述原因为人为修改或者是程序追加时,填充和更新相关数据结构的功能;然后调用函数ss5_socks_cluster_scatter_file();
函数ss5_socks_cluster_scatter_file()实现打开相应文件,设置该文件内存映射,打开同步线程的功能;然后调用函数ss5_socks_cluster_create_thread();
函数ss5_socks_cluster_create_thread()封装了pthread_create()函数,实现线程创建功能,然后在新创建的线程中调用函数ss5_socks_cluster_scatter_thread();
函数ss5_socks_cluster_scatter_thread()实现向其他服务器发送文件内容,关闭文件的内存映射的功能,然后调用函数ss5_socks_cluster_send_file_data();
函数ss5_socks_cluster_send_file_data()封装了标准send()函数,实现向其他代理服务器发送同步文件的数据的功能。
具体实施方式六:结合图5说明本实施方式,本实施方式是对具体实施方式二所述的可控分布式代理平台的进一步限定,upserving模块包括如下函数模块:
ss5_socks_upserving_create_conf()、
ss5_socks_upserving_init_conf()、
ss5_socks_upserving()、
ss5_upserving_create_method()、
ss5_upserving_create_request()和ss5_unix_send();
上述函数模块的调用流程包括如下:
函数ss5_socks_upserving_create_conf()实现打开缓冲区,填充相关数据结构的功能,然后调用函数ss5_socks_upserving_init_conf();
函数ss5_socks_upserving_init_conf()实现设置用来转发的服务器列表的功能,然后调用函数ss5_socks_upserving();
函数ss5_socks_upserving()为upserving模块的主函数,实现完整的函数调用,完成upserving工作的功能,调用函数ss5_upserving_create_method();
函数ss5_upserving_create_method()实现申请缓冲区,填充相关数据结构,设置句柄的功能,然后调用函数ss5_upserving_create_request();
函数ss5_upserving_create_request()实现形成完整的SOCKS5命令请求,作为SOCKS5客户端向远端SOCKS5服务器转发请求。填充相关数据结构,设置句柄的功能,然后调用函数ss5_unix_send();
函数ss5_unix_send()实现向指定网络地址发送数据的功能。
具体实施方式七:结合图6说明本实施方式,本实施方式是对具体实施方式一所述的可控分布式代理平台的进一步限定,监控模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_exhibit_handler()、
ss5_exhibit_response_to_client()、
ss5_exhibit_get_event()、
ss5_exhibit_event_add_busy_list()、
ss5_socks_exhibit_notify_worker()、
ss5_exhibit_wakeup_worker_thread()、
ss5_exhibit_init_moduble()、
ss5_create_udp_socket()、
ss5_socks_exhibit_create_thread()、
ss5_exhibit_worker_thread_cycle()、
ss5_exhibit_nanager_thread_handler()、
ss5_exhibit_black_hit_log_status_serving()、
ss5_exhibit_cache_structure_status_serving()、
ss5_exhibit_proxy_serving_status_serving()、
ss5_exhibit_cluster_internal_status_serving()、
ss5_exhibit_os_status_status_serving()、
ss5_exhibit_write_reply()、
ss5_exhibit_notify_write_response()、
ss5_exhibit_send_response_to_client()和ss5_cond_timedwait();
上述函数模块的调用流程包括如下:
函数ss5_exhibit_init_moduble()实现初始化监控模块的功能,然后调用函数ss5_create_udp_socket();
函数ss5_create_udp_socket()实现创建UDP套接字的功能,然后调用函数函数ss5_socks_exhibit_create_thread(),
函数ss5_socks_exhibit_create_thread()封装了pthread_create()函数,实现线程创建功能,然后调用函数ss5_exhibit_worker_thread_cycle();
函数ss5_exhibit_worker_thread_cycle()实现设置相关信号集,调用处理句柄的功能,然后调用函数ss5_exhibit_manager_thread_handler();
函数ss5_exhibit_manager_thread_handler()实现根据监控命令,调用相应的处理函数,向其他工作进程扩散监控命令的功能,当为ALL或BLACK_HIT_LOG命令时调用函数ss5_exhibit_black_hit_log_status_serving(),当为ALL或CACHE_STRUCTURE_STATUS命令时调用函数ss5_exhibit_cache_structure_status_serving(),当为ALL或PROXY_SERVING_STATUS命令时调用函数ss5_exhibit_proxy_serving_status_serving(),当为ALL或CLUSTER_INTERNAL_STATUS命令时调用函数ss5_exhibit_cluster_internal_status_serving(),当为ALL或者OS_STATUS命令时调用函数ss5_exhibit_os_status_status_serving();
函数ss5_exhibit_blacK_hit_log_status_serving()实现将黑名单访问记录反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_cache_structure_status_serving()实现将缓存信息反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_proxy_serving_status_serving()实现将目前代理发送状态信息反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_cluster_internal_status_serving()实现将集群目前情况反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();。
函数ss5_exhibit_os_status_status_serving()实现将服务器运行状态反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_write_reply()实现向监控客户端发送回馈报文的功能,当前进程不是接收到监测命令的进程时,调用函数ss5_exhibit_notify_write_response(),向接收到监测命令的进程发送已完成监测任务的回馈;当接收到监测命令的进程收到所有其他工作进程的任务完成回馈时,调用函数ss5_exhibit_send_response_to_client();
一个代理平台可能同时有N个工作进程,监控客户端的监控命令请求只能被一个工作进程所接收,接收命令的进程负责把命令向其他工作进程扩散。其他进程完成工作后通过ss5_exhibit_notify_write_response()向接收进程发送完成任务的回馈。接收进程收到其他进程的全部回馈后调用ss5_exhibit_send_response_to_client()向客户端发送任务完成回馈。
函数ss5_exhibit_notify_write_response()实现向接收到监控客户端监测命令的进程发送已完成监测任务的回馈的功能,然后调用函数ss5_cond_timedwait(),
函数ss5_exhibit_send_response_to_client()实现接收到监测命令的进程向监控客户端发送数据传输完毕的回馈的功能,然后调用函数ss5_cond_timedwait(),
函数ss5_cond_timedwait()封装了pthread_cond_timedwait()函数,实现发送完成后工作线程进入睡眠状态,当接收到唤醒信号wake up时,调用函数ss5_exhibit_worker_thread_cycle();
所述唤醒信号wake up的获取方法为:
函数ss5_socks_init_connection(),实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,为客户选择代理服务器,设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断出命令类型为EXHIBIT时则进入监控模块的功能;然后调用函数ss5_exhibit_handler();
函数ss5_exhibit_handler()实现读取EXHIBIT完整命令头部,解析命令,设置相关句柄的功能,然后调用函数ss5_exhibit_response_to_client();
函数ss5_exhibit_send_response_to_client(),实现向监控客户端发送对命令的解析结果功能,然后调用函数ss5_exhibit_get_event(),
函数ss5_exhibit_get_event()实现删除挂起的事件的功能,然后调用函数ss5_exhibit_event_add_busy_list();
函数ss5_exhibit_event_add_busy_list()实现添加事件的功能,然后调用函数ss5_socks_exhibit_notify_worker();
函数ss5_socks_exhibit_notify_worker()实现通知各个工作进程有EXHIBIT命令到达的功能,然后调用函数ss5_exhibit_wakeup_worker_thread();
函数ss5_exhibit_wakeup_worker_thread()实现接待进程唤起自己的工作线程,对监控命令予以处理的功能,并向函数ss5_cond_timedwait()发送唤醒信号wake up。
具体实施方式八:结合图7说明本实施方式,本实施方式是对具体实施方式一所述的可控分布式代理平台的进一步限定,进程管理模块包括如下函数模块:
ss5_master_process_cycle()、
ss5_spawn_process()、
ss5_reap_children()、
fork()和ss5_woker_process_cycle();
上述函数模块的调用流程包括如下:
函数ss5_master_process_cycle()实现初始化信号集,启动各种类型的工作进程,监听各种信号,进行相应的处理的功能,当需要建立新的进程时,调用函数ss5_spawn_process(),当有子进程退出时,调用函数ss5_reap_children();
函数ss5_spawn_process()实现创建新的进程,完成进程相关信息的初始化的功能,然后调用函数fork();
函数fork()实现创建子进程的功能,然后调用函数ss5_woker_process_cycle();
函数ss5_woker_process_cycle()负责各种信号的监听和处理,负责事件注册与处理,向函数ss5_master_process_cycle()发送重新执行信号respwn;
函数ss5_reap_children()实现重启相应的子进程的功能。
该模块主要负责系统中进程以及线程的创建、运行、维护与销毁工作。系统启动时,在main()函数中通过调用ss5_master_process_cycle()将控制转移到主进程master_process中。而后通过调用ss5_spawn_process()函数将fork出工作进程ss5_worker_process_cycle()。线程的创建过程在ss5_worK_process_cycle()函数中完成。系统运行时若有某些子进程异常退出,则master_process将会接收到SIGCHLD信号,而后通过ss5_reap_children()函数重新启动异常退出的子进程,这时该子进程中的线程也将被重新一一启动。进程管理模块和事件管理模块一起构成了代理平台处理高并发请求的基础。
具体实施方式九:结合图8说明本实施方式,本实施方式是对具体实施方式一所述的可控分布式代理平台的进一步限定,事件管理模块包括如下函数模块:
ss5_process_event_and_timers()、
ss5_process_event()、
ss5_select_process_events()、
ss5_epoll_process_events()、
ss5_poll_process_events()、
select()、
epoll_wait()、
poll()和event->hanlder();
事件管理模块包括三种事件模型,所述三种事件模型为select模型、poll模型和epoll模型;
上述函数模块的调用流程包括如下:
函数ss5_process_event_and_timers()实现处理事件的功能,若有信号和进程间信号的事件,然后再处理接受事件队列和其他事件队列中的事件,然后调用函数ss5_process_event();
函数指针ss5_process_event(),
若待处理的事件模型为select模型,则调用函数ss5_select_process_events(),
若待处理的事件模型为epoll模型,则调用函数ss5_epoll_process_events(),
若待处理的事件模型为poll模型,则调用函数ss5_poll_process_events();
函数ss5_select_process_events()实现以select模式提交和处理事件的功能;然后调用函数select();
函数ss5_epoll_process_events()实现以epoll模式提交和处理事件的功能,然后调用函数epoll_wait();
函数ss5_poll_process_events()实现以poll模式提交和处理事件的功能,然后调用函数poll();
函数select()为实现允许进程等待和内核等待多个事件中的任何一个发生,并且只在一个或多个事件发生或经历一段指定的时间后才唤醒它,唤醒之后需要轮询各个事件以确保是否发生的功能,然后调用函数event->hanlder();
函数epoll_wait()实现允许进程等待内核多个事件中的任何一个发生,事件发生后内核返回发生事件的详细信息,不需要轮询确认发生事件的功能,然后调用函数event->hanlder();
函数poll():为实现允许进程等待和内核等待多个事件中的任何一个发生,并且只在一个或多个事件发生或经历一段指定的之间后才唤醒它,唤醒之后需要轮询各个事件以确保是否发生,处理流设备时能提供额外信息的功能,然后调用函数event->hanlder();
函数指针event->handler(),实现根据事件模型的不同,调用相应的句柄处理函数的功能。
该模块主要负责处理来自外界的连接请求和来自I/O管理模块的I/O事件请求等。工作时,依据所在的操作系统平台自行决定事件处理模型,目前该代理系统已支持如下几种事件处理模型:epoll,poll和select。
epoll,poll和select是linux下三种主要的IO复用方式。
select对应于内核中的sys_select调用,如果有事件发生,select会将临时结果写到用户空间并返回;当轮询一遍后没有任何事件发生时,如果指定了超时时间,则select会睡眠到超时,睡眠结束后再进行一次轮询,并将结果写到用户空间,然后返回。select返回后,需要逐一检查关注的描述符是否被SET(事件是否发生)。
与select相比,poll没有描述符个数限制。
epoll与select、poll不同,首先,其不用每次调用都向内核拷贝事件描述信息,在第一次调用后,事件信息就会与对应的epoll描述符关联起来。另外epoll不是通过轮询,而是通过在等待的描述符上注册回调函数,当事件发生时,回调函数负责把发生的事件存储在就绪事件链表中,最后写到用户空间。它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。可控分布式代理平台在默认状态下采用epoll的事件模型。事件管理模块和进程管理模块是代理平台能够高效处理高并发请求的基础。
具体实施方式十:结合图9说明本实施方式,本实施方式是对具体实施方式一所述的可控分布式代理平台的进一步限定,I/O管理模块包括如下函数模块:
ss5_event_accept()、
ls->connection_handler()、
ss5_unix_recv()、
recv()、
ss5_unix_send()和send();
上述函数模块的调用流程包括如下:
函数ss5_event_accept()实现检测是否有连接事件发生,当有读事件read event发生时,调用函数ss5_unix_recv();当有新事件new event发生时,调用函数ss5_event_accept();当有写事件wirte event发生时,调用函数ss5_unix_send();
函数ss5_unix_recv()封装了标准recv()函数,实现从网络中读取数据的功能,然后调用函数recv();
函数ss5_event_accept()实现接收TCP连接请求的功能,然后调用函数ls->connection_handler();
函数ss5_unix_send()封装了标准send()函数,实现向网络中发送数据的功能,然后调用函数send();
函数ls->connection_handler()实现处理客户请求,建立代理平台与客户之间的TCP连接的功能;
函数recv(),实现从指定的网络套接字接收数据功能;
函数send()实现用于从给定的套接字发送数据功能。
函数recv()和函数send()为标准库函数,由国际标准所规定。
利用单台服务器并发测试结果:
在该测试项目中,客户端尽最大努力向代理服务器不间断发送请求,运行两到三分钟之后停止发送数据。服务器IP为192.168.110.63.结果如图10所示。
图10中,随着客户端的运行代理服务器的并发连接数慢慢增加,最大连接数将近五千,达到峰值后出现波动,关闭测试客户端后服务器连接数快速下降。由于测试服务器选用了曙光高性能服务器,服务器硬件性能卓越,代理平台的出口带宽成为系统主要瓶颈。如果能保证代理平台与外网有极高的联通速度,则理论上讲单台代理服务器的并发连接数可以达到同一时刻上万连接。
本发明的分布式代理平台并发测试结果:
在该测试项目中,代理平台由三台服务器构成,平台入口是一台负责负载均衡的LVS服务器,负责流量分发;代理工作由两台代理服务器完成,IP地址分别是192.168.110.62和192.168.110.63.并发测试结果如图11所示。曲线2表示IP地址为192.168.110.62测试的结果,曲线3表示IP地址为192.168.110.63测试的结果.
在该测试项目中,客户端尽最大努力不间断向代理平台发送连接请求,运行两到三分钟之后关闭客户端。代理服务器的并发连接数出现了先高后低的情况。由于采用了两台服务器,因此代理平台的处理速度大幅提升,使得没有出现太多的连接积压,代理平台并发连接数较单机版的也出现了显著下降。两台服务器连接数的差异是由LVS的流量分发策略和客户端IP所决定,因此出现了较大差异。
通过对本发明所述的代理平台并发连接数的测试,可见该代理平台能够较好的支持高并发连接,并且具有出色的服务性能,符合发明的目的与要求。
Claims (10)
1.可控分布式代理平台,其特征在于,它包括进程管理模块、配置文件管理模块、日志输出模块、事件管理模块、内存管理模块、I/O管理模块、代理模块和监控模块;
进程管理模块,用于创建、运行、维护和销毁配置文件管理模块、日志输出模块、事件管理模块、内存管理模块的进程以及线程;
配置文件管理模块,用于为所述代理平台的其他各模块提供配置文件的解析与加载;
日志输出模块,用于为所述代理平台的其他各个模块提供日志输出功能;
事件管理模块,用于处理来自外界的连接请求、来自I/O管理模块的I/O事件请求、代理模块的SOCKS4或SOCKS5代理请求和监控模块的监测请求;
内存管理模块,用于为进程管理模块、事件处理模块和I/O管理模块进行内存管理;
I/O管理模块,用于接收和发送网络数据;
代理模块,用于提供代理服务和提供分布式代理机群间协作功能,支持SOCKS4版本和SOCKS5版本的SOCKS协议;
监控模块,用于接收控制中心发送的命令,并根据所述命令执行相应的操作。
2.根据权利要求1所述的可控分布式代理平台,其特征在于,所述代理模块包括SOCKS4模块、SOCKS5模块、cluster模块和upserving模块;
SOCKS4模块,用于提供SOCKS代理服务;
SOCKS5模块,用于提供SOCKS代理服务;
cluster模块,用于处理集群之间配置信息同步,协调不同代理服务器之间的运行状态;
upserving模块,用于完成集群内部连接服务请求转移的功能。
3.根据权利要求2所述的可控分布式代理平台,其特征在于,SOCKS4模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_socks5_handler()、
ss5_socks4_handler()、
ss5_rule_check()、
ss5_4_parse_request()、
ss5_socks4_process_handler()、
ss5_4_process_request()、
ss5_4_connect_serving()、
ss5_4_bind_serving()、
ss5_4_nonblocking_connect_handler()、
ss5_socks_upserving()、
ss5_socks_prepare_connection()、
ss5_socks_prepare_data_queue()、
ss5_install_data_transfer_hanlders()和ss5_handle_read_event();
上述函数模块的调用流程如下:
函数ss5_socks_init_connection()实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,根据所述结构为发送客户请求的客户选择相应的代理服务器,并设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断客户请求类型,设置句柄函数指针为相应的处理函数,并判断客户请求解析状态,如果是SOCKS4代理请求,则进入SOCKS4代理处理流程,调用函数ss5_socks4_handler();
函数ss5_socks4_handler()先调用函数ss5_4_parse_request()实现完整解析客户请求信息的功能,并根据解析的结果填充相关数据结构,再调用函数ss5_rule_check()实现判断IP地址或者域名是否在黑名单中,如果在,则关闭与发送客户请求的客户端的连接的功能;然后调用函数ss5_socks4_process_handler();
函数ss5_socks4_process_handler()实现调用函数ss5_4_process_request()处理客户请求,设置相应事件的处理函数的功能,
函数ss5_4_process_request()实现处理客户请求,根据SOCKS4协议处理相应的请求,获取客户所请求网站的真实地址列表,当客户请求为CONNECT请求时,调用函数ss5_4_connect_serving(),当客户请求为BIND请求时,调用函数ss5_4_bind_serving();
函数ss5_4_connect_serving()实现根据SOCKS4协议,向远端真实服务器发送请求,建立代理系统和远端真实服务器的TCP连接,然后根据TCP连接的建立情况,向发送客户请求的客户返回响应报文,指明是否成功建立转发连接;如果CONNECT连接被拒绝,则代理平台向发送客户请求的客户端发送响应报文后会关闭连接的功能,然后调用函数ss5_4_nonblocking_connect_handler();
函数ss5_4_bind_serving()实现根据SOCKS4协议,处理SOCKS4命令为BIND的情况,建立bind套接字,填充相关数据结构,设置相关句柄指针,向发送客户请求的客户端发送第一次BIND响应报文的功能,然后调用函数ss5_4_nonblocking_connect_handler();
函数ss5_4_nonblocking_connect_handler()实现当本地代理平台无法提供代理服务时,调用函数ss5_socks_upserving(),返回函数ss5_4_nonblocking_connect_handler(),当本地代理平台或其他SOCKS代理平台能提供代理服务时,填充相关数据结构,设置相关句柄,设置无阻塞连接,向发送客户请求的客户端发送第一次响应报文的功能,然后调用函数ss5_socks_prepare_connection();
函数ss5_socks_upserving()实现向其他SOCKS代理平台转发客户请求的功能;
函数ss5_socks_prepare_connection()实现填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_socks_prepare_data_queue(),
函数ss5_socks_prepare_data_queue()实现申请发送缓冲区和接收缓冲区,填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_install_data_transfer_hanlders();
函数ss5_install_data_transfer_hanlders()实现填充和读写相关的数据结构,设置相关句柄的功能,调用函数ss5_handle_read_event(),
函数ss5_handle_read_event()实现读取事件的功能。
4.根据权利要求2所述的可控分布式代理平台,其特征在于,SOCKS5模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_socks5_handler()、
ss5_socks5_handler()、
ss5_rule_check()、
ss5_5_parse_request()、
ss5_socks5_process_handler()、
ss5_5_process_request()、
ss5_5_connect_serving()、
ss5_5_bind_serving()、
ss5_5_nonblocking_connect_handler()、
ss5_socks_upserving()、
ss5_socks_prepare_connection()、
ss5_socks_prepare_data_queue()、
ss5_install_data_transfer_hanlders()、
ss5_5_udp_associate_serving()和ss5_handle_read_event();
上述函数模块的调用流程包括如下:
函数ss5_socks_init_connection(),实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,根据所述结构为发送客户请求的客户选择代理服务器,设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断请求类型,设置句柄函数指针为相应的处理函数,并判断请求解析状态,,若客户端请求为SOCKS5,则进入SOCKS5处理流程,调用函数ss5_socks5_handler();
函数ss5_socks5_handler()先调用函数ss5_5_parse_request()实现完整解析客户请求信息的功能,并根据解析的结果填充相关数据结构,再调用函数ss5_rule_check()实现判断IP地址或者域名是否在黑名单中,如果在,则关闭与发送客户请求的客户端的连接功能,否则,调用函数ss5_socks5_process_handler();
函数ss5_5_parse_request()实现解析客户请求的功能,
函数ss5_socks5_process_handler()实现调用函数ss5_5_process_request()处理客户请求,设置相应事件的处理函数的功能,
函数ss5_5_process_request()实现处理客户请求,根据SOCKS5协议处理相应的请求,获取客户所请求网站的真实地址列表,当客户的请求为CONNECT请求时,调用函数ss5_5_connect_serving(),当客户的请求为BIND请求时,调用函数ss5_5_bind_serving(),当客户的请求为UDP ASSOCAITE请求时,调用函数ss5_5_udp_associate_serving();
函数ss5_5_connect_serving()实现根据SOCKS5协议,向远端真实服务器发送请求,建立代理系统和远端真实服务器的TCP连接,然后根据TCP连接的建立情况,向发送客户请求的客户返回响应报文,指明是否成功建立转发连接;如果CONNECT连接被拒绝,则代理平台向发送客户请求的客户端发送响应报文后会关闭连接的功能,然后调用函数ss5_5_nonblocking_connect_handler();
函数ss5_5_bind_serving()实现根据SOCKS5协议,处理SOCKS5命令为BIND的情况,建立bind套接字,填充相关数据结构,设置相关句柄指针,向发送客户请求的客户端发送第一次BIND响应报文的功能,然后调用函数ss5_5_nonblocking_connect_handler();
函数ss5_5_udp_associate_serving()实现建立bind套接字,该套接字主要用于从发送客户请求的客户端接收UDP数据包,然后填充相关数据结构,设置相关句柄,向发送客户请求的客户端发送响应报文的功能,然后调用函数ss5_5_nonblocking_connect_handler();
函数ss5_5_nonblocking_connect_handler()实现当本地代理平台无法提供代理服务时,调用函数ss5_socks_upserving(),返回函数ss5_5_nonblocking_connect_handler(),当本地代理平台或其他SOCKS代理平台能提供代理服务时,填充相关数据结构,设置相关句柄,设置无阻塞连接,向发送客户请求的客户端发送第一次响应报文的功能,然后调用函数ss5_socks_prepare_connection();
函数ss5_socks_upserving()实现向其他SOCKS代理平台转发客户请求的功能;
函数ss5_socks_prepare_connection()实现填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_socks_prepare_data_queue(),
函数ss5_socks_prepare_data_queue()实现申请发送缓冲区和接收缓冲区,填充相关数据结构,设置相关句柄的功能,然后调用函数ss5_install_data_transfer_hanlders();
函数ss5_install_data_transfer_hanlders()实现填充和读写相关的数据结构,设置相关句柄的功能,调用函数ss5_handle_read_event(),
函数ss5_handle_read_event()实现读取事件的功能。
5.根据权利要求2所述的可控分布式代理平台,其特征在于,cluster模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_socks_cluster_handler()、
ss5_socks_cluster_req_process_handler()、
ss5_socks_cluster_recv_handler()、
ss5_socks_cluster_signal_reload_wblist()、
ss5_cluster_process_init()、
ss5_cluster_nanager_process_handler()、
ss5_socks_cluster_notify_handler()、
ss5_socks_cluster_file_notify(rule_file)、
ss5_socks_cluster_scatter_file()、
ss5_socks_cluster_create_thread()、
ss5_socks_cluster_scatter_thread()和
ss5_socks_cluster_send_file_data();
上述函数模块的调用流程包括如下:
函数ss5_socks_init_connection(),实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,根据该结构为发送客户请求的客户选择代理服务器,设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断出命令类型为CLUSTER时则进入集群处理模块的功能;然后调用函数ss5_socks_cluster_handler();
函数ss5_socks_cluster_handler()实现读取命令CLUSTER完整命令头部,解析命令,设置相关句柄的功能,所述命令CLUSTER由配置文件同步和黑白名单同步两部分构成;然后调用函数ss5_socks_cluster_req_process_handler();
函数ss5_socks_cluster_req_process_handler()实现首先判断待同步文件的名称是否一致,然后在本地打开用于同步的临时文件,填充相关数据结构,设置句柄,向请求端发送响应报文的功能,所述待同步文件包括配置文件和黑白名单文件;然后调用函数ss5_socks_cluster_recv_handler()。
函数ss5_socks_cluster_recv_handler()实现接收同步文件的数据,然后写入临时文件,重命名临时文件并关闭,最后关闭与发送客户请求的客户端连接的功能,当黑白名单文件发生变化时,调用函数ss5_socks_cluster_signal_reload_wblist();
函数ss5_socks_cluster_signal_reload_wblist()实现向各个进程发送信号,命令各个进程重新加载黑白名单的功能;
所述同步文件的数据的获得方法为:
函数ss5_cluster_process_cycle()实现初始化cluster模块的运行环境的功能;然后调用函数ss5_cluster_nanager_process_handler();
函数ss5_cluster_manager_process_handler()实现判断集群选项是否打开,当集群选项打开时调用函数ss5_socks_cluster_notify_handler(),设置超时时间然后调用函数ss5_socks_cluster_notify_handler();
函数ss5_socks_cluster_notify_handler()实现监测配置文件和黑白名单的MD5是否发生变化的功能,当配置文件或黑白名单文件发生变化时,调用函数ss5_socks_cluster_file_notify(rule_file);
函数ss5_socks_cluster_file_notify(rule_file)实现判断文件发生变化的原因,当时所述原因为人为修改或者是程序追加时,填充和更新相关数据结构的功能;然后调用函数ss5_socks_cluster_scatter_file();
函数ss5_socks_cluster_scatter_file()实现打开相应文件,设置该文件内存映射,打开同步线程的功能;然后调用函数ss5_socks_cluster_create_thread();
函数ss5_socks_cluster_create_thread()封装了pthread_create()函数,实现线程创建功能,然后在新创建的线程中调用函数ss5_socks_cluster_scatter_thread();
函数ss5_socks_cluster_scatter_thread()实现向其他服务器发送文件内容,关闭文件的内存映射的功能,然后调用函数ss5_socks_cluster_send_file_data();
函数ss5_socks_cluster_send_file_data()封装了标准send()函数,实现向其他代理服务器发送同步文件的数据的功能。
6.根据权利要求2所述的可控分布式代理平台,其特征在于,upserving模块包括如下函数模块:
ss5_socks_upserving_create_conf()、
ss5_socks_upserving_init_conf()、
ss5_socks_upserving()、
ss5_upserving_create_method()、
ss5_upserving_create_request()和ss5_unix_send();
上述函数模块的调用流程包括如下:
函数ss5_socks_upserving_create_conf()实现打开缓冲区,填充相关数据结构的功能,然后调用函数ss5_socks_upserving_init_conf();
函数ss5_socks_upserving_init_conf()实现设置用来转发的服务器列表的功能,然后调用函数ss5_socks_upserving();
函数ss5_socks_upserving()为upserving模块的主函数,实现完整的函数调用,完成upserving工作的功能,调用函数ss5_upserving_create_method();
函数ss5_upserving_create_method()实现申请缓冲区,填充相关数据结构,设置句柄的功能,然后调用函数ss5_upserving_create_request();
函数ss5_upserving_create_request()实现形成完整的SOCKS5命令请求,作为SOCKS5客户端向远端SOCKS5服务器转发请求。填充相关数据结构,设置句柄的功能,然后调用函数ss5_unix_send();
函数ss5_unix_send()实现向指定网络地址发送数据的功能。
7.根据权利要求1所述的可控分布式代理平台,其特征在于,通过调用下述函数实现监控模块的功能:
监控模块包括如下函数模块:
ss5_socks_init_connection()、
ss5_socks_init_request()、
ss5_socks_handler()、
ss5_socks_parse_request_line()、
ss5_exhibit_handler()、
ss5_exhibit_response_to_client()、
ss5_exhibit_get_event()、
ss5_exhibit_event_add_busy_list()、
ss5_socks_exhibit_notify_worker()、
ss5_exhibit_wakeup_worker_thread()、
ss5_exhibit_init_moduble()、
ss5_create_udp_socket()、
ss5_socks_exhibit_create_thread()、
ss5_exhibit_worker_thread_cycle()、
ss5_exhibit_nanager_thread_handler()、
ss5_exhibit_black_hit_log_status_serving()、
ss5_exhibit_cache_structure_status_serving()、
ss5_exhibit_proxy_serving_status_serving()、
ss5_exhibit_cluster_internal_status_serving()、
ss5_exhibit_os_status_status_serving()、
ss5_exhibit_write_reply()、
ss5_exhibit_notify_write_response()、
ss5_exhibit_send_response_to_client()和ss5_cond_timedwait();
上述函数模块的调用流程包括如下:
函数ss5_exhibit_init_moduble()实现初始化监控模块的功能,然后调用函数ss5_create_udp_socket();
函数ss5_create_udp_socket()实现创建UDP套接字的功能,然后调用函数函数ss5_socks_exhibit_create_thread(),
函数ss5_socks_exhibit_create_thread()封装了pthread_create()函数,实现线程创建功能,然后调用函数ss5_exhibit_worker_thread_cycle();
函数ss5_exhibit_worker_thread_cycle()实现设置相关信号集,调用处理句柄的功能,然后调用函数ss5_exhibit_manager_thread_handler();
函数ss5_exhibit_manager_thread_handler()实现根据监控命令,调用相应的处理函数,向其他工作进程扩散监控命令的功能,当为ALL或BLACK_HIT_LOG命令时调用函数ss5_exhibit_black_hit_log_status_serving(),当为ALL或CACHE_STRUCTURE_STATUS命令时调用函数ss5_exhibit_cache_structure_status_serving(),当为ALL或PROXY_SERVING_STATUS命令时调用函数ss5_exhibit_proxy_serving_status_serving(),当为ALL或CLUSTER_INTERNAL_STATUS命令时调用函数ss5_exhibit_cluster_internal_status_serving(),当为ALL或者OS_STATUS命令时调用函数ss5_exhibit_os_status_status_serving();
函数ss5_exhibit_black_hit_log_status_serving()实现将黑名单访问记录反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_cache_structure_status_serving()实现将缓存信息反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_proxy_serving_status_serving()实现将目前代理发送状态信息反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_cluster_internal_status_serving()实现将集群目前情况反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();。
函数ss5_exhibit_os_status_status_serving()实现将服务器运行状态反馈给监控客户端的功能,然后调用函数ss5_exhibit_write_reply();
函数ss5_exhibit_write_reply()实现向监控客户端发送回馈报文的功能,当前进程不是接收到监测命令的进程时,调用函数ss5_exhibit_notify_write_response(),向接收到监测命令的进程发送已完成监测任务的回馈;当接收到监测命令的进程收到所有其他工作进程的任务完成回馈时,调用函数ss5_exhibit_send_response_to_client();
函数ss5_exhibit_notify_write_response()实现向接收到监控客户端监测命令的进程发送已完成监测任务的回馈的功能,然后调用函数ss5_cond_timedwait(),
函数ss5_exhibit_send_response_td_client()实现接收到监测命令的进程向监控客户端发送数据传输完毕的回馈的功能,然后调用函数ss5_cond_timedwait(),
函数ss5_cond_timedwait()封装了pthread_cond_timedwait()函数,实现发送完成后工作线程进入睡眠状态,当接收到唤醒信号wake up时,调用函数ss5_exhibit_worker_thread_cycle();
所述唤醒信号wake up的获取方法为:
函数ss5_socks_init_connection(),实现初始化连接信息的功能,并在初始化之后调用函数ss5_socks_init_request(),
函数ss5_socks_init_request()实现判断是否超时,并填充相关结构,为客户选择代理服务器,设置各种处理句柄的功能后,调用函数ss5_socks_handler(),
函数ss5_socks_handler()实现完整读取客户请求头部信息的功能,然后调用函数ss5_socks_parse_request_line(),
函数ss5_socks_parse_request_line()实现判断出命令类型为EXHIBIT时则进入监控模块的功能;然后调用函数ss5_exhibit_handler();
函数ss5_exhibit_handler()实现读取EXHIBIT完整命令头部,解析命令,设置相关句柄的功能,然后调用函数ss5_exhibit_response_to_client();
函数ss5_exhibit_send_response_to_client(),实现向监控客户端发送对命令的解析结果功能,然后调用函数ss5_exhibit_get_event(),
函数ss5_exhibit_get_event()实现删除挂起的事件的功能,然后调用函数ss5_exhibit_event_add_busy_list();
函数ss5_exhibit_event_add_busy_list()实现添加事件的功能,然后调用函数ss5_socks_exhibit_notify_worker();
函数ss5_socks_exhibit_notify_worker()实现通知各个工作进程有EXHIBIT命令到达的功能,然后调用函数ss5_exhibit_wakeup_worker_thread();
函数ss5_exhibit_wakeup_worker_thread()实现接待进程唤起自己的工作线程,对监控命令予以处理的功能,并向函数ss5_cond_timedwait()发送唤醒信号wake up。
8.根据权利要求1所述的可控分布式代理平台,其特征在于,进程管理模块包括如下函数模块:
ss5_master_process_cycle()、
ss5_spawn_process()、
ss5_reap_children()、
fork()和woker_process_cycle();
上述函数模块的调用流程包括如下:
函数ss5_master_process_cycle()实现初始化信号集,启动各种类型的工作进程,监听各种信号,进行相应的处理的功能,当需要建立新的进程时,调用函数ss5_spawn_process(),当有子进程退出时,调用函数ss5_reap_children();
函数ss5_spawn_process()实现创建新的进程,完成进程相关信息的初始化的功能,然后调用函数fork();
函数fork()实现创建子进程的功能,然后调用函数ss5_woker_process_cycle();
函数ss5_woker_process_cycle()负责各种信号的监听和处理,负责事件注册与处理,向函数ss5_master_process_cycle()发送重新执行信号respwn;
函数ss5_reap_children()实现重启相应的子进程的功能。
9.根据权利要求1所述的可控分布式代理平台,其特征在于,事件管理模块包括如下函数模块:
ss5_process_event_and_timers()、
ss5_process_event()、
ss5_select_process_events()、
ss5_epoll_process_events()、
ss5_poll_process_events()、
select()、
epoll_wait()、
poll()和event->hanlder();
事件管理模块包括三种事件模型,所述三种事件模型为select模型、poll模型和epoll模型;
上述函数模块的调用流程包括如下:
函数ss5_process_event_and_timers()实现处理事件的功能,若有信号和进程间信号的事件,然后再处理接受事件队列和其他事件队列中的事件,然后调用函数ss5_process_event();
函数指针ss5_process_event(),
若待处理的事件模型为select模型,则调用函数ss5_select_process_events(),
若待处理的事件模型为epoll模型,则调用函数ss5_epoll_process_events(),
若待处理的事件模型为poll模型,则调用函数ss5_poll_process_events();
函数ss5_select_process_events()实现以select模式提交和处理事件的功能;然后调用函数select();
函数ss5_epoll_process_events()实现以epoll模式提交和处理事件的功能,然后调用函数epoll_wait();
函数ss5_poll_process_events()实现以poll模式提交和处理事件的功能,然后调用函数poll();
函数select()为实现允许进程等待和内核等待多个事件中的任何一个发生,并且只在一个或多个事件发生或经历一段指定的时间后才唤醒它,唤醒之后需要轮询各个事件以确保是否发生的功能,然后调用函数event->hanlder();
函数epoll_wait()实现允许进程等待内核多个事件中的任何一个发生,事件发生后内核返回发生事件的详细信息,然后调用函数event->hanlder();
函数poll():为实现允许进程等待和内核等待多个事件中的任何一个发生,并且只在一个或多个事件发生或经历一段指定的之间后才唤醒它,唤醒之后需要轮询各个事件以确保是否发生,处理流设备时能提供额外信息的功能,然后调用函数event->hanlder();
函数指针event->handler(),实现根据事件模型的不同,调用相应的句柄处理函数的功能。
10.根据权利要求1所述的可控分布式代理平台,其特征在于,I/O管理模块包括如下函数模块:
ss5_event_accept()、
ls->connection_handler()、
ss5_unix_recv()、
recv()、
ss5_unix_send()和send();
上述函数模块的调用流程包括如下:
函数ss5_event_accept()实现检测是否有连接事件发生,当有读事件read event发生时,调用函数ss5_unix_recv();当有新事件new event发生时,调用函数ss5_event_accept();当有写事件wirte event发生时,调用函数ss5_unix_send();
函数ss5_unix_recv()封装了标准recv()函数,实现从网络中读取数据的功能,然后调用函数recv();
函数ss5_event_accept()实现接收TCP连接请求的功能,然后调用函数ls->connection_handler();
函数ss5_unix_send()封装了标准send()函数,实现向网络中发送数据的功能,然后调用函数send();
函数ls->connection_handler()实现处理客户请求,建立代理平台与客户之间的TCP连接的功能;
函数recv(),实现从指定的网络套接字接收数据功能;
函数send()实现用于从给定的套接字发送数据功能。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310157321.8A CN103237035B (zh) | 2013-04-28 | 2013-04-28 | 可控分布式代理平台 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310157321.8A CN103237035B (zh) | 2013-04-28 | 2013-04-28 | 可控分布式代理平台 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103237035A true CN103237035A (zh) | 2013-08-07 |
CN103237035B CN103237035B (zh) | 2015-10-28 |
Family
ID=48885052
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310157321.8A Active CN103237035B (zh) | 2013-04-28 | 2013-04-28 | 可控分布式代理平台 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103237035B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104657135A (zh) * | 2015-02-04 | 2015-05-27 | 北京中搜网络技术股份有限公司 | 一种面向cgi服务的通讯方法 |
CN105391813A (zh) * | 2015-10-13 | 2016-03-09 | 北京极科极客科技有限公司 | 一种socks透明代理的方法及装置 |
CN106886570A (zh) * | 2017-01-16 | 2017-06-23 | 网宿科技股份有限公司 | 页面处理方法及装置 |
CN109828964A (zh) * | 2019-02-19 | 2019-05-31 | 北京奇艺世纪科技有限公司 | 一种数据导入方法、装置及电子设备 |
CN112422681A (zh) * | 2020-11-18 | 2021-02-26 | 中盈优创资讯科技有限公司 | 一种跨平台分布式通讯调用方法及装置 |
CN113326120A (zh) * | 2020-02-29 | 2021-08-31 | 杭州迪普科技股份有限公司 | 管理内存的装置和方法 |
CN115051986A (zh) * | 2022-05-25 | 2022-09-13 | 度小满科技(北京)有限公司 | 一种Redis集群进行鉴权的方法和装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2006086718A1 (en) * | 2005-02-11 | 2006-08-17 | Vidiator Enterprises Inc. | Remote monitoring method using mobile terminal and system thereof |
CN101170689A (zh) * | 2007-11-22 | 2008-04-30 | 中兴通讯股份有限公司 | 配置信息同步方法和装置 |
CN101262372A (zh) * | 2008-04-15 | 2008-09-10 | 北京华纬讯电信技术有限公司 | 基于sip服务器集群的视频监控平台操控前端设备的方法 |
CN102158540A (zh) * | 2011-02-18 | 2011-08-17 | 广州从兴电子开发有限公司 | 分布式数据库实现系统及方法 |
CN202019369U (zh) * | 2011-01-12 | 2011-10-26 | 厦门雅迅网络股份有限公司 | 分布式可扩展的服务器远程监控平台 |
-
2013
- 2013-04-28 CN CN201310157321.8A patent/CN103237035B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2006086718A1 (en) * | 2005-02-11 | 2006-08-17 | Vidiator Enterprises Inc. | Remote monitoring method using mobile terminal and system thereof |
CN101170689A (zh) * | 2007-11-22 | 2008-04-30 | 中兴通讯股份有限公司 | 配置信息同步方法和装置 |
CN101262372A (zh) * | 2008-04-15 | 2008-09-10 | 北京华纬讯电信技术有限公司 | 基于sip服务器集群的视频监控平台操控前端设备的方法 |
CN202019369U (zh) * | 2011-01-12 | 2011-10-26 | 厦门雅迅网络股份有限公司 | 分布式可扩展的服务器远程监控平台 |
CN102158540A (zh) * | 2011-02-18 | 2011-08-17 | 广州从兴电子开发有限公司 | 分布式数据库实现系统及方法 |
Non-Patent Citations (1)
Title |
---|
郭小林: "基于主动和被动模式的分布式代理缓存服务器的设计与实现", 《中国优秀硕士学位论文全文数据库信息科技辑》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104657135A (zh) * | 2015-02-04 | 2015-05-27 | 北京中搜网络技术股份有限公司 | 一种面向cgi服务的通讯方法 |
CN105391813A (zh) * | 2015-10-13 | 2016-03-09 | 北京极科极客科技有限公司 | 一种socks透明代理的方法及装置 |
CN106886570A (zh) * | 2017-01-16 | 2017-06-23 | 网宿科技股份有限公司 | 页面处理方法及装置 |
CN106886570B (zh) * | 2017-01-16 | 2020-11-13 | 网宿科技股份有限公司 | 页面处理方法及装置 |
CN109828964A (zh) * | 2019-02-19 | 2019-05-31 | 北京奇艺世纪科技有限公司 | 一种数据导入方法、装置及电子设备 |
CN109828964B (zh) * | 2019-02-19 | 2021-11-26 | 北京奇艺世纪科技有限公司 | 一种数据导入方法、装置及电子设备 |
CN113326120A (zh) * | 2020-02-29 | 2021-08-31 | 杭州迪普科技股份有限公司 | 管理内存的装置和方法 |
CN113326120B (zh) * | 2020-02-29 | 2023-12-26 | 杭州迪普科技股份有限公司 | 管理内存的装置和方法 |
CN112422681A (zh) * | 2020-11-18 | 2021-02-26 | 中盈优创资讯科技有限公司 | 一种跨平台分布式通讯调用方法及装置 |
CN115051986A (zh) * | 2022-05-25 | 2022-09-13 | 度小满科技(北京)有限公司 | 一种Redis集群进行鉴权的方法和装置 |
CN115051986B (zh) * | 2022-05-25 | 2024-02-20 | 度小满科技(北京)有限公司 | 一种Redis集群进行鉴权的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN103237035B (zh) | 2015-10-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103237035B (zh) | 可控分布式代理平台 | |
Jhawar et al. | Fault tolerance and resilience in cloud computing environments | |
Junqueira et al. | ZooKeeper: distributed process coordination | |
WO2017113561A1 (zh) | 一种信息拦截处理方法及终端、计算机存储介质 | |
US9699257B2 (en) | Online business method, system and apparatus based on open application programming interface | |
Cui et al. | Paxos made transparent | |
WO2019195969A1 (zh) | 数据同步处理的方法和装置 | |
US20020156932A1 (en) | Method and apparatus for providing parallel execution of computing tasks in heterogeneous computing environments using autonomous mobile agents | |
CN104205109B (zh) | 持续性和弹性的工作者进程 | |
CN108304247A (zh) | 访问摄像头的方法和装置、服务器、可读存储介质 | |
US10885052B2 (en) | Database process with virtual nodes | |
TW200417190A (en) | System and method for high performance shared web hosting | |
CN111033633B (zh) | 将数据记录上传到云存储库 | |
CN104410674B (zh) | 一种单点登录系统的web会话同步方法 | |
CN111083113A (zh) | 拟态分发系统、方法及介质 | |
US9021008B1 (en) | Managing targeted scripts | |
Weißbach et al. | Decentrally coordinated execution of adaptations in distributed self-adaptive software systems | |
CN112035276A (zh) | 一种基于java的跨平台可扩展的RPC框架设计方法 | |
Celesti et al. | Integration of clever clouds with third party software systems through a rest web service interface | |
Harchol et al. | FTvNF: Fault tolerant virtual network functions | |
Bouchenak et al. | From autonomic to self-self behaviors: The jade experience | |
WO2012167536A1 (zh) | 多线程协同仿真方法及系统 | |
JP6205013B1 (ja) | アプリケーション利用システム | |
Adeel-Ur-Rehman et al. | System administration of ATLAS TDAQ computing environment | |
Gries et al. | Texts in Computer Science |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |