一种基于用户态协议栈的并发推送服务方法和系统
技术领域
本发明涉及消息推送的技术领域,尤其涉及一种基于用户态协议栈的并发 推送服务方法和系统。
背景技术
近年来随着互联网技术和无线通信技术的蓬勃发展,我们进入了信息爆炸 的时代。实时推送到端侧用户。对于用户,对信息的时效性需求与日俱增;对 于信息服务商,通过有效的信息提供方式获取更大的用户粘性也变得尤为重要。 推送服务应运而生,推送服务通过同联网端侧之间建立长连接,将内容服务商 的信息但是随着近年来端侧用户数量的暴增,推送服务需要同亿级甚至十亿级 别的端侧维护长连接,这对于推送服务是一个巨大的挑战。
发明内容
本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较 佳实施例。在本部分以及本申请的说明书摘要和发明名称中可能会做些简化或 省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略 不能用于限制本发明的范围。
鉴于上述现有存在的问题,提出了本发明。
因此,本发明解决的一个技术问题是:提供一种基于用户态协议栈技术的 单机实现亿级海量并发的推送服务,借助用户态协议栈底层技术有效解决海量 用户的长连接维护问题。
为解决上述技术问题,本发明提供如下技术方案:一种基于用户态协议栈 的并发推送服务方法,包括以下步骤,定义用户态协议栈模块;推送逻辑模块 利用所述用户态协议栈模块与端侧维持长连接;建立所述推送逻辑模块与所述 端侧的仿安全传输层协议交互的安全通道;私有协议交互模块作为连接的应用 层协议;所述推送逻辑模块通过所述用户态协议栈模块向所述端侧进行收发数 据报文。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述定义用户态协议栈模块还包括以下步骤,针对不同场景进行通 用的处理,将消耗中央处理器的操作从所述用户态协议栈模块的业务逻辑中替 代或删除;将网卡模块在操作系统协议栈中去除后绑定到所述用户态协议栈模 块。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述维持长连接包括以下步骤,轮询操作,推送服务内线程通过网 卡队列进行轮询收取地址包的操作;用户态驱动,所有的网卡操作均在用户态 完成;亲和性和独占,利用线程的中央处理器亲和绑定,针对使用的多队列网 卡,绑定相应数量的中央处理器进行一一轮询操作。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述私有协议交互模块使用自定义的二进制协议作为连接的应用层 协议,且所述二进制协议包括可扩展的二进制协议头和具体的消息内容。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:还包括以下的操作步骤,二进制私有协议;所述端侧集成软件开发 工具包;服务端网卡初始化;所述用户态协议栈模块报文读取;推送服务流程 的逻辑处理。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述逻辑处理包括端侧上线、所述端侧心跳、消息推送和端侧下线。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述端侧上线包括以下步骤,所述端侧使用预制的服务端公钥对端 侧公钥进行非对称加密,将加密信息通过客户端推送模块发送至所述服务端; 所述服务端使用其私钥对加密信息进行解密,得到对应上线所述端侧的所述端 侧公钥;对所述端侧公钥进行哈希处理得到所述端侧的设备标示符;所述服务 端生成安全随机数作为后续安全通道的对称密钥,使用上线的所述端侧公钥对 其加密;将所述设备标示符和生成的密文发送到所述端侧;所述端侧接收到所 述设备标示符和所述密文,对所述密文使用自己的私钥进行加密,得到对称密 钥;所述端侧使用所述对称密钥对所述设备标示符进行加密,发送到所述服务 端进行最后的上线确认,若确认成功则上线成功,所述服务端将对应的端侧信 息存放在本地内存的设备表。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述端侧心跳包括以下步骤,所述端侧每隔一时间段向所述服务端 进行心跳交互;所述服务端收到心跳请求,对维护的设备心跳信息进行更新, 确认所述设备为连接中设备,此状态下向该设备推送消息;所述服务端向所述 端侧发送心跳响应。
作为本发明所述的基于用户态协议栈的并发推送服务方法的一种优选方 案,其中:所述消息推送包括以下步骤,所述服务端在维护的设备表中查到设 备信息,使用协商的对称密钥对推送消息进行加密处理,并向对应的所述端侧 进行消息的发送;所述端侧收到推送的消息,使用对称密钥进行解密,得到最 终的推送消息;所述端侧向所述服务端发送推送响应。
本发明解决的另一个技术问题是:提供一种基于用户态协议栈的并发推送 服务系统,应用上述并发推送服务方法。
为解决上述技术问题,本发明提供如下技术方案:一种基于用户态协议栈 的并发推送服务系统,包括服务端,所述推送服务包括推送逻辑模块、用户态 协议模块和网卡模块,所述网卡模块与所述用户态协议模块连接,所述推送逻 辑模块与所述用户态协议模块连接;通信模块,所述通信模块与所述服务器通 过所述网卡模块连接通信;端侧,其通过所述通信模块向所述服务端并发推送 服务,且所述端侧还包括客户端推送模块,所述客户端推送模块与所述推送逻 辑模块交互共同完成推送服务。
本发明的有益效果:一是通过实现定制的协议栈同端侧维持长连接,能够 充分的挖掘网卡的潜能和利用网络带宽,有效的应对海量连接带来的大吞吐量 数据的场景;二是实现安全性连接建立保证了维护通道的信息安全性;三是实 现自定义的私有协议交互,交互消息简易小巧,实现节省流量和节约带宽的优 势。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需 要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的 一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下, 还可以根据这些附图获得其它的附图。其中:
图1为本发明第一种实施例所述基于用户态协议栈的并发推送服务方法的 推送服务流程图;
图2为本发明第一种实施例所述用户态的网络协议栈的结构示意图;
图3为本发明第二种实施例所述基于用户态协议栈的并发推送服务系统的 推送组网图;
图4为本发明所述并发数量与流量消耗的仿真结果示意图;
图5为本发明所述流量消耗的仿真结果示意图;
图6为本发明所述数据延迟的仿真结果示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书 附图对本发明的具体实施方式做详细的说明,显然所描述的实施例是本发明的 一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通人员 在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的 保护的范围。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明 还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不 违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例 的限制。
其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少 一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在 一个实施例中”并非均指同一个实施例,也不是单独的或选择性的与其他实施 例互相排斥的实施例。
本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明, 表示器件结构的剖面图会不依一般比例作局部放大,而且所述示意图只是示例, 其在此不应限制本发明保护的范围。此外,在实际制作中应包含长度、宽度及 深度的三维空间尺寸。
同时在本发明的描述中,需要说明的是,术语中的“上、下、内和外”等 指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述 本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、 以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第 一、第二或第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
本发明中除非另有明确的规定和限定,术语“安装、相连、连接”应做广 义理解,例如:可以是固定连接、可拆卸连接或一体式连接;同样可以是机械 连接、电连接或直接连接,也可以通过中间媒介间接相连,也可以是两个元件 内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在 本发明中的具体含义。
实施例1
参照图1~2的示意,推送服务通过同联网的客户端之间建立长连接,将内 容服务商的信息实时推送到客户端用户,为了解决推送服务需要同亿级甚至十 亿级别的客户端维护长连接的问题,且作为一个服务端推送业务需要同海量用 户维持长连接,需要处理长连接中的业务交互和心跳。因此本实施例中提出一 种基于用户态协议栈技术的单机实现亿级海量并发的推送服务,借助用户态协 议栈底层技术,能够有效解决海量用户的长连接维护问题。一般情况下,数据 包到了网卡之后是由内核态协议栈处理的,内核态协议栈处理的时候需要调用 到CPU资源,当数据包非常多的时候就会因为CPU的处理能力而构成瓶颈。 但是内核态协议栈是不允许用户处理数据包的,本实施例是使用用户态协议栈 来替换内核态协议栈,从而实现用户处理数据包,而用户态协议栈处理数据包 调不调用CPU资源是自己做主的,就不会因为CPU的处理能力构成瓶颈。
具体的,该基于用户态协议栈的并发推送服务方法包括以下步骤,
定制的tcp协议栈同端侧200维持长连接:
定义用户态协议栈模块102,本步骤中通过自定义用户态协议栈模块102, 即定制用户态协议栈模块102,定制指的在Linux的网络协议栈的tcp协议中裁 剪一部分功能得到定制的用户态tcp协议栈;由于Linux的网络协议栈的tcp 协议需要针对各种场景进行通用的处理,一些消耗CPU(中央处理器)的操作 可以从用业务逻辑中替代掉。具体的实现是:通过在用户态实现自定义的tcp 协议栈,裁减掉部分可以通过业务逻辑替代的功能,例如裁剪掉的功能:超时 与重传,该功能是为了保证消息传输的可靠性,可以将该功能上提到上层的业 务逻辑中,不影响连接功能的性能;或者是裁剪掉定时器功能;在tcp层裁减 掉了部分不影响链路的功能。同时将网卡模块103在操作系统协议栈中去除后 绑定到删除部分功能的用户态协议栈模块102中最终实现定义。上述“借助用 户态协议栈底层技术”就是此处描述的卸载网卡模块103的内核态,并加载用 户态协议的方式。
推送逻辑模块101利用用户态协议栈模块102与端侧200维持长连接,该 维持长连接的实现对比操作系统的网络协议栈,还包括以下步骤。
轮询操作,相对于操作系统的网络协议栈存在的中断消耗,操作系统协议 栈存在网卡每收到一个数据包就会触发一个中断,如果小包的数据量特别大的 时候,中断被触发的数量也变的十分可怕,导致大部分的计算资源都被用于处 理中断,从而导致性能下降。因此本步骤中轮询操作进行优化,包括服务内线 程通过网卡队列进行轮询完成收取IP包的操作,可以避免中断上下文切换的 开销,可以有效的应对大吞吐量的数据处理场景。
内核态驱动,相对于操作系统的网络协议栈存在的内存拷贝消耗,操作系 统协议栈存在数据包到达网卡设备,通过中断的方式唤醒CPU(中央处理器), 在内核态解包完成后,将数据从内核态拷贝到用户态,因此在数据报文特别大 的场景下,内存拷贝的消耗也非常大。针对上述内存拷贝消耗,本实施例提出 用户态驱动,即所有的网卡操作在用户态完成,可以避免不必要的内核态和用 户态之间的内存拷贝开销,又可以避免对网卡的系统调用,即用户态协议不需 要操作系统对网卡进行系统调用,但是任需要操作系统调用内存和CPU等资 源。
亲和性和独占,相对于操作系统的网络协议栈存在CPU的亲和性和独占, 针对使用的多队列网卡,我们绑定相应数量的CPU进行一一轮询操作,本步 骤利用线程的CPU亲和绑定能够避免线程在核之间的切换造成的性能损耗。
通过实现定制的tcp协议栈同端侧维持长连接,能够充分的挖掘网卡的潜 能和利用网络带宽,有效的应对海量连接带来的大吞吐量数据的场景,挖掘网 卡的潜能体现在用户态协议,利用网络带宽体现在长连接和二进制私有协议的 精简。
仿TLS交互的安全性连接建立:
建立推送逻辑模块101与端侧200的仿安全传输层协议交互的安全通道, 实现仿TLS(即安全传输层协议)交互的安全性连接建立,通过使用加解密方 式进行对称密钥的交换,完成最终安全通道的建立。
本实施例中安全通道的两端是服务端100和端侧200,具体建立连接的过 程如下:端侧200使用预制的服务端100的服务端公钥对端侧200的端侧公钥 进行非对称加密,端侧200通过其内的客户端推送模块201将该加密信息发送 到服务端100;服务端100使用其私钥对加密信息进行解密,得到对应上线端 侧的公钥,并生成安全随机数作为后续安全通道的对称密钥,使用端侧的公钥 对其加密;端侧200收到密文,对密文使用自己的私钥进行加密,得到对称密 钥,自此安全通道的密钥协商完成,保证了维护通道的信息安全性。
实现自定义的私有协议交互:
私有协议交互模块104作为连接的应用层协议,该方式交互消息简易小巧, 实现节省流量和节约带宽的优势,二进制协议只保存了必须的信息,在需要传 递大量信息的时候,对于带宽的节省是非常明显的。该私有协议交互模块104 使用自定义的二进制协议作为连接的应用层协议,且二进制协议包括可扩展的 二进制协议头(可扩展的意思是指可以通过版本号的升级进行协议内容的升级、 微调或者更改)和具体的消息内容。协议是用来遵守的,客户端和服务端的推 送sdk和服务端的推送模块遵守了协议。
如下表1为二进制私有协议:
版本号 |
消息类型 |
请求ID |
设备ID |
校验和 |
消息体 |
1Byte |
1Byte |
4Byte |
8Byte |
1Byte |
>=0Byte |
版本号:版本扩展
消息类型:上线、下线、心跳、推送请求、推送响应。
请求ID:推送消息的ID。
设备ID:目标端侧的ID。
校验和:对消息进行CRC完整性校验。
消息体:待推送的消息内容。
需要说明的是,二进制协议就是一串字节流(01机器码),一般包括定长 的包头和可扩展变长的包体。上表1中Byte表明数据的长度,字节(Byte)是 计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八 位,也在一些计算机编程语言中表示数据类型和语言字符,00000000为一个字 节。
二进制私有协议是本实例自己定义在应用层的协议,二进制私有协议的特 点体现在协议传输的内容全都是字节流(01机器码);协议规定了定长的消息 头和不定长消息体,消息头中的信息有版本号、消息类型、请求ID、设备ID、 校验和等用于表明消息的字段,消息体用于放置具体的消息内容,优点是通过 字节流传递信息十分节省流量,减少损耗,传输同样的二进制协议相对比文本 协议更加具有省流量的优点。
并发推送服务的操作流程:
推送逻辑模块101通过用户态协议栈模块102向端侧200进行收发数据报 文。具体的,还包括以下的操作步骤,
二进制私有协议的建立;
端侧200集成软件开发工具包,包括端侧200提前集成服务端100的软件 开发包,并在软件开发包中预制服务端100的合法公钥信息;端侧200软件开 发包初始化,并生成随机的公私钥对;
服务端100网卡初始化,包括将网卡模块103在操作系统协议栈中删除掉, 即在操作系统中关闭指定网络设备/网卡;加载UIO模块,将网卡模块103绑 定到用户态协议栈模块102,从该协议栈进行收发数据报文的操作;
用户态协议栈模块102报文读取,包括轮询网卡队列获取报文,并校验报 文;基于TCP/IP协议,从以太网包的首部判断上层协议是否是IP协议,不是 丢弃,是取出IP报文再通过IP报文首部判断上层协议是否为TCP协议,不是 丢弃,是取出TCP报文;将获取的TCP报文交给推送逻辑模块101处理;
推送服务流程的逻辑处理,包括端侧200上线、端侧200心跳、消息推送 和端侧200下线。具体的,还包括以下过程:
端侧200的上线:
端侧200使用预制的服务端公钥对端侧公钥进行非对称加密,将加密信息 通过客户端推送模块201发送至服务端100;服务端100使用其私钥对加密信 息进行解密,得到对应上线端侧200的端侧公钥;对端侧公钥进行哈希处理得 到端侧200的设备标示符;服务端100生成安全随机数作为后续安全通道的对 称密钥,使用上线的端侧公钥对其加密;将设备标示符和生成的密文发送到端 侧200;端侧200接收到设备标示符和密文,对密文使用自己的私钥进行加密, 得到对称密钥;端侧200使用对称密钥对设备标示符进行加密,发送到服务端 100进行最后的上线确认,若确认成功则上线成功,服务端100将对应的端侧 信息存放在本地内存的设备表。
端侧200的心跳:
端侧200每隔一时间段向服务端100进行心跳交互;服务端100收到心跳 请求,对维护的设备心跳信息进行更新,确认设备为连接中设备,此状态下向 该设备推送消息;服务端100向端侧200发送心跳响应。
消息推送包括以下步骤:
服务端100在维护的设备表中查到设备信息,使用协商的对称密钥对推送 消息进行加密处理,并向对应的端侧200进行消息的发送;端侧200收到推送 的消息,使用对称密钥进行解密,得到最终的推送消息;端侧200向服务端100 发送推送响应。
端侧200的下线:
端侧200直接发送tcp-FIN包,FIN包是TCP协议中明确规定的格式,用 于关闭连接;推送服务收到对应端侧200的fin包,将对应的端侧信息删除, 并响应fin-ACK,ACK包是TCP协议中明确规定的格式,用于表示响应;完 成该端侧200的下线过程。
场景一:
参照图5~6的示意,本实施例中将对推送服务方法进行仿真,仿真环境采 用ns2,包括传统的宽带网络流量消耗(并发数量)仿真结果、采用本方法宽 带网络流量消耗仿真结果、以及流量消耗和数据延迟的仿真结果,采用内核态 协议和采用本实施例在不同传输流量需求下进行仿真推送,获取对应的网络能 量损耗。不难发现,在图5中,当推送的并发数量较小时采用内核态协议具有 优势,而采用本协议在高并发的情况下,具有明显降低损耗,即在相同损耗下, 具有明显节省流量的优势,同时随着流量的增加,采用本协议的推送方法与传 统方法之间距离增加,即在大流量推送下,本协议的推送方法具有的优势更加明显。
进一步的,本实施例还分别采用上述传统方法和本实施例推送方法对流量 消耗和推送延迟进行仿真,其仿真结果如图6的示意,由图中不难发现,采用 本协议和传统方法,虽然相比较减少能耗,但并未影响推送速度,在同一能耗 水平下传统方法和本方法的推送延迟处于相近水平,因此未对推送服务产生影 响,同样的,在高并发的情况下,传统方法和本方法针对推送速度的差距越发 明显,也与能耗的优势相呼应,更加突出本实施例提出的方法具有的优势。
实施例2
参照图3~4的示意,本实施例提出一种基于用户态协议栈的并发推送服务 系统,上述具体的并发推送服务方法应用于该系统,包括服务端100、端侧200 以及通信模块300,服务端100与端侧200通过通信模块300建立通信连接实 现并发推送服务。具体的,本实施例中服务端100可以是服务器,也称伺服器, 是提供计算服务的设备,由于服务器需要响应服务请求,并进行处理,因此一 般来说服务器应具备承担服务并且保障服务的能力。服务器的构成包括处理器、 硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可 靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性 等方面要求较高。端侧200包括手机、平板、智能汽车或智能音箱等具有网络 通信功能的设备。通信模块300为无线通信模块,广泛地运用在车辆监控、遥 控、遥测、小型无线网络、无线抄表、门禁系统、小区传呼、工业数据采集系 统、无线标签、身份识别、非接触RF智能卡、小型无线数据终端、安全防火 系统、无线遥控系统、生物信号采集、水文气象监控、机器人控制、无线232 数据通信、无线485/422数据通信、数字音频、数字图像传输等领域中。支持 GPRS和短消息双通道传输数据;支持多中心数据通信。例如本实施例中可以 采用GPRS通信模块,其采用高性能工业级无线模块及嵌入式处理器,以实时 操作系统作为软件支撑平台,内嵌TCP/IP协议,为用户提供高速、稳定可靠, 永远在线的透明数据传输通道。
进一步的,服务端100包括推送逻辑模块101、用户态协议模块102和网 卡模块103,网卡模块103与用户态协议模块102连接,推送逻辑模块101与 用户态协议模块102连接;本实施例中服务端100可以是服务器,也称伺服器, 是提供计算服务的设备,由于服务器需要响应服务请求,并进行处理,因此一 般来说服务器应具备承担服务并且保障服务的能力。服务器的构成包括处理器、 硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可 靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性 等方面要求较高。
通信模块300与服务器100通过网卡模块103连接通信;端侧200,其通 过通信模块300向服务端100并发推送服务,且端侧200还包括客户端推送模 块201,客户端推送模块201与推送逻辑模块101交互共同完成推送服务。网 卡模块103为网络接口控制器,又称网络接口控制器、网络适配器、网卡或局 域网接收器,是一块被设计用来允许计算机在计算机网络上进行通讯的计算机 硬件。由于其拥有MAC地址,因此属于OSI模型的第1层,它使得用户可以 通过电缆或无线相互连接。网卡和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而网卡和计算机之间的通信则是通过计算机主板上的I/O 总线以并行传输方式进行。
需要说明的是,此处的网卡模块103是硬件,那么用户态协议栈模块102 是依赖于网卡模块103的,同时推送逻辑模块101是依赖用户态协议栈的,模 块的概念是这个推送系统逻辑划分的模块,上述各模块之间的依赖的具体实现 方式是使用的进程内的api相互调用,而推送服务就是除了客户端模块外的网 卡模块103、用户态协议栈模块102和服务端推送逻辑模块101业务处理的集 合。
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参 照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可 以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精 神和范围,其均应涵盖在本发明的权利要求范围当中。