CN113132356B - Udp报文的分发方法、设备及存储介质 - Google Patents
Udp报文的分发方法、设备及存储介质 Download PDFInfo
- Publication number
- CN113132356B CN113132356B CN202110307839.XA CN202110307839A CN113132356B CN 113132356 B CN113132356 B CN 113132356B CN 202110307839 A CN202110307839 A CN 202110307839A CN 113132356 B CN113132356 B CN 113132356B
- Authority
- CN
- China
- Prior art keywords
- socket
- udp
- group
- identification information
- distributing
- 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.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
- H04L69/164—Adaptation or special uses of UDP protocol
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9014—Indexing; Data structures therefor; Storage structures hash tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/06—Notations for structuring of protocol data, e.g. abstract syntax notation one [ASN.1]
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/16—Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
- H04L69/161—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
- H04L69/162—Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields involving adaptations of sockets based mechanisms
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D30/00—Reducing energy consumption in communication networks
- Y02D30/50—Reducing energy consumption in communication networks in wire-line communication networks, e.g. low power modes or reduced link rate
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种UDP报文的分发方法、设备及存储介质。本发明中,通过将需要分发的UDP报文的四元组作为查找套接字的键在预先构建的记录UDP报文与分发UDP报文的套接字的对应关系的套接字管理表中查找对应的键值,进而根据查找结果和预定义的数据结构映射关系图来确定最终进行UDP报文分发的套接字的方式,能够精准的确定接收到的UDP报文应该交由哪个套接字绑定的UDP进程进行处理,从而保证相同的UDP报文能够始终被同一个套接字对应的UDP进程处理,避免分发到其他UDP进程,进而能够解决多进程在服务重启或进程异常时,UDP报文被分发到其他进程导致的异常,以及旧的进程无法安全关闭的问题。
Description
技术领域
本发明实施例涉及数据处理技术领域,特别涉及一种UDP报文的分发方法、设备及存储介质。
背景技术
目前的高性能用户数据报协议(User Datagram Protocol,UDP)应用服务大多是采用多进程与端口复用(reuseport)的架构,即启用了多个进程,通过内核协议支持的端口复用机制,为同一个UDP应用服务对应的每一个进程分别绑定(bind)端口和地址(具体为本机端口和本机地址,实际应用中也可以称为目的端口和目的地址)均相同的套接字(socket)。这样当多个UDP报文(携带了源端口号、源网际互联协议IP地址、目的端口号和目的IP地址)到达提供UDP应用服务的内核时,内核协议便会将携带了相同的源端口、源地址、目的端口和目的地址的UDP报文分发给同一个socket,进而由同一个进程对UDP报文进行处理。
在实际应用中,为了尽可能提升用户体验,高可靠UDP应用服务可能被要求在服务重启时,延迟关闭旧的进程,待新的进程启动后接管新的UDP报文后在关闭旧的进程。对于这种业务需求,由于UDP协议无连接的特性,上述架构就会存在一个不可避免的缺陷:当新的进程启动后,旧的进程还未关闭时,旧的UDP报文,就可能因为新加入reuseport组的socket个数的变化而切换到其他socket对应的进程,同理新接收到的本该由新的进程处理的UDP报文也会因为旧进程的存在,被分发到旧的进程进行处理,进而导致UDP报文服务异常,以及旧的进程无法安全关闭。
为了解决上述缺陷,目前的解决方案是使用UDP套接字的连接(connect)套接口,即UDP服务应用下的每一个进程,每次接收到新的UDP报文时,则新建一个connect套接口,并绑定一个四元组(源端口号、源IP地址、目的端口号和目的IP地址),使得新建的connect套接口在架构上与原有的监听套接口分离出来,由新建的connect套接口来收发新的UDP报文。与传输控制协议(Transmission Control Protocol,TCP)类似,使用connect套接口之后相当于在UDP协议层面进行了数据流连接管理,进而保证了进程重启时原数据正常服务以及解决由于进程异常导致进程组服务异常的问题。但是,connect方案有个致命的缺点:由于UDP协议是无连接的,内核UDP协议的socket管理使用了哈希表实现,具体是利用目的端口号和目的IP地址作为键存储到哈希表中,因此不论对于从哪一设备接收到的UDP报文,由于分发UDP报文的目的端的目的端口号和目的IP地址都是相同的,就会出现导致哈希冲突的socket都在同一个哈希表中管理。而使用connect套接口后的所有socket都是哈希冲突的,这就造成了所有UDP报文都在同一个哈希表上管理,查找的性能为O(n),会造成CPU软中断跑高,从而大大降低单机服务能力,违背了高性能UDP应用服务的初衷。
发明内容
本发明实施例的目的在于提供一种UDP报文的分发方法、设备及存储介质,旨在解决上述技术问题。
为解决上述技术问题,本发明的实施例提供了一种UDP报文的分发方法,包括以下步骤:
将需要分发的UDP报文中的四元组作为查找套接字的键;
在预先创建的套接字管理表中查找所述键对应的键值,所述套接字管理表用于记录所述UDP报文与分发所述UDP报文的套接字之间的对应关系;
根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,所述数据结构映射关系图定义了所述键、所述键值与所述组标识信息和所述位置标识信息之间的关系;
根据所述组标识信息和所述位置标识信息,从所述端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
本发明的实施例还提供了一种UDP报文的分发设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如上文所述的UDP报文的分发方法。
本发明的实施例还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现如上文所述的UDP报文的分发方法。
本发明实施例提供的UDP报文的分发方法、设备及存储介质,通过预先构建以UDP报文的四元组为键,以UDP报文与分发UDP报文的套接字的对应关系为键值的套接字管理表,在需要分发UDP报文时,通过将需要分发的UDP报文的四元组作为查找套接字的键,在预先创建的套接字管理表中查找对应的键值后,根据查找结果和预定义的数据结构映射关系图,确定分发UDP报文的套接字所在套接字组的组标识信息和套接字在套接字组中的位置标识信息,最终根据确定的组标识信息和位置标识,从端口复用组中定位分发UDP报文的套接字,并将UDP报文交由确定的套接字进行分发。由于本发明实施例提供的UDP报文的分发方案,在定位分发UDP报文的套接字时,根据预先构建的记录UDP报文与分发UDP报文的套接字的对应关系的套接字管理表和预定义的数据结构映射关系图可以精准的确定需要分发的UDP报文应该交由哪个套接字绑定的UDP进程进行处理,从而保证相同的UDP报文能够始终被同一个套接字对应的UDP进程处理,避免分发到其他UDP进程,进而能够解决多进程在服务重启或进程异常时,UDP报文被分发到其他UDP进程导致的异常,以及旧的UDP进程无法安全关闭的问题。
另外,所述根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,包括:如果未查找到,确定处理所述UDP报文的UDP进程个数;访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息;根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息。本发明的实施例提供了一种在预先创建的套接字管理表中未查找到所述键对应的键值的情况下,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息的具体方式,通过该方式可以精准的定位分发UDP报文的套接字所需组标识信息和位置标识信息,从而使得最终定位的套接字是能够将UDP报文分发到新创建的UDP进程的套接字,避免分发到需要关闭的旧的UDP进程,进而实现了保证旧的UDP进程能够安全关闭。
另外,所述访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息,包括:从所述数据结构映射关系图中获取位置变量的当前变量值,所述位置变量的当前变量值用于表示新创建的UDP进程绑定的套接字所在的套接字组在所述端口复用组中的位置;将所述位置变量的当前变量值作为分发所述UDP报文的套接字所在套接字组的组标识信息。
另外,所述根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息,包括:对所述键进行哈希处理,得到所述键的哈希值;将所述哈希值与所述UDP进程个数进行求模处理;将得到的求模结果,作为所述套接字在所述套接字组中的位置标识信息。
另外,在所述根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息之后,所述方法还包括:将所述组标识信息和所述位置标识信息作为所述键对应的键值;根据所述键和所述键值,对所述套接字管理表进行更新。本发明的实施例,在确定分发UDP报文的套接字之后,通过将用于确定套接字所在的套接字组的组标识信息和用于确定套接字在所述套接字组中位置的位置标识信息作为所述键对应的键值,然后以键值对key-value的方式,根据键和键值对套接字管理表进行更新,从而可以在后续有相同的键对应的UDP报文需要被对应的键值中确定的套接字进行分发时,直接根据所述键对套接字管理表进行查表便可以快速定位分发UDP报文的套接字。
另外,在所述将所述组标识信息和所述位置标识信息作为所述键对应的键值之前,所述方法还包括:获取当前系统时间;所述将所述组标识信息和所述位置标识信息作为所述键对应的键值,包括:将所述组标识信息、所述位置标识信息和所述当前系统时间作为所述键对应的键值。本发明的实施例,在确定键值时,通过引入当前系统时间,将当前系统时间也作为键值的一部分,从而可以在后续有新的需要分发的UDP报文到达端口复用组,根据新接收到的UDP报文对应的键,在套接字管理表中进行查表,以及对套接字管理表的更新维护时,能够以最近最久未使用(Least Recently Used,LRU)机制和超时限制为标准,在保证确定的用于分发UDP报文的套接字的有效性的同时,也对套接字管理表进行了适合实际需求的更新维护,使得UDP报文的分发方案能够更贴合实际使用需求。
另外,所述根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,包括:如果查找到,根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
另外,所述键值至少包括标识套接字组在所述端口复用组中位置的键值部分和标识套接字在所述套接字组中的位置的键值部分;所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,包括:根据所述键值中标识套接字组在所述端口复用组中位置的键值部分和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系,确定分发所述UDP报文的套接字所在套接字组的组标识信息;根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息。
另外,所述键值还包括标识所述套接字分发所述UDP报文的历史系统时间;在所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息之前,所述方法还包括:获取当前系统时间;判断所述当前系统时间与所述历史系统时间之间的时间差值是否小于预设的超时阈值;如果小于,则执行所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息的步骤;否则,执行所述确定处理所述UDP报文的UDP进程个数,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息,根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息的步骤。
另外,在所述根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息之后,所述方法还包括:将所述键值中的所述历史系统时间修改为所述当前系统时间;根据所述键和修改后的所述键值,对所述套接字管理表进行更新。
另外,在所述将需要分发的UDP报文中的四元组作为查找套接字的键之前,所述方法还包括:根据eBPF框架支持的PIN接口,在挂载的BPF文件系统中获取UDP分发程序和所述数据结构映射关系图;如果获取到,则在基于端口复用机制为UDP服务程序创建所述UDP进程,为每一个所述UDP进程绑定独立的套接字,将所述UDP服务程序对应的所有所述UDP进程的套接字添加到所述端口复用组中的一个套接字组后,根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图,并根据所述eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口,将所述UDP分发程序注入所述端口复用组。本发明的实施例,在将需要分发的UDP报文中的四元组作为查找套接字的键之前,先确定挂载的BPF文件系统已经存在编译好的UDP分发程序和数据结构映射关系图,从而可以直接基于已经存在的UDP分发程序对现有的数据结构映射关系图进行更新,以使得数据结构映射关系图能够更准确的反映当前提供UDP服务的设备中已经创建的UDP进程和与之绑定的套接字的现状。在对数据结构映射关系图更新后,调用eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口将预先编译好的UDP分发程序注入端口复用组,从而在有需要分发的UDP报文被匹配到端口复用组时,能够直接基于UDP分发程序规定的套接字确定逻辑和更新后的数据结构映射关系图定位分发UDP报文的套接字。
另外,在所述根据eBPF框架支持的PIN接口,在挂载的BPF文件系统中获取所述UDP分发程序和所述数据结构映射关系图之后,所述方法还包括:如果未获取到,则根据eBPF框架支持的PIN接口在所述BPF文件系统中创建所述数据结构映射关系图,根据所述数据结构映射关系图编译套接字确定逻辑,得到所述UDP分发程序。
另外,所述根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图,包括:利用所述UDP分发程序从所述端口复用组当前的状态信息中获取基于端口复用机制为所述UDP进程绑定的套接字,并将获取到的所述套接字加入到所述数据结构映射关系图中的套接字组中;统计更新后的所述套接字组中添加的所述套接字的个数,并将所述套接字的个数赋值给所述数据结构映射关系图中的套接字个数变量;将每一个所述套接字组作为所述端口复用组的一个数组元素加入到所述数据结构映射关系图中的所述端口复用组中,并对所述数据结构映射关系图中的位置变量对应的当前变量值进行自增。本发明的实施例,给出了一种根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图的具体实现方式,基于该方式更新后的数据结构映射关系图,能够更加精准的反映当前提供UDP服务的UDP服务程序对应的最新UDP进程,进而在确定分发UDP报文的套接字时,能够基于更新后的数据结构映射关系图,快速、准确的定位到最新UDP进程绑定的套接字,从而实现了新的UDP报文交由重启后的UDP服务程序对应的UDP进程处理,避免再次分发给需要关闭的UDP服务程序对应的UDP进程,进而保证了旧的UDP进程能够安全关闭。
另外,所述根据所述组标识信息和所述位置标识信息,从所述端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发,包括:根据所述组标识信息,从所述端口复用中组选择分发所述UDP报文的套接字所在的套接字组;根据所述位置标识信息,从所述套接字组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
附图说明
一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定,附图中具有相同参考数字标号的元件表示为类似的元件,除非有特别申明,附图中的图不构成比例限制。
图1是本发明第一实施例提供的UDP报文的分发方法的具体流程图;
图2是针对图1所示的UDP报文分发方法中步骤103的具体示意图;
图3是实现图1所示的UDP报文的分发方法时,提供UDP服务的设备中的应用层和内核层的交互示意图;
图4是本发明第二实施例提供的UDP报文的分发方法的具体流程图;
图5是本发明第三实施例提供的UDP报文的分发装置的结构示意图;
图6是本发明第四实施例提供的UDP报文的分发设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施例进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施例中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施例的种种变化和修改,也可以实现本申请所要求保护的技术方案。以下各个实施例的划分是为了描述方便,不应对本发明的具体实现方式构成任何限定,各个实施例在不矛盾的前提下可以相互结合相互引用。
本发明的第一实施例涉及一种UDP报文的分发方法,应用于UDP报文的分发设备的内核层。
具体的,在实际应用中,所述UDP报文的分发设备,可以是任意能够提供UDP服务的设备,例如是客户端设备、服务端设备。
为了便于说明,本实施例以UDP报文的分发设备为服务端为例进行说明。
下面对本实施例的UDP报文的分发方法的实现细节进行说明,以下内容仅为方便理解而提供的实现细节,并非实施本方案的必须。
本实施例的具体流程如图1所示,具体包括以下步骤:
步骤101,将需要分发的UDP报文中的四元组作为查找套接字的键。
具体的说,本实施例中所说的四元组,实质为UDP报文的报头中携带的源端口号(提供UDP报文的终端设备的端口号)、源IP地址(提供UDP报文的终端设备的IP地址)、目的端口号(UDP报文的分发设备的端口号)和目的IP地址(UDP报文的分发设备的IP地址)。
此外,可理解的,由于本发明实施例提供的UDP报文的分发方案是为了解决现有使用了UDP reuseport功能的高性能多进程服务(以下称为UDP服务程序)在服务重启以及进程异常时,导致的数据流访问异常(UDP报文分发异常)的问题。而UDP reuseport功能的原理是,通过为同一个UDP服务程序创建的多个进程分别绑定相同目的端口号和相同目的IP地址的套接字,进而将相同目的端口号和相同目的IP地址的套接字添加到同一个套接字组,再将对应不同UDP服务程序或不同时刻启动的UDP服务程序的套接字组添加到端口复用组,当UDP报文的分发设备的内核层接收到其他终端设备发送来的UDP报文时,由内核层基于现有的实现逻辑,直接从端口复用组选择分发UDP报文的套接字。基于此,可知本实施例提供的UDP报文的分发方案,在有UDP报文到达内核层时,同样需要先基于现有匹配端口复用组的方式,即根据接收到的UDP报文中携带的目的端口号和目的IP地址,与已有的端口复用组对应的端口号和IP地址进行匹配,进而将接收到的UDP报文匹配到对应的端口复用组中。
比如,现有端口复用组1管理的是绑定的端口号为PORT-1,IP地址为IP-1的套接字,端口复用组2管理的是绑定的端口号为PORT-2,IP地址为IP-2的套接字。当接收到的UDP报文中携带的目的端口号为PORT-1,目的IP地址为IP-1时,则将该UDP报文匹配到端口复用组1进行后续处理。
应当理解的是,上述示例仅是为了更好的理解本实施例的技术方案而列举的示例,不作为对本实施例的唯一限制。
步骤102,在预先创建的套接字管理表中查找所述键对应的键值。
具体的说,所述套接字管理表是用于记录需要分发的UDP报文与分发所述UDP报文的套接字之间的对应关系的,并且为了便于确定分发UDP报文的套接字,本实施例具体是将UDP报文的四元组作为键(key),将标识套接字的相关信息作为所述key对应的键值(value)。
此外,在实际应用中,为了提高对套接字管理表的查表速度,套接字管理表可以采用哈希结构的表。
通过上述描述不可知,本实施例中提供的UDP报文的分发方案,由于查找哈希表所需的键是根据UDP报文中携带的四元组,即源端口号、源IP地址、目的端口号和目的端口号确定的。因而,对于由不同源端提供的UDP报文会存储在不同的套接字管理表进行管理,从而解决了现有基于connect接口确定分发UDP报文的套接字存在的哈希表冲突问题。
此外,基于本实施例给出的上述套接字管理表,可以实现不同源端的数据流由不同的套接字管理表进行管理,由于基于多线程同步查询的方式,对多个小数据表的查询速度要远远大于对一张大表的查询速度,因此大大提高了方案的整体性能,解决了现有connect方案查找的性能为0(n),且存在CPU软中断跑高,单机服务能力弱的问题。
此外,需要说明的是,在本实施例中,用于标识套接字的相关信息是根据预先定义的数据结构映射关系图确定的。
关于预定义的数据结构映射关系图,具体是基于eBPF框架支持的MAP类型设计的。具体的,在数据结构映射关系图中主要定义了管理套接字的套接字组(以下用sock_array表示)、管理套接字组的端口复用组(以下用reuseport_array表示)、标识最新的UDP进程绑定的套接字所在的sock_array在reuseport_array中位置的变量,以下用reuseport_current表示,以及标识reuseport_current指向的sock_array中套接字个数的变量,以下用sock_count表示。
此外,在数据结构映射关系图中,还定义了上述每一个变量的类型,以及每一个变量对应的描述信息。
具体的,对于sock_array,其类型为SOCKARRAY,表示端口复用组中属于同进程组的成员,其中每一sock_array保存的是一个进程组内的套接字socket。
对于reuseport_array,其类型为ARRAY_OF_MAPS,且该数组的长度为N_ARRAY,表示参与UDP报文分发管理的端口复用组,主要用于进行新旧进程组对应的套接字组,以及套接字组中的套接字的记录和切换,进而在后续根据数据结构映射关系图定位套接字时,能够实现新旧进程的无缝对接。
此外,值得一提的是,保存在reuseport_array中的每一个数组元素都为一个sock_array,即reuseport_array是一个二维数组表,其中的每一个元素都是一个一维的sock_array。
对于reuseport_current,其类型为ARRAY,且该数组的长度为1,即仅能记录最后添加到reuseport_array中的sock_array的位置。因此,该变量表示的是最新进程绑定的socket所在的sock_array在reuseport_array中的位置。
对于sock_count,其类型为ARRAY,并且规定了该数组的长度为1,用于表示reuseport_current指向的sock_array中socket的个数。
基于此上述预定义的数据结构映射关系图中对sock_array、reuseport_array、reuseport_current和sock_count的相关描述可知,想要从端口复用组中快速、精准的定位一个socket,需要获取socket所在的sock_array,以及标识socket在sock_array中位置的sock_count。而sock_array,又是由reuseport_current确定的。因此,与key对应的value至少需要包括reuseport_curren和sock_count。
应当理解的是,上述示例仅是为了更好的理解本实施例的技术方案而列举的示例,在实际应用中,数据结构映射关系图中定义的变量信息不限于上述名称的描述,只要其能实现上述功能即可。
步骤103,根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
具体的说,之所以根据查找结果访问预定义的数据结构映射关系图,可以得到组标识信息和位置标识信息,是因为数据结构映射关系图中定义了根据四元组确定键key与组标识信息和位置标识信息之间的关系,以及与key对应的键值value与组标识信息和位置标识信息之间的关系。
而在实际应用中,查找结果要么是查找到,即套接字管理表中存在当前确定的key对应的value,要么是没有查找到,即套接字管理表中不存当前确定的key对应的value。因此,通过在数据结构映射关系图中定义key、value与所述组标识信息和所述位置标识信息之间的关系,当查找结果是没有查找到当前确定的key对应的value时,直接以确定的key为查找结果,访问数据结构映射关系图,进而根据数据结构映射关系图中定义的key与组标识信息和位置标识信息之间的关系,便可以得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
相应地,如果查找结果是查找到,则直接以查找到的value为查找结果,访问数据结构映射关系图,进而根据数据结构映射关系图中定义的value与组标识信息和位置标识信息之间的关系,便可以得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
此外,应当理解的是,在UDP报文的分发方案中,分发UDP报文的套接字通常是由端口复用组管理的。但是目前的端口复用组在确定分发UDP报文的套接字时,存在着多进程在服务重启或进程异常时,UDP报文被分发到其他UDP进程导致的异常,以及旧的UDP进程无法安全关闭的问题,因此为了解决这一问题,本实施例对端口复用组进行了改进,从而使得端口复用组能够根据本实施例提供的UDP分发方式,精准分配分发UDP报文的套接字,从而保证相同的UDP报文能够始终被同一个套接字对应的UDP进程处理,避免分发到其他UDP进程。
具体的,本实施例通过预先编译规定了套接字确定逻辑的UDP分发程序,然后采用动态加载的方式,将UDP分发程序注入到端口复用组,进而使得端口复用组在确定分发接收到的UDP报文的套接字时,能够根据UDP分发程序规定的套接字确定逻辑来确定套接字。
可理解的,关于上述所说的UDP分发程序可以是eBPF程序。
相应地,在将eBPF程序注入端口复用组时,具体是将eBPF程序中的伪代码附着到端口复用组指定的位置上运行。
此外,值得一提的是,在实际应用中,本实施例中所说的确定套接字的逻辑也可以是通过对端口复用组的重编译实现的,即将套接字的确定逻辑对应的伪代码直接插入到实现端口复用组的程序中,使得基于重编译的端口复用组创建程序构建的端口复用组在创建完成后,就能够案子本实施例规定的套接字的确定逻辑确定分发UDP报文的套接字。
以端口复用组中预先注入了UDP分发程序,即上述所说的eBPF程序为例,本实施例中所说的UDP分发程序是在实现本方案前,根据预定义的数据结构映射关系图预编译好的。并且为了方便不同UDP进程组对应的套接字的选取都能基于同一个数据结构映射关系图和UDP分发程序实现,预先定义的数据结构映射关系图和编译好的UDP分发程序需要添加在BPF文件系统中,从而实现全局访问使用。因此,在实现本方案前,需要先查看挂载的BFP文件系统中是否存在数据结构映射关系图和UDP分发程序。
具体的,在实际应用中可以根据eBPF框架支持的PIN接口,在挂载的BPF文件系统中获取所述数据结构映射关系图和所述UDP分发程序。
可理解的,通过PIN接口获取的结果要么为获取到(BPF文件系统存了),要么为未获取到(BPF文件系统没有存)。由于获取结果的不同,故而要做的操作也会有所不同,具体的:
在从挂载的BFP文件系统中获取到数据结构映射关系图和UDP分发程序时,内核在监测到基于端口复用机制为UDP服务程序创建所述UDP进程,为每一个所述UDP进程绑定独立的套接字,将所述UDP服务程序对应的所有所述UDP进程的套接字添加到所述端口复用组中的一个套接字组后,执行以下操作即可:
(1)根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图。
具体的,所述端口复用组当前的状态信息至少包括端口复用组中管理的套接字组,每个套接字组中添加的套接字。
故而,所述根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图,具体为:
(1-1)利用所述UDP分发程序从所述端口复用组当前的状态信息中获取基于端口复用机制为所述UDP进程绑定的套接字,并将获取到的所述套接字加入到所述数据结构映射关系图中的套接字组中。
比如,创建的UDP进程组A包括了UDP进程A1、UDP进程A2、UDP进程A3、UDP进程A4、UDP进程A5、UDP进程A6、UDP进程A7和UDP进程A8这8个UDP进程。这8个UDP进程分别绑定了一个socket,即管理这8个UDP进程对应的socket的sock_array可以记为sock_array_A,由sock_array_A管理的8个socket可以记为socket_An。
具体的,这8个UDP进程和8个socket的对应关系可以如下:
UDP进程A1——>socket_A1,UDP进程A2——>socket_A2,UDP进程A3——>socket_A3,UDP进程A4——>socket_A4,UDP进程A5——>socket_A5,UDP进程A6——>socket_A6,UDP进程A7——>socket_A7和UDP进程A8——>socket_A8。
基于此,数据结构映射关系图中的sock_array就需要更新为sock_array_A,添加的套接字便是上述8个socket,并且这8个socket的顺序是按照递增的顺序依次添到sock_array_A中的。
(1-2)统计更新后的所述套接字组中添加的所述套接字的个数,并将所述套接字的个数赋值给所述数据结构映射关系图中的套接字个数变量。
仍以上述事例为例可知,最终更新后的sock_array_A中添加的socket个数为8,则数据结构映射关系图中的套接字个数变量sock_count=8。
(1-3)将每一个所述套接字组作为所述端口复用组的一个数组元素加入到所述数据结构映射关系图中的所述端口复用组中,并对所述数据结构映射关系图中的位置变量对应的当前变量值进行自增。
可理解的,初始状态下,位置变量reuseport_current对应的变量值为0,在端口复用组中新增套接字组时,reuseport_current对应的变量值的变化满足:reuseport_current=reuseport_current+1,如在端口复用组中加入一个套接字组时,reuseport_current对应的当前变量值为:reuseport_current=0+1=1。
(2)根据所述eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口,将所述UDP分发程序注入所述端口复用组。
具体的说,本实施例中所说的将UDP分发程序注入到端口复用组,具体是指将UDP分发程序的,如一个脚步文件中的逻辑代码提取出,然后合并到端口复用组选择套接字的实现代码中,以使端口复用在执行选择套接字的代码时,能够按照UDP分发程序的逻辑代码,即规定的套接字确定逻辑来定位分发UDP报文的套接字。
相应地,在从挂载的BFP文件系统中未获取到数据结构映射关系图和UDP分发程序时,内核先根据eBPF框架支持的PIN接口在所述BPF文件系统中创建所述数据结构映射关系图,根据所述数据结构映射关系图编译套接字确定逻辑,得到所述UDP分发程序;然后,再监测是否完成了基于端口复用机制为UDP服务程序创建所述UDP进程,为每一个所述UDP进程绑定独立的套接字,将所述UDP服务程序对应的所有所述UDP进程的套接字添加到所述端口复用组中的一个套接字组后,若监测到,再执行上述步骤(1)和(2)即可。
此外,值得一提的是,在实际应用中,上述需要在接收到UDP报文之前完成的操作,如挂载BPF文件系统、加载数据结构映射关系图、UDP分发程序、更新数据结构映射关系图、将UDP分发程序注入端口复用组的操作,可以在内核监测到UDP服务程序启动时执行,具体的:
在UDP服务程序启动时,先挂载BPF文件系统。
然后,将预先编译好的UDP分发程序、哈希结构的套接字管理表,以及数据结构映射关系图加载到BPF文件系统中。
接着,为UDP服务程序创建提供服务的UDP进程,如8个,并将这8个UDP进程记录到一个进程组,如进程组A中,同时为每一个UDP进程绑定一个独立的socket,记为socket_An(n对应UDP进程的编号),并绑定本地IP地址(目的IP地址)和本地端口号(目的端口号),如记为IP_S和PORT_S,并启动UDP reuseport功能,即当前端口复用组中有8个属于进程组A的socket成员。
接着,根据UDP分发程序对数据结构映射关系图进行更新,具体为:①创建属于UDP服务程序A的sock_array数组,记为sock_array_A,并将进程组A对应的8个socket添加到sock_array_A中;②按照“reuseport_current=reuseport_current+1”获取reuseport_current当前的变量值。由于初始值为0,故而此时获取到的reuseport_current=1;③将sock_array_A加入reuseport_array中,即reuseport_array[reuseport_current]=reuseport_array[1]=sock_array_A;④设置sock_count=8。
最后,根据所述eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口,将所述UDP分发程序注入所述端口复用组。
在完成上述操作后,当内核接收到需要分发的UDP报文时,便可以按照本实施例步骤101至步骤104给出的方式定位分发UDP报文的套接字了。
此外,可理解的,在执行完步骤102后,得到的查找结果要么为查找到,要么为未查找到。故而,步骤103中给出的根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息也可以划分为两种。为了便于说明,以下结合图2进行说明:
从图2不难看出,步骤101、步骤102和步骤104,与图1中的相对应,故而此处不再赘述。以下主要针对图2中步骤103中包括的子步骤1031至步骤1034进行说明:
子步骤1031,如果未查找到,确定处理所述UDP报文的UDP进程个数。
具体的说,由于基于UDP reuseport功能的高性能UDP服务程序在提供UDP服务时,每一个UDP进程是绑定了一个独立的socket的。因此,通过确定处理UDP报文的UDP进程个数,便可以确定能够进行UDP报文分发的socket的个数。
子步骤1032,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息。
具体的说,在本实施例中UDP分发程序规定的套接字确定逻辑,具体为:
首先,从所述数据结构映射关系图中获取位置变量,即reuseport_current的当前变量值。
可理解的,通过数据结构映射关系图中对reuseport_current的描述可知,reuseport_current的当前变量值的值用于表示新创建的UDP进程绑定的套接字所在的套接字组sock_array在所述端口复用组reuseport_array中的位置。
然后,将reuseport_current的当前变量值作为分发所述UDP报文的套接字所在套接字组sock_array的组标识信息。
子步骤1033,根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息。
具体为,先对所述键进行哈希处理,得到所述键的哈希值;然后,将所述哈希值与所述UDP进程个数进行求模处理;最后,将得到的求模结果,作为所述套接字在所述套接字组中的位置标识信息。
子步骤1034,如果查找到,根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
具体的说,套接字管理表中记录的键值至少包括了标识套接字组在所述端口复用组中位置的键值部分和标识套接字在所述套接字组中的位置的键值部分。
相应地,在根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息时,具体为:
首先,根据所述键值中标识套接字组在所述端口复用组中位置的键值部分和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系,确定分发所述UDP报文的套接字所在套接字组的组标识信息。
然后,根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息。
步骤104,根据所述组标识信息和所述位置标识信息,从所述端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
具体的说,在根据步骤103中确定的组标识信息和位置标识信息,定位分发UDP报文的套接字时,进行的具体操作为:
首先,根据所述组标识信息,从所述端口复用中组选择分发所述UDP报文的套接字所在的套接字组;
然后,根据所述位置标识信息,从所述套接字组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
为了便于理解,以下结合图3对本实施例提供的步骤101至步骤103中的操作,进行具体说明:
假设启动的UDP服务程序为步骤103中所说的UDP服务程序A,并且进程组A中有8个UDP进程,这8个UDP进程各自绑定的socket被添加在sock_array_A中,这8个socket绑定的端口号和IP地址分别为PORT_S和IP_S,且这8个UDP进程和绑定的8个socket之间的对应关系为:UDP进程A1——>socket_A1,UDP进程A2——>socket_A2,UDP进程A3——>socket_A3,UDP进程A4——>socket_A4,UDP进程A5——>socket_A5,UDP进程A6——>socket_A6,UDP进程A7——>socket_A7和UDP进程A8——>socket_A8。
reuseport_current的当前变量值为1,sock_count=8。
基于这一条件,假设被匹配到内核层中的端口复用中的UDP报文为packet_c1,从packet_c1中提取的四元组为:源IP地址为IP_C、源端口号为PORT_C、目的IP地址为IP_S、目的端口号为PORT_S,则在对packet_c1进行分发,执行的操作具体为:
(1)获取四元组,记录key={IP_C,PORT_C,IP_S,PORT_S}。
(2)根据key查找哈希结构的套接字管理表,在套接字管理表中未查找到key对应的value。
(3)获取进程组A中的UDP进程个数,得到UDP进程个数为8。
(4)获取分发所述UDP报文的套接字所在套接字组的组标识信息,根据数据结构映射关系图中的记录可知,分发所述UDP报文的套接字所在套接字组的组标识信息是由reuseport_current的当前变量值确定的,故而根据上述更新后的数据结构映射关系图,可知在reuseport_current=1时,故而最终确定的组标识信息为1。
(5)计算哈希值hash_value=hash(key)%8=hash(IP_C,PORT_C,IP_S,PORT_S)%8,假设最终得到的hash_value=5,故而最终确定的分发UDP报文的套接字在套接字组中的位置标识信息为5。
(6)根据确定的组标识信息1,从图3所示的数据结构映射关系图中找到的sock_array为:
sock_array=reuseport_array[reuseport_current]=reuseport_array[1]=sock_array_A,即sock_array_A这个套接字组,然后根据确定的位置标识信息5,选择sock_array_A这个套接字组中编号5的套接字,即socket=sock_array[hash_value]=sock_array_A[5]=socket_A5作为最终分发packet_c1的套接字。
(7)将packet_c1发送至套接字socket_A5,由套接字socket_A5将packet_c1分发至为UDP服务程序A创建的UDP进程A5,由此完成了一次UDP报文的分发。
由此,在查找结果为从套接字管理表中未查找到键对应的键值时,确定分发UDP报文的socket的操作便完成了。
对于在查找结果为从套接字管理表中查找到键对应的键值的情况,确定分发UDP报文的socket的操作,具体为:
假设内核层又接收到同一数据流C的UDP报文,如packet_c2,并且packet_c2的四元组为依旧为源IP地址为IP_C、源端口号为PORT_C、目的IP地址为IP_S、目的端口号为PORT_S,则在对packet_c2进行分发,执行的操作具体为:
(1)获取四元组,记录key={IP_C,PORT_C,IP_S,PORT_S}。
(2)根据key查找哈希结构的套接字管理表,在套接字管理表中查找到key对应的value,且value={1,5}。
假设,预先规定了value中从左向右一次出现的的第一键值部分用于标识套接字组在所述端口复用组中位置,第二键值部分用于标识套接字在所述套接字组中的位置。
(3)根据第一键值部分(即1)和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系(sock_array=reuseport_array[reuseport_current]=reuseport_array[第一键值部分]),确定分发所述UDP报文的套接字所在套接字组的组标识信息为1。
(4)根据第二键值部分(即5)和所述数据结构映射关系图中记录的套接字组和套接字之间的关系(socket=sock_array[第二键值部分]),确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息为5。
(5)根据确定的组标识信息1,从图3所示的数据结构映射关系图中找到的sock_array为:
sock_array=reuseport_array[reuseport_current]=reuseport_array[1]=sock_array_A,即sock_array_A这个套接字组,然后根据确定的位置标识信息5,选择sock_array_A这个套接字组中编号为5的套接字,即socket=sock_array[hash_value]=sock_array_A[5]=socket_A5作为最终分发packet_c2的套接字。
(6)将packet_c2发送至套接字socket_A5,由套接字socket_A5将packet_c2分发至为UDP服务程序创建的UDP进程A5,由此完成了一次UDP报文的分发。
通过上述描述可知,由于本实施例提供的UDP报文的分发方法,在定位分发UDP报文的socket时,会基于数据结构映射关系表来精准定位当前能够分发UDP报文的socket所需的组标识信息和位置标识信息,只要在确定的组标识信息对应的套接字组中,所述位置标识信息对应的位置上有正常工作的套接字,才会将UDP交给所述套接字进行分发,如果没有定位到,则不进行分发,等待该位置的套接字恢复正常后再交由其分发,或者直接向客户端反馈。因此即便分发过程中,某个UDP进程由于异常关闭退出,也不会造成UDP报文的分发的混乱,从而可以有效解决某一个或几个UDP进程异常影响整个进程组服务的问题。
此外,对于实际应用中,同一端口复用组中管理了多个进程组对应的socket的情况,本实施例提供的UDP分发方案,也可以完美的应对,具体的:
如果UDP报文的分发设备中又启动了一个UDP服务程序B,则在UDP服务程序B启动时,同样需要再执行一次类似启动UDP服务程序A时执行的操作。假设,为UDP服务程序B创建的UDP进程同样为8个,并将这8个UDP进程记录到一个进程组,如进程组B中,同时为每一个UDP进程绑定一个独立的socket,记为socket_Bn(n对应UDP进程的编号),并绑定本地IP地址(目的IP地址)和本地端口号好(目的端口号),如记为IP_S和PORT_S,并启动UDPreuseport功能,即当前端口复用组中有8个属于进程组B的socket成员。
由于进程组A绑定的套接字对应的IP地址和端口号,与进程组B绑定的套接字对应的IP地址和端口号是相同的,即均为IP_S和PORT_S。因此,在将进程组B的socket成员添加到端口复用组后,端口号复用组中一共有16个socket,其中8个socket是属于进程组A,8个socket是属于进程组B的。
接着,根据UDP分发程序对数据结构映射关系图进行更新,具体为:①创建属于UDP服务程序B的sock_array数组,记为sock_array_B,并将进程组B对应的8个socket添加到sock_array_B中;②按照“reuseport_current=reuseport_current+1”获取reuseport_current当前的变量值。由于端口号复用组已经添加了sock_array_A,因而reuseport_current的当前变量值为1,故而在将sock_array_B添加到reuseport_array后,此时获取到的reuseport_current=1+1=2;③将sock_array_B加入reuseport_array中,即reuseport_array[reuseport_current]=reuseport_array[2]=sock_array_B;④设置sock_count=8。
此外,应当理解的,由于在启动UDP服务程序A的时候,已经根据所述eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口,将所述UDP分发程序注入所述端口复用组了,故而在启动UDP服务程序B时,就不需要在同一个端口复用组中再注入一次UDP分发程序了。
在完成上述操作后,若内核接收到了数据流D的UDP报文packet_d1,并且从packet_d1的报头中提取出的四元组为:源IP地址为IP_D、源端口号为PORT_D、目的IP地址为IP_S和目的端口号为PORT_S,则在对packet_d1进行分发,执行的操作具体为:
(1)获取四元组,记录key={IP_D,PORT_D,IP_S,PORT_S}。
(2)根据key查找哈希结构的套接字管理表,在套接字管理表中未查找到key对应的value。
(3)由于reuseport_current的当前变量值始终指向的是最新的进程组,故而需要获取进程组B中的UDP进程个数,得到UDP进程个数为8。
(4)获取分发所述UDP报文的套接字所在套接字组的组标识信息,根据数据结构映射关系图中的记录可知,分发所述UDP报文的套接字所在套接字组的组标识信息是由reuseport_current的当前变量值确定的,故而根据上述更新后的数据结构映射关系图,可知在reuseport_current=2时,最终确定的组标识信息为2。
(5)计算哈希值hash_value=hash(key)%8=hash(IP_D,PORT_D,IP_S,PORT_S)%8,假设最终得到的hash_value=3,根据上述更新后的数据结构映射关系图,可知在hash_value=3时,最终确定的分发UDP报文的套接字在套接字组中的位置标识信息为socket_B3。
(6)根据确定的组标识信息2,从数据结构映射关系图中找到的sock_array为:
sock_array=reuseport_array[reuseport_current]=reuseport_array[2]=sock_array_B,即sock_array_B这个套接字组,然后根据确定的位置标识信息3,选择sock_array_B这个套接字组中编号为3的套接字,即socket=sock_array[hash_value]=sock_array_B[3]=socket_B3作为最终分发packet_d1的套接字。
(7)将packet_d1发送至套接字socket_B3,由套接字socket_B3将packet_d1分发至为UDP服务程序B创建的UDP进程B3,由此完成了一次UDP报文的分发。
在完成对packet_d1的分发后,如果内核又接收到数据库了C的UDP报文,如packet_c3,并且packet_c3的四元组为依旧为源IP地址为IP_C、源端口号为PORT_C、目的IP地址为IP_S、目的端口号为PORT_S,则在对packet_c3进行分发,执行的操作具体为:
(1)获取四元组,记录key={IP_C,PORT_C,IP_S,PORT_S}。
(2)根据key查找哈希结构的套接字管理表,在套接字管理表中查找到key对应的value,且value={1,5}。
(3)根据第一键值部分(即1)和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系(sock_array=reuseport_array[reuseport_current]=reuseport_array[第一键值部分]),确定分发所述UDP报文的套接字所在套接字组的组标识信息为1。
(4)根据第二键值部分(即5)和所述数据结构映射关系图中记录的套接字组和套接字之间的关系(socket=sock_array[第二键值部分]),确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息为5。
(5)根据确定的组标识信息1,从数据结构映射关系图中找到的sock_array为:
sock_array=reuseport_array[reuseport_current]=reuseport_array[1]=sock_array_A,即sock_array_A这个套接字组,然后根据确定的位置标识信息5,选择sock_array_A这个套接字组中编号为5的套接字,即socket=sock_array[hash_value]=sock_array_A[5]=socket_A5作为最终分发packet_c3的套接字。
(6)将packet_c3发送至套接字socket_A5,由套接字socket_A5将packet_c3分发至为UDP服务程序创建的UDP进程A5,由此完成了一次UDP报文的分发。
通过上述描述可以看出,由于packet_c1、packet_c2和packet_c3是同一数据流C在不同时刻对应的UDP报文,因而它们之间是存在联系的,所以这三个UDP报文均是由进程组A中的同一个socket,上述所说的socket_A5进行分发的,而packet_d1是另一个数据流D对应的UDP报文,即一个与数据流C的UDP报文不存在关联的新的UDP报文,因此如果此时有新的UDP服务程序启动,则packet_d1应该交由新启动的UDP服务程序对应的socket分发,而通过本实施例给出的套接字确定方式,当新的UDP进程启动后,旧的UDP进程还未关闭时,如上述示例中UDP服务程序B启动后,UDP服务程序A还未关闭的情况,基于本实施例提供的UDP报文的分发方法,旧的UDP报文依旧可以被旧的UDP进程绑定的套接字进行分发,如UDP服务程序B启动后,接收到的数据流C的UDP报文packet_c3,并不会被分配到对应进程组B的套接字,而是依旧被分配给了一直处理数据流C的套接字socket_A5,同理新接收到的与历史UDP报文无关联的UDP报文,如数据流D的UDP报文packet_d1,又可以交由新的UDP进程绑定的套接字,如上述示例中根据packet_d1的四元组和数据结构映射关系表确定的socket_B3进行分发,从而可以有效解决新旧进程共存时,容易导致UDP数据流服务异常的问题。
除此之外,由于基于本实施例提供的UDP报文的分发方法,可是精准的实现新旧UDP进程的区分,定位UDP报文的套接字,因此可实现新的UDP进程启动后接管新的数据流,旧的UDP进程在原有的UDP报文全部处理完后,旧的UDP进程安全关闭。
进一步地,在将旧的UDP进程关闭后,需要将旧的UDP进程绑定的套接字同步删除。
比如,在UDP服务程序A退出后,需要将sock_array_A从reuseport_array中删除,即使reuseport_array[1]=NULL。
应当理解的是,上述示例仅是为了更好的理解本实施例的技术方案而列举的示例,不作为对本实施例的唯一限制。
通过上述描述不难发现,本实施例中提供的UDP报文的分发方法,通过预先编译能够确定分发UDP报文的套接字的UDP分发程序,并将UDP分发程序,如将eBPF程序动态、或者静态等方式注入到端口复用组中,从而在以需要分发的UDP报文中的四元组作为查找套接字的键,在预先创建的套接字管理表中查找对应的键值后,根据查找结果,由UDP分发程序按照预先编译好的套接字确定规则访问预定义的数据结构映射关系图,进而确定分发UDP报文的套接字所在套接字组的组标识信息和套接字在套接字组中的位置标识信息,最终根据确定的组标识信息和位置标识,从端口复用组中定位分发UDP报文的套接字,并将UDP报文交由确定的套接字进行分发。由于本发明实施例提供的UDP报文的分发方案,在定位分发UDP报文的套接字时,基于预先编译好的UDP分发程序规定的套接字确定逻辑、套接字管理表和预定义的数据结构映射关系图可以精准的确定需要分发的UDP报文应该交由哪个套接字绑定的UDP进程进行处理,从而保证相同的UDP报文能够始终被同一个套接字对应的UDP进程处理,避免分发到其他UDP进程,进而能够解决多进程在服务重启或进程异常时,UDP报文被分发到其他UDP进程导致的异常,以及旧的UDP进程无法安全关闭的问题。
本发明的第二实施例涉及一种UDP报文的分发方法。第二实施例在第一实施例的基础上做了进一步改进,主要改进之处为:在所述根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息之后,增加了将所述组标识信息和所述位置标识信息作为所述键对应的键值,并根据所述键和所述键值,对所述套接字管理表进行更新的操作。
从图4可知看出,本实施例中的步骤401、步骤402和步骤404与第一实施例中的步骤101、步骤102和步骤104大致相同,此处不再赘述,以下步骤403中的几个子步骤进行具体说明:
子步骤4031,如果未查找到,确定处理所述UDP报文的UDP进程个数。
子步骤4032,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息。
子步骤4033,根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息。
不难发现,本实施例中的子步骤4031至子步骤4033,与第一实施例中的子步骤1031至子步骤1033大致相同,此处不再赘述。
子步骤4034,将所述组标识信息和所述位置标识信息作为所述键对应的键值。
以最终确定的组标识信息为1,位置标识信息为5为例,则得到的value={1,5}。
子步骤4035,根据所述键和所述键值,对所述套接字管理表进行更新。
即,将新生成的键值对,如key={IP_C,PORT_C,IP_S,PORT_S}和value={1,5},新增到套接字管理表中。
此外,值得一提的是,由于在实际应用中,判断前后两次收到的UDP报文是否存在关联性,除了根据UDP报文的报头中的四元组,还需要考虑时间,即接收到的两个UDP报文之间的时间差值是否小于预设的超时阈值。
相应地,若小于,则可以认为两个UDP报文是存在关联的,需要将这两个UDP报文发送给同一个UDP进程进程处理,即这两个UDP报文应该由同一个套接字进行分发,这样就可以保证被分发给同一个UDP进程。
因此,在将所述组标识信息和所述位置标识信息作为所述键对应的键值之前,还需要获取当前的系统时间,比如time_1,然后将所述组标识信息、所述位置标识信息和所述当前系统时间共同作为所述键对应的键值,即value={1,5,time_1}。
相应地,所述根据所述键和所述键值,对所述套接字管理表进行更新,具体为:将新生成的键值对,如key={IP_C,PORT_C,IP_S,PORT_S}和value={1,5,time_1},新增到套接字管理表中。
子步骤4036,如果查找到,根据所述键值中标识套接字组在所述端口复用组中位置的键值部分和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系,确定分发所述UDP报文的套接字所在套接字组的组标识信息。
通过上述描述可知,由于套接字管理表中存储的value除了包括标识套接字组在所述端口复用组中位置的键值部分(如步骤4035中value中的1)和标识套接字在所述套接字组中的位置的键值部分(如步骤4035中value中的5),还包括了标识所述套接字分发所述UDP报文的历史系统时间,如步骤4035中value中的time_1。
因此,在执行子步骤4036之前,需要先获取当前系统时间,如获取到的当前系统时间为time_2;然后,判断所述当前系统时间与所述历史系统时间之间的时间差值是否小于预设的超时阈值。
如果通过判断,确定时间差值小于预设的超时阈值则执行子步骤4036;否则,执行子步骤4031至子步骤4035,即重新确定分发所述UDP报文的套接字。
子步骤4037,根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息。
此外,应当理解的是,在根据查找到的键值和数据结构映射关系图确定分发UDP报文的套接字后,同样需要对套接字管理表进行更新维护,具体的操作为:将所述键值中的所述历史系统时间修改为所述当前系统时间,如将time_1修改为time_2,然后根据所述键和修改后的所述键值,对所述套接字管理表进行更新。
进一步地,为了避免套接字管理表中存在冗余数据,在实际应用中,还可以引入最近最久未使用(Least Recently Used,LRU)机制,并结合超时时间的限制,在对套接字管理表进行更新时,还可以将预设周期内未使用的键值对信息,从套接字管理表中删除,进而减少套接字管理表中的冗余数据,同时提高查表速度。
由此,本实施例中提供的UDP报文的分发方法,在确定分发UDP报文的套接字之后,通过将用于确定套接字所在的套接字组的组标识信息和用于确定套接字在所述套接字组中位置的位置标识信息作为所述键对应的键值,然后以键值对key-value的方式,根据键和键值对套接字管理表进行更新,从而可以在后续有相同的键对应的UDP报文需要被对应的键值中确定的套接字进行分发时,直接根据所述键对套接字管理表进行查表便可以快速定位分发UDP报文的套接字。
应当理解的是,上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包括相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该专利的保护范围内。
本发明第三实施例涉及一种UDP报文的分发装置,如图5所示,包括:关键字确定模块501、套接字管理表查找模块502和套接字确定模块503。
其中,关键字确定模块501,用于将需要分发的UDP报文中的四元组作为查找套接字的键;套接字管理表查找模块502,用于在预先创建的套接字管理表中查找所述键对应的键值,所述套接字管理表用于记录所述UDP报文与分发所述UDP报文的套接字之间的对应关系;套接字确定模块503,用根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,并根据所述组标识信息和所述位置标识信息,从所述端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发,所述数据结构映射关系图定义了所述键、所述键值与所述组标识信息和所述位置标识信息之间的关系。
此外,在另一个例子中,套接字确定模块503在根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息时,具体为:
如果未查找到,确定处理所述UDP报文的UDP进程个数;
访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息;
根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息。
此外,在另一个例子中,套接字确定模块503具体用于从所述数据结构映射关系图中获取位置变量的当前变量值,所述位置变量的当前变量值用于表示新创建的UDP进程绑定的套接字所在的套接字组在所述端口复用组中的位置;将所述位置变量的当前变量值作为分发所述UDP报文的套接字所在套接字组的组标识信息。
此外,在另一个例子中,套接字确定模块503具体用于对所述键进行哈希处理,得到所述键的哈希值;将所述哈希值与所述UDP进程个数进行求模处理;将得到的求模结果,作为所述套接字在所述套接字组中的位置标识信息。
此外,在另一个例子中,UDP报文的分发装置还包括套接字管理表更新模块。
套接字管理表更新模块,用于将所述组标识信息和所述位置标识信息作为所述键对应的键值;根据所述键和所述键值,对所述套接字管理表进行更新。
此外,在另一个例子中,套接字管理表更新模块具体用于获取当前系统时间;将所述组标识信息、所述位置标识信息和所述当前系统时间作为所述键对应的键值。
此外,在另一个例子中,套接字确定模块503在根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息时,还用于执行以下操作:
如果查找到,根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
此外,在另一个例子中,所述键值至少包括标识套接字组在所述端口复用组中位置的键值部分和标识套接字在所述套接字组中的位置的键值部分。
相应地,套接字确定模块503在执行根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息时,具体的操作为:
根据所述键值中标识套接字组在所述端口复用组中位置的键值部分和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系,确定分发所述UDP报文的套接字所在套接字组的组标识信息;
根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息。
此外,在另一个例子中,所述键值还包括标识所述套接字分发所述UDP报文的历史系统时间。
相应地,套接字确定模块503还用于获取当前系统时间;判断所述当前系统时间与所述历史系统时间之间的时间差值是否小于预设的超时阈值;如果小于,则执行所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息的操作;否则,执行所述确定处理所述UDP报文的UDP进程个数,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息,根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息的操作。
此外,在另一个例子中,套接字管理表更新模块还用于将所述键值中的所述历史系统时间修改为所述当前系统时间;根据所述键和修改后的所述键值,对所述套接字管理表进行更新。
此外,在另一个例子中,UDP报文的分发装置还包括获取模块、数据结构映射关系图更新模块、UDP分发程序注入模块、数据结构映射关系图创建模块、UDP分发程序编译模块。
具体的,获取模块,用于根据eBPF框架支持的PIN接口,在挂载的BPF文件系统中获取所述UDP分发程序和所述数据结构映射关系图。
数据结构映射关系图更新模块,用于在获取模块获取到所述UDP分发程序和所述数据结构映射关系图时,在基于端口复用机制为UDP服务程序创建所述UDP进程,为每一个所述UDP进程绑定独立的套接字,将所述UDP服务程序对应的所有所述UDP进程的套接字添加到所述端口复用组中的一个套接字组后,根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图。
UDP分发程序注入模块,用于根据所述eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口,将所述UDP分发程序注入所述端口复用组。
数据结构映射关系图创建模块,用于在获取模块未获取到所述UDP分发程序和所述数据结构映射关系图时,根据eBPF框架支持的PIN接口在所述BPF文件系统中创建所述数据结构映射关系图。
UDP分发程序编译模块,用于根据所述数据结构映射关系图编译套接字确定逻辑,得到所述UDP分发程序。
此外,在另一个例子中,数据结构映射关系图更新模块在根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图时,具体为:
利用所述UDP分发程序从所述端口复用组当前的状态信息中获取基于端口复用机制为所述UDP进程绑定的套接字,并将获取到的所述套接字加入到所述数据结构映射关系图中的套接字组中;
统计更新后的所述套接字组中添加的所述套接字的个数,并将所述套接字的个数赋值给所述数据结构映射关系图中的套接字个数变量;
将每一个所述套接字组作为所述端口复用组的一个数组元素加入到所述数据结构映射关系图中的所述端口复用组中,并对所述数据结构映射关系图中的位置变量对应的当前变量值进行自增。
此外,在另一个例子中,套接字确定模块503,在根据所述组标识信息和所述位置标识信息,从所述端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发时,具体为:
根据所述组标识信息,从所述端口复用中组选择分发所述UDP报文的套接字所在的套接字组;
根据所述位置标识信息,从所述套接字组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
不难发现,本实施例为与第一或第二实施例相对应的装置实施例,本实施例可与第一或第二实施例互相配合实施。第一或第二实施例中提到的相关技术细节在本实施例中依然有效,为了减少重复,这里不再赘述。相应地,本实施例中提到的相关技术细节也可应用在第一或第二实施例中。
值得一提的是,本实施例中所涉及到的各模块均为逻辑模块,在实际应用中,一个逻辑单元可以是一个物理单元,也可以是一个物理单元的一部分,还可以以多个物理单元的组合实现。此外,为了突出本发明的创新部分,本实施例中并没有将与解决本发明所提出的技术问题关系不太密切的单元引入,但这并不表明本实施例中不存在其它的单元。
本发明第四实施例涉及一种UDP报文的分发设备,如图6所示,包括至少一个处理器601;以及,与所述至少一个处理器601通信连接的存储器602;其中,所述存储器602存储有可被所述至少一个处理器601执行的指令,所述指令被所述至少一个处理器601执行,以使所述至少一个处理器601能够执行上述第一或第二实施例所描述的UDP报文的分发方法。
其中,存储器602和处理器601采用总线方式连接,总线可以包括任意数量的互联的总线和桥,总线将一个或多个处理器601和存储器602的各种电路连接在一起。总线还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与各种其他装置通信的单元。经处理器601处理的数据通过天线在无线介质上进行传输,进一步,天线还接收数据并将数据传输给处理器601。
处理器601负责管理总线和通常的处理,还可以提供各种功能,包括定时,外围接口,电压调节、电源管理以及其他控制功能。而存储器602可以被用于存储处理器601在执行操作时所使用的数据。
本发明第五实施例涉及一种计算机可读存储介质,存储有计算机程序。计算机程序被处理器执行时实现上述UDP报文的分发方法实施例。
即,本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域的普通技术人员可以理解,上述各实施例是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。
Claims (16)
1.一种UDP报文的分发方法,其特征在于,包括:
将需要分发的UDP报文中的四元组作为查找套接字的键;
在预先创建的套接字管理表中查找所述键对应的键值,所述套接字管理表用于记录所述UDP报文与分发所述UDP报文的套接字之间的对应关系;
根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,所述数据结构映射关系图定义了所述键、所述键值与所述组标识信息和所述位置标识信息之间的关系;
根据所述组标识信息和所述位置标识信息,从端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
2.如权利要求1所述的UDP报文的分发方法,其特征在于,所述根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,包括:
如果未查找到,确定处理所述UDP报文的UDP进程个数;
访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息;
根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息。
3.如权利要求2所述的UDP报文的分发方法,其特征在于,所述访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息,包括:
从所述数据结构映射关系图中获取位置变量的当前变量值,所述位置变量的当前变量值用于表示新创建的UDP进程绑定的套接字所在的套接字组在所述端口复用组中的位置;
将所述位置变量的当前变量值作为分发所述UDP报文的套接字所在套接字组的组标识信息。
4.如权利要求2所述的UDP报文的分发方法,其特征在于,所述根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息,包括:
对所述键进行哈希处理,得到所述键的哈希值;
将所述哈希值与所述UDP进程个数进行求模处理;
将得到的求模结果,作为所述套接字在所述套接字组中的位置标识信息。
5.如权利要求2所述的UDP报文的分发方法,其特征在于,在所述根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息之后,所述方法还包括:
将所述组标识信息和所述位置标识信息作为所述键对应的键值;
根据所述键和所述键值,对所述套接字管理表进行更新。
6.如权利要求5所述的UDP报文的分发方法,其特征在于,在所述将所述组标识信息和所述位置标识信息作为所述键对应的键值之前,所述方法还包括:
获取当前系统时间;
所述将所述组标识信息和所述位置标识信息作为所述键对应的键值,包括:
将所述组标识信息、所述位置标识信息和所述当前系统时间作为所述键对应的键值。
7.如权利要求3所述的UDP报文的分发方法,其特征在于,所述根据查找结果,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,包括:
如果查找到,根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息。
8.如权利要求7所述的UDP报文的分发方法,其特征在于,所述键值至少包括标识套接字组在所述端口复用组中位置的键值部分和标识套接字在所述套接字组中的位置的键值部分;
所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息,包括:
根据所述键值中标识套接字组在所述端口复用组中位置的键值部分和所述数据结构映射关系图中记录的所述位置变量、端口复用组、套接字组之间的关系,确定分发所述UDP报文的套接字所在套接字组的组标识信息;
根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息。
9.如权利要求8所述的UDP报文的分发方法,其特征在于,所述键值还包括标识所述套接字分发所述UDP报文的历史系统时间;
在所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息之前,所述方法还包括:
获取当前系统时间;
判断所述当前系统时间与所述历史系统时间之间的时间差值是否小于预设的超时阈值;
如果小于,则执行所述根据查找到的所述键对应的键值和所述数据结构映射关系图,确定分发所述UDP报文的套接字所在套接字组的组标识信息和所述套接字在所述套接字组中的位置标识信息的步骤;
否则,执行所述确定处理所述UDP报文的UDP进程个数,访问预定义的数据结构映射关系图,得到分发所述UDP报文的套接字所在套接字组的组标识信息,根据所述键和所述UDP进程个数,确定所述套接字在所述套接字组中的位置标识信息的步骤。
10.如权利要求9所述的UDP报文的分发方法,其特征在于,在所述根据所述键值中标识套接字在所述套接字组中的位置的键值部分和所述数据结构映射关系图中记录的套接字组和套接字之间的关系,确定分发所述UDP报文的套接字在所述套接字组中的位置标识信息之后,所述方法还包括:
将所述键值中的所述历史系统时间修改为所述当前系统时间;
根据所述键和修改后的所述键值,对所述套接字管理表进行更新。
11.如权利要求1至10任一项所述的UDP报文的分发方法,其特征在于,在所述将需要分发的UDP报文中的四元组作为查找套接字的键之前,所述方法还包括:
根据eBPF框架支持的PIN接口,在挂载的BPF文件系统中获取UDP分发程序和所述数据结构映射关系图;
如果获取到,则在基于端口复用机制为UDP服务程序创建所述UDP进程,为每一个所述UDP进程绑定独立的套接字,将所述UDP服务程序对应的所有所述UDP进程的套接字添加到所述端口复用组中的一个套接字组后,根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图,并根据所述eBPF框架提供的SO_ATTACH_REUSEPORT_EBPF接口,将所述UDP分发程序注入所述端口复用组。
12.如权利要求11所述的UDP报文的分发方法,其特征在于,在所述根据eBPF框架支持的PIN接口,在挂载的BPF文件系统中获取所述UDP分发程序和所述数据结构映射关系图之后,所述方法还包括:
如果未获取到,则根据eBPF框架支持的PIN接口在所述BPF文件系统中创建所述数据结构映射关系图,根据所述数据结构映射关系图编译套接字确定逻辑,得到所述UDP分发程序。
13.如权利要求11所述的UDP报文的分发方法,其特征在于,所述根据所述UDP分发程序和所述端口复用组当前的状态信息更新所述数据结构映射关系图,包括:
利用所述UDP分发程序从所述端口复用组当前的状态信息中获取基于端口复用机制为所述UDP进程绑定的套接字,并将获取到的所述套接字加入到所述数据结构映射关系图中的套接字组中;
统计更新后的所述套接字组中添加的所述套接字的个数,并将所述套接字的个数赋值给所述数据结构映射关系图中的套接字个数变量;
将每一个所述套接字组作为所述端口复用组的一个数组元素加入到所述数据结构映射关系图中的所述端口复用组中,并对所述数据结构映射关系图中的位置变量对应的当前变量值进行自增。
14.如权利要求1至10任一项所述的UDP报文的分发方法,其特征在于,所述根据所述组标识信息和所述位置标识信息,从所述端口复用组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发,包括:
根据所述组标识信息,从所述端口复用中组选择分发所述UDP报文的套接字所在的套接字组;
根据所述位置标识信息,从所述套接字组中定位分发所述UDP报文的套接字,由所述套接字对所述UDP报文进行分发。
15.一种UDP报文的分发设备,其特征在于,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1至14中任一项所述的UDP报文的分发方法。
16.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至14中任一项所述的UDP报文的分发方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110307839.XA CN113132356B (zh) | 2021-03-23 | 2021-03-23 | Udp报文的分发方法、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110307839.XA CN113132356B (zh) | 2021-03-23 | 2021-03-23 | Udp报文的分发方法、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113132356A CN113132356A (zh) | 2021-07-16 |
CN113132356B true CN113132356B (zh) | 2023-06-27 |
Family
ID=76773801
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110307839.XA Active CN113132356B (zh) | 2021-03-23 | 2021-03-23 | Udp报文的分发方法、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113132356B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114938395A (zh) * | 2022-05-11 | 2022-08-23 | 北京字节跳动网络技术有限公司 | 服务响应方法、装置、设备及存储介质 |
CN115118791B (zh) * | 2022-05-20 | 2023-09-22 | 网宿科技股份有限公司 | Udp报文的分发方法、设备及可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20000044321A (ko) * | 1998-12-30 | 2000-07-15 | 윤종용 | 유닉스프로세스와 교환기 프로세스간 메시지 전달방법 및 장치 |
CN112261094A (zh) * | 2020-10-10 | 2021-01-22 | 厦门网宿有限公司 | 一种报文处理方法及代理服务器 |
CN112492054A (zh) * | 2020-11-05 | 2021-03-12 | 杭州萤石软件有限公司 | 用户数据报协议udp端口的复用方法、装置及设备 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070104190A1 (en) * | 2005-11-07 | 2007-05-10 | Nokia Corporation | User datagram protocol packet processing on network elements |
CN108400974B (zh) * | 2018-02-02 | 2021-11-19 | 网宿科技股份有限公司 | 一种流量引导的方法和移动终端 |
CN110321203B (zh) * | 2018-03-29 | 2021-07-30 | 武汉斗鱼网络科技有限公司 | 后台进程假死处理方法及客户端 |
US11115504B2 (en) * | 2018-06-26 | 2021-09-07 | Microsoft Technology Licensing, Llc | Batch processing for QUIC |
CN109298943A (zh) * | 2018-10-11 | 2019-02-01 | 四川长虹电器股份有限公司 | 用于udp服务器的并发处理方法 |
CN110233880B (zh) * | 2019-05-23 | 2021-12-07 | 北京字节跳动网络技术有限公司 | Udp数据包的传输方法、系统、介质和电子设备 |
-
2021
- 2021-03-23 CN CN202110307839.XA patent/CN113132356B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20000044321A (ko) * | 1998-12-30 | 2000-07-15 | 윤종용 | 유닉스프로세스와 교환기 프로세스간 메시지 전달방법 및 장치 |
CN112261094A (zh) * | 2020-10-10 | 2021-01-22 | 厦门网宿有限公司 | 一种报文处理方法及代理服务器 |
CN112492054A (zh) * | 2020-11-05 | 2021-03-12 | 杭州萤石软件有限公司 | 用户数据报协议udp端口的复用方法、装置及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN113132356A (zh) | 2021-07-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3382534B1 (en) | Page jumping method and apparatus | |
US8131860B1 (en) | Serialization and deserialization | |
CN113132356B (zh) | Udp报文的分发方法、设备及存储介质 | |
CN109981493B (zh) | 一种用于配置虚拟机网络的方法和装置 | |
CN110334126B (zh) | 基于Spring MVC的定时任务处理方法、装置和计算机设备 | |
WO2020248375A1 (zh) | 数据库间数据同步方法、系统、计算机设备及存储介质 | |
CN108073423B (zh) | 一种加速器加载方法、系统和加速器加载装置 | |
CN110543324B (zh) | 一种应用程序的插件增量更新方法及装置 | |
CN111404730B (zh) | 一种虚拟路由器的状态同步方法、装置、电子设备及存储介质 | |
CN113220669B (zh) | 业务数据的处理方法、装置及电子设备 | |
WO2016082594A1 (zh) | 数据更新处理方法及装置 | |
CN108183974A (zh) | 一种智能终端应用程序的域名动态切换方法及智能终端 | |
CN112597039A (zh) | 虚拟机访问方法、系统、设备及计算机可读存储介质 | |
CN108062239B (zh) | 一种加速器加载方法、系统和加速器加载装置 | |
US11128622B2 (en) | Method for processing data request and system therefor, access device, and storage device | |
CN113726581A (zh) | 一种恢复网络设备的出厂配置的方法、装置及网络设备 | |
CN112804276B (zh) | 虚拟化宽带远程接入服务器及其控制方法、通信系统 | |
CN115390939B (zh) | 业务处理方法和系统 | |
CN112035379B (zh) | 存储空间的使用方法、装置、存储介质以及电子装置 | |
CN113391759A (zh) | 一种通信方法和设备 | |
JP2018503928A (ja) | ネットワーク・ファイル・システムにおいてi/o要求を処理するための方法及び装置 | |
WO2019183806A1 (zh) | 资源权限处理方法、装置、存储介质及芯片 | |
US10936431B2 (en) | Method, device and computer readable medium for restoring files | |
CN114138829B (zh) | 共享Prepare Statement的方法、系统和网络设备 | |
CN117390078B (zh) | 数据处理方法、装置、存储介质和计算机设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |