一种AAA高并发认证方法及系统与流程

文档序号:14723803发布日期:2018-06-19 02:45阅读:300来源:国知局

本申请涉及通信技术领域,尤其涉及一种AAA高并发认证方法及系统。



背景技术:

现有技术示出的AAA认证方法及系统中,通常采用多线程机制,来提高用户认证的并发量。具体的,终端设备发送认证报文,网卡将认证报文存储在UDP缓冲区,一个接收线程专门负责接收来自UDP缓冲区的认证报文,并将这些认证报文分别派发给多个业务线程,多个业务线程根据认证报文和响应的认证策略,完成对终端设备的认证,并且,多个业务线程通过直接修改数据库来改变认证用户的实时信息,包括认证记录、上线时间、在线时长等。

然而,上述多线程机制的认证方法中,并无线程管理机制。多个业务线程之间的并发执行,以及多个业务线程与数据库间的数据交互,均会抢占CUP资源,从而导致多线程之间的调度完全依赖于CUP资源,一旦系统负载过重,一方面,处理速度的减慢,会导致大量终端设备连接超时,超时之后往往会进行重发,这更加重了系统的负载,另一方面,接收线程不能持续消费UDP缓冲区中的认证报文,而网卡会持续向UDP缓冲区中生产认证报文,当UDP缓冲区满时,就会出现丢包现象。



技术实现要素:

本申请提供一种AAA高并发认证方法及系统,以解决现有AAA认证过程容易出现丢包现象的技术问题。

第一方面,本申请提供了一种AAA高并发认证方法,该方法包括:

终端设备发送认证信息;所述认证信息包括连接请求;

Netty服务端接收所述认证信息,并根据所述连接请求,与所述终端设备建立连接;

Netty服务端对所述认证信息进行解析,并将所述认证信息分发给AAA认证服务器的认证模块;

AAA认证服务器的认证模块接收所述认证信息,根据所述认证信息和Redis缓存中的历史认证信息,对终端设备进行认证;以及,对所述Redis缓存中的历史认证信息进行更新。

在AAA认证过程高并发的技术场景中,本实现方式引用了Netty服务端,Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个终端设备的客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起,也不需要为线程间的切换而浪费CPU资源,能够解决现有AAA认证技术中网络丢包的技术问题。另外,通过Redis缓存存储信息,降低磁盘IO,提高认证效率。

进一步,该方法还包括:

AAA认证服务器的认证模块将认证结果发送给Netty服务端;

Netty服务端接收并解析所述认证结果,通过NIO线程将所述认证结果发送给终端设备。

Netty服务端底层采用Java NIO技术,采用NIO技术就意味着,处理IO过程中,不会发生无意义的阻塞,也就不需要为了“阻塞需求”启动加重服务器负载的线程数,本实现方式,能够节省CPU资源,提高认证效率,避免网络丢包。

进一步,该方法还包括:

AAA认证服务器的信息同步模块周期性将所述Redis缓存中的历史认证信息同步到MySQL数据库。

采用本实现方式,由于AAA认证服务器设置有Redis缓存,认证所需的历史认证信息存储在Redis缓存中,在认证过程中,通过查询Redis缓存降低磁盘IO,并周期性将所述Redis缓存中的历史认证信息同步到MySQL数据库中。

进一步,所述Netty服务端对所述认证信息进行解析,并将所述认证信息分发给AAA认证服务器的认证模块,包括:

Netty服务端通过Acceptor类接收所述认证信息;

将所述认证信息存储在ByteBuffer中;

通过Dispatch将从ByteBuffer中提取出的关键字派发给指定的Handler进行解析,并分发给AAA认证服务器的认证模块。

在本实现方式中,Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。Netty提供组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。

进一步,所述AAA认证服务器的认证模块包括多个业务线程;

所述对Redis缓存中的历史认证信息进行更新,包括:

业务线程从所述Redis缓存中的历史认证信息中,查找与本次认证信息相匹配的条目;所述本次认证信息包括用户信息、认证时间以及下线时间;

以及,根据本次认证信息,修改查找到的所述相匹配的条目。

采用本实现方式,当历史认证用户的用户信息发生变化时,及时更新Redis缓存中的历史认证信息,当产生新的认证用户时,及时将这些新的认证用户的认证信息添加到Redis历史认证信息中,以保证Redis缓存中的历史认证信息的有效性,为AAA认证过程提供准确的数据依据。

