一种基于多线程交互处理的IPv6报文分片重组方法与流程

文档序号:24652050发布日期:2021-04-13 20:16阅读:178来源:国知局
一种基于多线程交互处理的IPv6报文分片重组方法与流程
一种基于多线程交互处理的ipv6报文分片重组方法
技术领域
1.本发明涉及通信领域,尤其涉及一种基于多线程交互处理的ipv6报文分片重组方法。


背景技术:

2.作为下一代网络的基础技术协议,ipv6诞生的目的就是为解决ipv4网络地址面临枯竭的问题。近年来,随着工业互联网、物联网、5g等技术的不断发展,对ip地址空间的需求越来越大。从ipv6开始商用到从国家层面推动网络全面改造支持ipv6以来,我国已有数以亿计的ipv6终端设备接入,未来5年间将有数百亿物联网终端接入。到2025年,我国在网络规模、用户规模和流量规模三个关键性指标方面将成为世界第一。
3.随着服务器单机性能的飞跃式提升,单机处理百万千万的并发成为可能,网络功能虚拟化技术应运而生。通过统一标准的高性能服务器、交换机和存储硬件,网络功能虚拟化技术不仅能提供优化的数据平面处理能力,同时也适用于控制平面的管理部署,实现软硬件分离,在保证性能的情况下极大地降低了设备成本、能耗和管理部署的复杂度。为避免传统的分片重组处理需要在内核态和用户态之间切换拷贝带来的cpu性能损耗,多数设备制造商实现的网络功能虚拟化方案能在用户空间提供数据的高速转发和处理。
4.网络技术的不断发展,使网络中各个转发节点的设备处理性能需要不断的提高,而复杂的业务应用和更长的ipv6报文使得网络中转发处理的多是分片报文。所以需要进一步提高分片报文的处理能力以保证更高的数据处理性能。
5.多核多线程实现分片报文的高性能处理,一般是将分片报文送到多个核心多个线程,从而实现分片重组性能的提升。为了网络平台的高性能和高吞吐,首先需要避免多个核心访问同一个内存地址或者数据结构,但是多线程接收分片报文使得各个核心线程之间必须同步内存数据信息,才能保证分片重组的准确性,而目前多线程重组分片报文时,存在线程状态发生切换进入阻塞状态影响重组性能的问题。


技术实现要素:

6.基于现有技术所存在的问题,本发明的目的是提供一种基于多线程交互处理的ipv6报文分片重组方法,能解决现有网络功能虚拟化技术中通过软件处理数据分片报文中,多线程重组分片报文时,存在线程状态发生切换进入阻塞状态影响重组性能的问题。
7.本发明的目的是通过以下技术方案实现的:
8.本发明一种基于多线程交互处理的ipv6报文分片重组方法,包括以下步骤:
9.步骤1,分片重组模块接收某一收包线程发送的分片报文,所述分片报文为该收包线程识别到目的地址是本机地址的分片报文后,发送的分片报文;
10.步骤2,所述分片重组模块对所接收的分片报文进行解析得到分片信息,根据所述分片信息在作为全局变量的hash表内进行查找是否存在标识该分片报文重组的对应表项;
11.步骤3,如果所述步骤2找到标识该分片报文重组的对应表项,则检查该分片报文
是否超时,若未超时则更新分片到达时间并向所述分片重组模块返回分片重组信息,执行步骤4;
12.如果所述步骤2未找到标识该分片报文重组的对应表项,则检查分片数量是否超过最大分片限制,若未超过则将包含收包线程的分片信息存入所述hash表;
13.步骤4,若在作为全局变量的hash表内找到已有与该分片报文对应的分片重组信息,且该分片重组信息包含的收包线程与该分片报文的收包线程不一致,则将该分片报文送入线程调度模块,并同步更新所述hash表内的分片重组信息,并由所述线程调度模块调度至由其它收包线程对收到的同一类分片报文进行重组处理,所述线程调度模块中,采用自旋锁使各收包线程一直处于活跃状态;
14.若该分片重组信息包含的收包线程与该分片报文的收包线程一致,则继续在该分片重组模块更新缓存的分片重组信息后,进行重组处理;
15.步骤5,重组完成后,将完整ipv6报文信息送入后续处理。
16.由上述本发明提供的技术方案可以看出,本发明实施例提供的基于多线程交互处理的ipv6报文重组方法,其有益效果为:
17.通过以hash表作为全局变量,根据收包线程收到的分片报文的分片重组信息进行hash查找后,将该分片保存到全局变量中;若收包线程与hash表查找到的表项所保存的收包线程一致,则在该分片重组模块内进行重组;若收包线程不一致,则将该分片报文送入线程调度模块,使其他收包线程对收到的同一类分片报文进行重组,重组完成后进行普通ipv6报文的处理。并通过在线程调度模块使用自旋锁的方式来保证多线程切换的安全,自旋锁实现简单,并且只针对分片重组模块使用,同时分片报文处理时所占用锁的时间并不长,使得采用自旋锁带来的性能提升远大于其自身不足带来的影响。该方法能使线程状态发生切换不进入阻塞状态,也减少了多线程中单个线程的上下文切换带来的资源浪费。
附图说明
18.为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
19.图1为本发明实施例提供的分片重组方法整体流程图;
20.图2为本发明实施例提供的分片重组方法中分片重组模块的处理流程图;
21.图3为本发明实施例提供的分片重组方法中hash查表的流程图。
具体实施方式
22.下面结合本发明的具体内容,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。本发明实施例中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
23.如图1、2所示,本发明实施例提供一种基于多线程交互处理的ipv6报文分片重组
方法,包括以下步骤:
24.步骤1,分片重组模块接收某一收包线程发送的分片报文,所述分片报文为该收包线程识别到目的地址是本机地址的分片报文后,发送的分片报文;
25.步骤2,所述分片重组模块对所接收的分片报文进行解析得到分片信息,根据所述分片信息在作为全局变量的hash表内进行查找是否存在标识该分片报文重组的对应表项;
26.步骤3,如果所述步骤2找到标识该分片报文重组的对应表项,则检查该分片报文是否超时,若未超时则更新分片到达时间并向所述分片重组模块返回分片重组信息,执行步骤4;
27.如果所述步骤2未找到标识该分片报文重组的对应表项,则检查分片数量是否超过最大分片限制,若未超过则将包含收包线程的分片信息存入所述hash表;
28.步骤4,若在作为全局变量的hash表内找到已有与该分片报文对应的分片重组信息,且该分片重组信息包含的收包线程与该分片报文的收包线程不一致,则将该分片报文送入线程调度模块,并同步所述hash表内的更新分片重组信息,并由所述线程调度模块调度至由其它收包线程对收到的同一类分片报文进行重组处理,所述线程调度模块中,采用自旋锁使各收包线程一直处于活跃状态;
29.若该分片重组信息包含的收包线程与该分片报文的收包线程一致,则继续在该分片重组模块更新缓存的分片重组信息后,进行重组处理;
30.步骤5,重组完成后,将完整ipv6报文信息送入后续处理。
31.上述方法的步骤1还包括,若某一收包线程识别到目的地址不是本机地址的分片报文,且在路由转发表中查找到该分片报文的对应转发信息,则将该分片报文送入虚拟分片重组模块,同步更新分片重组信息后直接转发该分片报文。
32.上述方法的步骤2中,对所接收的分片报文进行解析得到分片信息包括:ipv6头部信息和扩展头部信息。其中,ipv6头部信息包括:报文的目的ip地址、源ip地址、分片标识符和下一报头的类型信息。
33.上述方法中,根据所述分片信息组成查找所述hash表的关键字,利用所述关键字在作为全局变量的hash表内进行查找是否存在标识该分片报文重组的对应表项;
34.所述关键字中包含目的ip地址所在的转发表索引,所述转发表索引根据收包接口确定。
35.上述方法的步骤3包括:
36.将新的分片信息存入所述hash表时,使用有界索引扩展所述hash表进行多线程间无锁查找和修改操作的互斥,若存入失败则重复进行查找与存入操作,直至新的分片信息正常保存至所述hash表。
37.上述方法的步骤4还包括:
38.当该分片报文是本次重组过程的第一个报文,且为首片分片,则重组由本收包线程执行;若该分片报文非报文的首片分片,则将该分片报文的分片重组信息送入所述线程调度模块,交由其他它收包线程执行重组。因为分片报文的转发过程受网络质量的影响,导致到达下一跳节点时可能出现乱序,即分片报文的首片分片在其他分片之后到达下一跳节点,所以收包线程将收到的第一个分片报文送到分片重组模块后,分片重组模块会检查该分片报文是否为首片分片。具体的,当该分片是本次重组过程的第一个报文,在将分片存入
缓存时,若该分片非报文的首片分片,即偏移量不为0时,将分片信息送入线程调度模块,而不是做丢弃处理。
39.上述方法的步骤1中,所述某一收包线程通过异步方式将分片报文发送至所述分片重组模块。
40.上述方法中,线程调度模块使用barrier线程屏障方式同步主线程与其他收包线程。
41.下面对本发明实施例具体作进一步地详细描述。
42.图1所示为本发明实施例提供的基于多线程交互处理的ipv6报文分片重组方法的整体流程图,其中,收包线程识别接收的是否为ipv6报文,若不是ipv6报文,则将报文送到ipv4模块进行处理;如果是ipv6报文,则判断报文目的地址是否为本机的ip地址,若不是本机的ip地址,则直接交由ipv6转发模块查找转发表进行转发;分片的重组只在所有分片到达目的地址的节点时进行,因此只判断目的地址是否是本机ip地址即可;解析分片报文提取报文头信息,若报文头的下一报头(next header)类型为分片扩展报头,则将该分片报文送入分片重组模块进行处理。
43.优选的,收包线程通过异步方式将分片报文送到分片重组模块,确保收包处理的效率;
44.图2所示为本发明实施例提供的分片重组方法中分片重组模块的处理流程图,其中,分片报文进入分片重组模块后,校验ipv6报文头部信息以及扩展报文头部信息是否正确,然后根据提取的ipv6报文头部信息(包括目的ip地址、源ip地址、分片标识符、目的ip所在的转发表索引以及下一报头类型)组成hash查表所需要的key值;
45.所有线程收到的分片报文都由全局变量ip6_reass_main保存,该全局变量的成员变量包括各个收包线程所能接收的最大分片数、最大分片长度和分片间的最大间隔时间等配置,还包括各个收包线程各自的数据结构per_thread_data,用来保存各个收包线程接收的所有分片重组信息,分片信息包括:分片信息ip6_reass_t,本收包线程收到的分片数reass_n和锁状态等。另外,所有收包线程的分片信息ip6_reass_t都保存在全局变量ip6_reass_main的hash成员中。
46.图3所示为本发明实施例的分片重组方法中hash查表的流程图,其中,接前述说明,若在全局变量ip6_reass_main的hash表中未查找到相同key值的分片,则在per_thread_data保存的分片信息链表中新增本次的分片对象ip6_reass_t,然后将本次的分片索引reass_index和收包线程owner_thread_index作为数据内容保存到全局变量ip6_reass_main的hash表中;若因为其他线程已经在hash表中保存了具有相同key值的分片导致保存失败,则重新进行查表保存操作;若是其他原因导致的保存失败,则直接返回错误;
47.若在全局变量ip6_reass_main的hash表中查找到相同key值的分片,则根据hash value中的收包线程owner_thread_index和分片索引reass_index,在数据结构per_thread_data中查找对应的分片对象ip6_reass_t,检查hash value中的收包线程owner_thread_index与本次分片的收包线程索引thread_index是否一致,若不一致,则将线程调度标志位do_handoff置位,并返回分片对象ip6_reass_t;若收包线程一致,则比较本次分片的收包时间和分片对象ip6_reass_t上次记录的收包时间戳,间隔大于所设置的收包最大间隔时间,说明分片超时,需要丢弃本次分片并释放之前保存的分片对象ip6_reass_t,
在数据结构per_thread_data保存的分片信息链表中新增本次的分片对象ip6_reass_t,然后将本次的分片索引reass_index和收包线程owner_thread_index作为数据内容保存到全局变量ip6_reass_main的hash表中;若未超时,则更新分片对象ip6_reass_t的收包时间戳,返回分片对象ip6_reass_t;
48.查表正确返回分片对象ip6_reass_t后,检查线程调度标志位do_handoff是否置位,若置位,则将分片送入线程调度模块同步处理;若标志位do_handoff未置位,则根据分片信息对缓存中已收到的分片进行重组,更新分片信息。
49.如图2所示,本收包线程重组处理本次分片后检查重组是否完成,完成后的报文是否需要送入线程调度模块,由首片分片的收包线程处理该完整报文。
50.分片对象ip6_reass_t使用成员变量first_bi标记是否是一个新的分片重组,在hash查表中只有未查找到key值对应的分片对象ip6_reass_t,在数据结构per_thread_data保存的分片信息链表中新增分片的对象ip6_reass_t时对first_bi初始化置为