另一方面,本申请实施例提供一种AAA高并发认证系统,该系统包括:Netty服务端和AAA认证服务器;所述AAA认证服务器包括认证模块;

所述Netty服务端,用于接收终端设备发送的认证信息,并根据所述认证信息中的连接请求,与所述终端设备建立连接;用于对所述认证信息进行解析,并将所述认证信息分发给所述AAA认证服务器的认证模块;

所述AAA认证服务器的认证模块,用于接收所述Netty服务端发送的认证信息,根据所述认证信息和Redis缓存中的历史认证信息,对终端设备进行认证;以及,用于对所述Redis缓存中的历史认证信息进行更新。

进一步,所述AAA认证服务器的认证模块,还用于将认证结果发送给Netty服务端;

所述Netty服务端,还用于接收并解析所述认证结果,通过NIO线程将所述认证结果发送给终端设备。

进一步,所述AAA认证服务器还包括信息同步模块;

所述信息同步模块,用于周期性将所述Redis缓存中的历史认证信息同步到MySQL数据库。

进一步,所述Netty服务端,按照下述步骤,对所述认证信息进行解析,并将所述认证信息分发给AAA认证服务器的认证模块:

通过Acceptor类接收所述认证信息;

将所述认证信息存储在ByteBuffer中;

通过Dispatch将ByteBuffer派发给指定的Handler进行解析,并分发给AAA认证服务器的认证模块。

进一步,所述AAA认证服务器的认证模块包括多个业务线程;

所述业务线程,用于从所述Redis缓存中的历史认证信息中,查找与本次认证信息相匹配的条目;所述本次认证信息包括用户信息、认证时间以及下线时间;

以及,根据本次认证信息,修改查找到的所述相匹配的条目。

由以上技术方案可知,本申请提供的AAA高并发认证方法及系统,引用了Netty服务端,Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个终端设备的客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起,也不需要为线程间的切换而浪费CPU资源,能够解决现有AAA认证技术中网络丢包的技术问题。另外,通过Redis缓存存储信息,降低磁盘IO,提高认证效率。

附图说明

为了更清楚地说明本申请的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本申请一个实施例的实际组网示意图;

图2为本申请创建Netty服务端的时序图;

图3为本申请提供的AAA高并发认证方法的一个实施例流程示意图;

图4为本申请提供的AAA高并发认证方法的另一个实施例流程示意图;

图5本申请提供的AAA高并发认证系统的结构示意图。

具体实施方式

网络通信技术领域中,通常需要进行AAA(Authentication、Authorization、Accounting)网络安全系统的认证,例如,PPP(点对点)协商报文携带AAA认证信息进行认证,并使用L2TP(第二层隧道协议)等可承载PPP的报文进行以太网上的报文传递;L2TP和dhcp在获取IP地址时,使用AAA对客户端进行认证;ftp连接设备时,使用AAA对客户端进行认证;其中,AAA都起到认证身份和权限的功能。

现有技术示出的AAA高并发认证方法及系统中,通常采用多线程机制,来提高用户认证的并发量。然而,在现有多线程机制的认证方法中,并无线程管理机制。多个业务线程之间的并发执行,以及多个业务线程与数据库间的数据交互,均会抢占CUP资源,从而导致多线程之间的调度完全依赖于CUP资源,一旦系统负载过重,一方面,处理速度的减慢,会导致大量终端设备连接超时,超时之后往往会进行重发,这更加重了系统的负载,另一方面,接收线程不能持续消费UDP缓冲区中的认证报文,而网卡会持续向UDP缓冲区中生产认证报文,当UDP缓冲区满时,就会出现丢包现象。

参见图1,为本申请一个实施例的实际组网示意图,在AAA认证服务器上,配置有Redis缓存。在AAA认证高并发的应用场景中,终端设备(如手机、PC或平板电脑等)通过接入设备与Netty服务端通信,由Netty服务端将终端设备的认证信息转发给AA认证服务器,并将认证服务器产生的认证结果反馈给终端终端设备。

在实际组网应用中,预先创建Netty服务端,并将创建的Netty服务端设置在AAA认证服务器内部或独立设置,本申请不做限定。图2为创建Netty服务端的时序图,参阅图2,创建Netty服务端过程如下:

步骤201:创建ServerBootstrap实例;