1,然后在重组时将本次分片的缓存地址索引值赋给first_bi;分片对象ip6_reass_t使用成员变量last_packet标记分片是否是最后一个分片报文,last_packet置位时重组处理后校验报文长度是否正确,若校验正确则重组完成,将完整报文送入后续流程处理。
51.在hash查表步骤中,新建一个分片对象ip6_reass_t时,将本次分片的收包线程索引thread_index赋值给owner_thread_index,与分片索引reass_index作为hash value保存到hash表中。而新建分片对象的报文可能并非首片分片,所以首片分片的收包线程使用sendout_thread_index作为标记;当重组完成后,完整报文需要通过首片分片的收包线程送入下一处理模块;当报文重组完成且校验正确后,检查分片对象ip6_reass_t保存的收包线程owner_thread_index与首片分片的收包线程sendout_thread_inde是否x一致,若不一致,则将完整报文交由sendout_thread_index收包线程处理。
52.优选的,线程调度模块则使用barrier线程屏障方式来同步主线程与其他收包线程;使用自旋锁确保线程一直处于active状态,避免状态切换带来的性能损耗。
53.多线程收包交互处理的报文重组方法,采用共享内存的方式,各线程间直接访问彼此的数据,尽可能提高分片的重组效率,本发明方法使用一套简单但有效的线程安全机制,来保护临界区数据访问的安全性。
54.定义全局变量frame_queue_mains用于保存所有收包线程对象,在全局变量frame_queue_mains中定义变量per_thread_data用于保存各个收包线程的私有数据。其他的变量还包括:
55.module_index:线程调度能访问的模块索引,如分片重组模块;
56.frame_queue_nums:每个线程队列能处理的最大个数,也就是队列能存入的最大分片数;
57.frame_queue_t:每个线程对应的数据结构,指针数组类型;
58.在分片重组模块需要将分片报文送入线程调度模块时,线程调度模块的入队逻辑所需要的信息包括:线程索引thread_index,分片报文buffer地址,分片ip6_reass_main对应的队列索引frame_queue_index,待处理的分片报文buffer数组长度n_packets,以及发生拥塞时将分片报文丢弃的标志位。
59.分片报文进入线程调度模块,根据队列索引frame_queue_index获取全局变量
frame_queue_mains数据结构,根据线程索引thread_index获取线程的私有数据per_thread_data。
60.循环处理所有n_packets(表示分片报文个数)个分片报文:获取分片报文要送到的下一线程索引;当线程索引和下一线程索引不一致时,先判断是否出现拥塞,若出现拥塞,则记录报文并将报文丢弃,继续处理下一个分片报文;获取线程frame_queue_t中的数据元素,即线程的私有数据per_thread_data的数据元素,统计per_thread_data中所有需要进行线程调度的分片报文数,更新各统计标志,继续处理下一分片报文;当循环处理的n_packets个分片报文中需要线程调度的分片数达到最大256个时,将所有256个分片报文数据送入线程调度的数据队列,做调度处理并将线程调度标志位check_frame_queues置位;即使循环处理的分片报文数n_packets未达到最大256个,在所有n_packets个分片循环处理完成,仍然将n_packets中需要进行线程调度的分片报文送入处理队列,并将check_frame_queues置位。
61.在线程的运行过程中都需要thread_barrier_check检查是否有线程正在访问临界区,若有则线程自旋等待,没有则检查线程调度标志位check_frame_queues是否置位,若check_frame_queues置位,则进入出队列调度流程,遍历frame_queue_mains中的每个队列中的分片报文。
62.出队列流程中,将分片报文送到指定的线程处理,之后将分片报文送给指定的模块继续下一步处理,发送给哪个模块由全局变量frame_queue_mains中的模块索引module_index定义,分片报文处理中模块索引module_index指定为分片重组模块。
63.如图2所示的流程图,分片报文经过线程调度在分片重组模块重组完成后,送到ip6_input模块进入正常不分片报文的处理流程。
64.本发明为不使线程状态发生切换而进入阻塞状态,也为了减少上下文切换带来的资源讯号,线程调度使用自旋锁的方式来保证线程安全。尽管自旋锁存在持锁时间较长会严重影响获取锁的操作,过多的消耗cpu资源。但是自旋锁实现简单,并且只在分片重组模块中使用,同时分片报文处理时所占用锁的时间并不长,使得采用自旋锁带来的性能提升远大于其自身不足带来的影响。
65.以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1