ServerBootstrap是Netty服务端的启动辅助类,它提供了一系列的方法用于设置服务端启动相关的参数。底层通过门面模式对各种能力进行抽象和封装,尽量不需要用户跟过多的底层API打交道,降低开发难度。

步骤202:设置并绑定Reactor线程池;

Netty的Reactor线程池是EventLoopGroup,它实际就是EventLoop的数组。EventLoop的职责是处理所有注册到本线程多路复用器Selector上的Channel,Selector的轮询操作由绑定的EventLoop线程run方法驱动,在一个循环体内循环执行。

步骤203:设置并绑定服务端Channel;

作为NIO服务端,需要创ServerSocketChannel,Netty对原生的NIO类库进行了封装,对应实现是NioServerSocketChannel。对于用户而言,不需要关心服务端Channel的底层实现细节和工作原理,只需要指定具体使用哪种服务端Channel即可。因此,Netty的ServerBootstrap方法提供了channel方法用于指定服务端Channel的类型。

步骤204:链路建立的时候创建并初始化ChannelPipeline;

ChannelPipeline并不是NIO服务端必需的,它本质就是一个负责处理网络事件的职责链,负责管理和执行ChannelHandler。网络事件以事件流的形式在ChannelPipeline中流转,由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler的执行。

步骤205:初始化ChannelPipeline完成之后,添加并设置ChannelHandler;

ChannelHandler是Netty提供给用户定制和扩展的关键接口。利用ChannelHandler用户可以完成大多数的功能定制,例如消息编解码、心跳、安全认证、TSL/SSL认证、流量控制和流量整形等。

步骤206:绑定并启动监听端口;

在绑定监听端口之前系统会做一系列的初始化和检测工作,完成之后,会启动监听端口,并将ServerSocketChannel注册到Selector上监听终端设备客户端连接。

步骤207:Selector轮询;

由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合。

步骤208:当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法,最终调度并执行ChannelHandler;

步骤209:执行Netty系统ChannelHandler和用户添加定制的ChannelHandler。

ChannelPipeline根据网络事件的类型,调度并执行ChannelHandler。

本申请提供的AAA高并发认证方法及系统,引用了Netty服务端,Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个终端设备的客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起,也不需要为线程间的切换而浪费CPU资源,能够解决现有AAA认证技术中网络丢包的技术问题。

图3为本申请提供的AAA高并发认证方法的一个实施例流程示意图,由图3可知,一种AAA高并发认证方法,包括:

步骤301,终端设备发送认证信息;所述认证信息包括连接请求;

步骤302,Netty服务端接收所述认证信息,并根据所述连接请求,与所述终端设备建立连接;

在本申请中,Netty服务端具有三种可选的高效线程模型,包括Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型。通过在启动辅助类中创建不同的EventLoopGroup实例并通过适当的参数配置,就可以支持上述三种Reactor线程模型。

在本申请的一些小容量应用场景中,可选用Reactor单线程模型。由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。例如,通过Acceptor接收终端设备客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。

在本申请的一些大负载、高并发的应用场景中,可选用主从Reactor多线程模型。Netty服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel注册到IO线程池(sub reactor线程池)的某个IO线程上,由它负责SocketChannel的读写和编解码工作。Acceptor线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的IO线程上,由IO线程负责后续的IO操作。

步骤303,Netty服务端对所述认证信息进行解析,并将所述认证信息分发给AAA认证服务器的认证模块;

参阅图4,根据本申请实施例,所述Netty服务端对所述认证信息进行解析,并将所述认证信息分发给AAA认证服务器的认证模块,包括:

步骤401,Netty服务端通过Acceptor类接收所述认证信息;

步骤402,将所述认证信息存储在ByteBuffer中;

步骤403,通过Dispatch将ByteBuffer派发给指定的Handler进行解析,并分发给AAA认证服务器的认证模块。

在本实现方式中,Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。Netty提供组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。

步骤304,AAA认证服务器的认证模块接收所述认证信息,根据所述认证信息和Redis缓存中的历史认证信息,对终端设备进行认证;以及,对所述Redis缓存中的历史认证信息进行更新。

在本申请中,所述AAA认证服务器的认证模块包括多个业务线程;

所述对Redis缓存中的历史认证信息进行更新,包括:

业务线程从所述Redis缓存中的历史认证信息中,查找与本次认证信息相匹配的条目;所述本次认证信息包括用户信息、认证时间以及下线时间;

以及,根据本次认证信息,修改查找到的所述相匹配的条目。

采用本实现方式,当历史认证用户的用户信息发生变化时,及时更新Redis缓存中的历史认证信息,当产生新的认证用户时,及时将这些新的认证用户的认证信息添加到Redis历史认证信息中,以保证Redis缓存中的历史认证信息的有效性,为AAA认证过程提供准确的数据依据。

由上述实施例可知,本申请提供的AAA高并发认证方法,引用了Netty服务端,Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起,也不需要为线程间的切换而浪费CPU资源,能够解决现有AAA认证技术中网络丢包的技术问题。另外,通过Redis缓存存储信息,降低磁盘IO,提高认证效率。

在一些实施例中,上述AAA高并发认证方法,还包括:

AAA认证服务器的信息同步模块周期性将所述Redis缓存中的历史认证信息同步到MySQL数据库。

采用本实现方式,由于AAA认证服务器设置有Redis缓存,认证所需的历史认证信息存储在Redis缓存中,在认证过程中,通过查询Redis缓存降低磁盘IO,并周期性将所述Redis缓存中的历史认证信息同步到MySQL数据库中。

在另一些实施例中,上述AAA高并发认证方法,还包括:

AAA认证服务器的认证模块将认证结果发送给Netty服务端;

Netty服务端接收并解析所述认证结果,通过NIO线程将所述认证结果发送给终端设备。

Netty服务端底层采用Java NIO技术,采用NIO技术就意味着,处理IO过程中,不会发生无意义的阻塞,也就不需要为了“阻塞需求”启动加重服务器负载的线程数,本实现方式,能够节省CPU资源,提高认证效率,避免网络丢包。

根据本申请实施例提供的一种AAA高并发认证方法,参阅图5,本申请实施例还提供一种AAA高并发认证系统,包括:

Netty服务端100和AAA认证服务器200;所述AAA认证服务器200包括认证模块210;

所述Netty服务端100,用于接收终端设备发送的认证信息,并根据所述认证信息中的连接请求,与所述终端设备建立连接;用于对所述认证信息进行解析,并将所述认证信息分发给所述AAA认证服务器200的认证模块210;

所述AAA认证服务器200的认证模块210,用于接收所述Netty服务端100发送的认证信息,根据所述认证信息和Redis缓存中的历史认证信息,对终端设备进行认证;以及,用于对所述Redis缓存中的历史认证信息进行更新。

进一步,所述AAA认证服务器200的认证模块210,还用于将认证结果发送给Netty服务端100;

所述Netty服务端100,还用于接收并解析所述认证结果,通过NIO线程将所述认证结果发送给终端设备。

进一步,所述AAA认证服务器200还包括信息同步模块220;

所述信息同步模块220,用于周期性将所述Redis缓存中的历史认证信息同步到MySQL数据库。

进一步,所述Netty服务端100,按照下述步骤,对所述认证信息进行解析,并将所述认证信息分发给AAA认证服务器200的认证模块210:

通过Acceptor类接收所述认证信息;

将所述认证信息存储在ByteBuffer中;

通过Dispatch将ByteBuffer派发给指定的Handler进行解析,并分发给AAA认证服务器的认证模块。

进一步,所述AAA认证服务器200的认证模块210包括多个业务线程;

所述业务线程,用于从所述Redis缓存中的历史认证信息中,查找与本次认证信息相匹配的条目;所述本次认证信息包括用户信息、认证时间以及下线时间;

以及,根据本次认证信息,修改查找到的所述相匹配的条目。

由以上技术方案可知,本申请提供的AAA高并发认证方法及系统,引用了Netty服务端,Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起,也不需要为线程间的切换而浪费CPU资源,能够解决现有AAA认证技术中网络丢包的技术问题。另外,通过Redis缓存存储信息,降低磁盘IO,提高认证效率。

具体实现中,本发明还提供一种计算机存储介质,其中,该计算机存储介质可存储有程序,该程序执行时可包括本发明提供的AAA高并发认证方法的各实施例中的部分或全部步骤。所述的存储介质可为磁碟、光盘、只读存储记忆体(英文:read-only memory,简称:ROM)或随机存储记忆体(英文:random access memory,简称:RAM)等。

本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。

本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于图5所示实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。

以上所述的本发明实施方式并不构成对本发明保护范围的限定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1