一种连接跟踪管理装置和方法
技术领域
本发明属于数据通信技术领域,涉及数据通信领域中针对linux内核协议栈中连接跟踪技术,尤其涉及一种更加高效的连接跟踪管理系统和方法。
背景技术
目前数据通信领域已经进入多核处理器的时代,多核处理器在数据处理方面有其巨大的优势,同也给编程带来了更高的要求。在保证程序的正确性前提下,要尽可能地提高程序的并发性,以充分发挥多核处理器的优点。
连接特指在网络中两台主机之间的一次完整的通信过程。一条连接一般包含了两个方向的报文:从源主机发向目的主机的原方向报文和由目的主机发回源主机的反方向报文。连接跟踪是linux内核协议栈的一个非常重要的部件,它是实现NAT、有状态防火墙的基础。基于连接跟踪还可以实现许多对内核协议栈的扩展功能,如用户识别、应用识别等。连接跟踪还有一个特点是数据量大,一般情况下内核中的连接跟踪都可以达到数万条。面对如此巨大的数据量,如何实现快速高效的查找和定位就成了一个非常重要的课题。
Linux内核中连接跟踪的管理都是通过一张哈希表实现,将所有的连接跟踪都放到一张哈希表中(采用双向链表处理哈希冲突),通过哈希算法来实现对流的快速查找和访问。下面以linux 2.6内核中连接跟踪表的实现方案为例来做一个简单说明。
每一条连接都包含了两个方向的报文,这就要求连接跟踪的结构能够识别出这两个方向的报文。Linux的实现方法是在连接跟踪结构中包含了两个五元组,五元组通常用于标识网络中的一条连接,其内容包括:源IP地址、目的IP地址、四层协议号(如TCP、UDP等)、源端口、目的端口。在linux协议栈中用于标识一条流的参数除了上述五个以外,还有三层协议号。但是为了描述方便,在本文中仍然称其为五元组。如图1所示。原方向五元组表示的是流发起方向的报文的五元组,反方向五元组表示的回复方向上报文的五元组。(在五元组中还有一个用于标识五元组方向的成员,在下图中并没有标识出。)
连接跟踪的哈希表采用五元组来计算哈希值。一条连接跟踪有两个五元组,那么就会对应两个哈希值。将连接跟踪插入到哈希表中时,需要将两个五元组的链表节点分别插入到对应的哈希位置的冲突链表上,如图2所示。
当有报文进入时,查找其对应的连接跟踪步骤如下:
(1)从报文中取出五元组,计算出对应的哈希值;
(2)根据哈希值从哈希表中找到对应的冲突链表;
(3)遍历冲突链表,从链表上找到与报文的五元组完全匹配的链表节点;
(4)确定链表节点对应的五元组的方向(五元组中有一个标识其方向的成员);
(5)获取到连接跟踪的指针:因为两个五元组对应的链表节点在连接跟踪结构中的偏移量是不同的,因此只要知道五元组的方向,就可以得到其相对于连接跟踪结构头指针的偏移量,根据该偏移量就可以计算出连接跟踪的头指针。
从上面查找连接跟踪的过程可以看出linux连接跟踪管理的一个优点:不管是原方向还是反方向的报文都可以通过哈希查找方便地找到其对应的连接跟踪结构。
在linux内核中只存在一份连接跟踪表,在多核环境下还必需要考虑对连接跟踪表的互斥访问的问题。在linux 2.6内核中采用了一把RCU锁来实现对连接跟踪表的互斥访问。RCU是读、拷贝、更新的意思,它是linux内核提供的一种高效的锁机制,类似于读写锁。RCU锁在读操作时取锁的开销很小,但是在写操作时,取锁的开销却很大。
这种在linux内核中采用了一把锁来实现对连接跟踪表的互斥访问,在读写连接跟踪表之前都必需要给表加锁,在读写完成之后需要给解锁。这个加锁和解锁的过程都会带来一定的开销,即使像RCU这样并发性很高的锁,在加锁或解锁过程中都存在会因为内存同步而导致cache miss的情况,而且在多线程环境中还会存在因为多线程同时竞争同一把锁而导致线程被阻塞的情况,因而影响协议栈的报文转发效率。
发明内容
针对现有技术存在的上述问题,本发明提供了一种连接跟踪管理装置和方法。
本发明的技术方案为:一种连接跟踪管理装置,包括转发表操作模块和控制表操作模块,
所述转发表操作模块,用于在转发表中查找与待转发报文对应的连接跟踪,若获得对应的连接跟踪,则触发其它与所述连接跟踪相关的操作流程,否则通知控制表操作模块进行查找;
所述控制表操作模块,用于在控制表中查找与所述待转发报文对应的连接跟踪,若获得该对应的连接跟踪,则进行其它与所述连接跟踪相关的操作,否则触发新建与所述待转发报文对应的连接跟踪的流程。
进一步的,所述转发表用哈希表来实现对其表项的管理,用单向链表处理哈希冲突;所述控制表用哈希表来实现对其表项的管理,采用双向链表处理哈希冲突,并对每一条冲突链表加锁保护。
进一步的,所述转发表操作模块,具体用于:从待转发报文中取出五元组,计算出对应的哈希值;根据哈希值从转发表对应的哈希表中找到对应的单向冲突链表;遍历所述单向冲突链表,从所述单向冲突链表上找到与待转发报文的五元组完全匹配的链表节点;确定链表节点对应的五元组的方向;获取到连接跟踪的指针。
进一步的,所述控制表操作模块,具体用于:从待转发报文中取出五元组,计算出对应的哈希值;根据哈希值从所述控制表对应的哈希表中找到对应的双向冲突链表;遍历所述双向冲突链表,从所述双向冲突链表上找到与待转发报文的五元组完全匹配的链表节点;确定链表节点对应的五元组的方向;获取到连接跟踪的指针。
进一步的,所述转发表操作模块,还用于多线程并行操作所述转发表对应的哈希表。
进一步的,所述“新建与所述待转发报文对应的连接跟踪的流程”具体指:分配对应的转发表的表项结构和控制表的表项结构,并初始化;在其它应用模块对连接跟踪进行修改后,从待转发报文中取出连接跟踪的两个五元组计算出对应的两个哈希值;连续获取到控制表中两个哈希值对应的锁;将控制表的表项结构插入到控制表中;将转发表的表项结构插入到转发表中;按相反的顺序释放中获取到的两把锁。
基于上述装置的连接跟踪管理方法,包括以下步骤:
A.在转发表中查找与待转发报文对应的连接跟踪,若获得对应的连接跟踪,进入步骤D,若未获得对应的连接跟踪,进入步骤B;
B.在控制表中查找所述对应的连接跟踪,若获得该对应的连接跟踪,进入步骤D,若未获得该对应的连接跟踪,进入步骤C;
C.新建与所述待转发报文对应的连接跟踪;
D.进行其它与所述连接跟踪相关的操作。
进一步的,所述步骤A中,在所述转发表中查找与待转发报文对应的连接跟踪,具体包括以下步骤:
A1.从待转发报文中取出五元组,计算出对应的哈希值;
A2.根据哈希值从转发表对应的哈希表中找到对应的单向冲突链表;
A3.遍历所述单向冲突链表,从链表上找到与待转发报文的五元组完全匹配的链表节点;
A4.确定链表节点对应的五元组的方向;
A5.获取到连接跟踪的指针。
进一步的,所述步骤B中,在所述控制表中查找所述对应的连接跟踪包括以下步骤:
B1.从待转发报文中取出五元组,计算出对应的哈希值;
B2.根据哈希值从所述控制表对应的哈希表中找到对应的双向冲突链表;
B3.遍历所述双向冲突链表,从链表上找到与待转发报文的五元组完全匹配的链表节点;
B4.确定链表节点对应的五元组的方向;
B5.获取到连接跟踪的指针。
进一步的,所述步骤C中,新建与所述待转发报文对应的连接跟踪,具体包括:
C1.分配对应的转发表的表项结构和控制表的表项结构,并初始化;
C2.在其它应用模块对连接跟踪进行修改后,从待转发报文中取出五元组的两个五元组计算出对应的两个哈希值;
C3.连续获取到控制表中两个哈希值对应的锁;
C4.将控制表的表项结构插入到控制表中;将转发表的表项结构插入到转发表中;将两个五元组的链表节点都分别插入到对应的哈希表位置冲突链的开始位置;
C5.按相反的顺序释放第步骤C3中获取到的两把锁。
进一步的,所述转发表用哈希表来实现对其表项的管理,用单向链表处理哈希冲突;所述控制表用哈希表来实现对其表项的管理,采用双向链表处理哈希冲突,并对每一条冲突链表加锁保护。
本发明的有益效果:本发明的方案对linux连接跟踪表结构做优化,即将连接跟踪表分为转发表和控制表两个部分,转发表只实现基本的转发功能,该过程不会有加锁解锁,其它的操作都放到控制表中实现,这些过程才会有对冲突链表的加锁保护,因而本发明实现在报文转发过程中对连接跟踪表的无锁访问,从而提高协议栈的报文转发效率,且同时做到了对连接跟踪表的互斥访问。
附图说明
图1是现有连接跟踪结构示意图;
图2是现有连接跟踪与哈希表的关系示意图;
图3是本发明实施例的转发表的结构示意图;
图4是本发明实施例的转发表操作模块的结构示意图;
图5是本发明实施例的控制表的结构示意图;
图6是本发明的连接跟踪的管理结构示意图;
图7是本发明的连接跟踪管理方法流程图。
具体实施方式
下面结合说明书附图对本发明进一步阐述。
一种连接跟踪管理装置,包括转发表操作模块和控制表操作模块,所述转发表操作模块,用于在转发表中查找与所述待转发报文对应的连接跟踪,若获得对应的连接跟踪,则触发其它与所述连接跟踪相关的操作流程,否则通知控制表操作模块进行查找;所述控制表操作模块,用于在控制表中查找与所述待转发报文对应的连接跟踪,若获得该对应的连接跟踪,则进行其它与所述连接跟踪相关的操作,否则触发新建与所述待转发报文对应的连接跟踪的流程。
下面对转发表的实现和控制表的实现做具体说明。转发表只实现基本的报文转发功能。基本的报文转发功能是指报文转发过程中对连接跟踪表的查找,以及读取报文中的相关内容。它的特点是转发过程中不会修改连接跟踪表的内容,而且该过程对连接跟踪表的性能影响较大。因此,转发表对效率的要求非常高。除了转发表实现的基本的报文转发功能以外,连接跟踪表的其它功能都要由控制表来实现。这些功能主要包括流的新建、老化、删除等。这些操作的特点是它们会修改连接跟踪表的内容。
参见图3所示,转发表的表项中只包含转发相关的数据,主要包括五元组、状态、引用计数等。参见图4所示,转发表采用哈希表来实现对表项的管理,用单向链表处理哈希冲突,整个哈希表不需要加锁保护,转发表与管理它的哈希表一起构成转发表操作模块。单向链表是转发表实现无锁结构的关键。对单链表的操作必需保证一个线程对链表的修改操作不会影响其它线程对该链表的读操作。也就是说,当有一个线程在修改链表时,也允许其它线程同时去遍历该链表,且必需保证所有操作都不能出错。这里简单说明一下对单向链表的操作。
参见图5所示,控制表的表项中只包括与控制相关的内容,主要有五元组和指向对应转发表项的指针。控制表同样采用哈希表实现对表项的管理,控制表与管理它的哈希表一起构成控制表操作模块。采用双向链表处理哈希冲突,且每一条冲突链表都需要加锁保护。
本发明整个连接跟踪表的管理结构控制表再加上转发表如图6所示
如图7所示,基于上述装置的一种连接跟踪管理方法,包括以下步骤:
A.查找转发表,在转发表中查找与转发报文对应的连接跟踪,若获得对应的连接跟踪,进入步骤D,若未获得对应的连接跟踪,进入步骤B;
B.查找控制表,在控制表中查找对应的连接跟踪,若获得该对应的连接跟踪,进入步骤D,若未获得该对应的连接跟踪,进入步骤C;查找控制表发生在以下两种情况中:(1)在查找转发表的过程中,(2)其它模块查找连接跟踪,如NAT模块,或者用户通过命令管理连接跟踪;
C.新建与所述转发报文对应的连接跟踪;
D.进行其它与所述连接跟踪相关的操作:D1.报文与连接跟踪关联,就是将连接跟踪的指针保存到报文中,在其它应用模块中可以通过报文直接找到连接跟踪的指针;D2.处理连接跟踪的四层协议状态变化,这里主要是跟踪一些有状态的四层协议,如TCP协议;D3.更新连接跟踪的老化定时器,也就是让定时器重新开始计时(对于像TCP这种有状态的协议,这里还需要根据其状态修改定时器的定时长度);D4.删除连接跟踪,有两种情况:a、连接跟踪老化时执行删除操作,b、用户通过命令删除连接跟踪。
在上述步骤A中所述转发表中查找与转发报文对应的连接跟踪包括以下步骤:
A1.从报文中取出五元组,计算出对应的哈希值;
A2.根据哈希值从管理所述转发表的哈希表中找到对应的冲突链表;
A3.遍历冲突链表,从链表上找到与报文的五元组完全匹配的链表节点;
A4.确定链表节点对应的五元组的方向;
A5.获取到连接跟踪的指针。
在上述步骤B中所述控制表中查找所述对应的连接跟踪包括以下步骤:
B1.从报文中取出五元组,计算出对应的哈希值;
B2.根据哈希值从管理所述控制表的哈希表中找到对应的冲突链表,并对冲突链表进行加锁保护;
B3.遍历冲突链表,从链表上找到与报文的五元组完全匹配的链表节点,并对该链表节点进行解锁;
B4.确定链表节点对应的五元组的方向;
B5.获取到连接跟踪的指针。
在上述步骤C中新建连接跟踪的大致步骤如下:
C1、分配对应的转发表的表项结构和控制表的表项结构,并初始化;
C2、其它模块对连接跟踪的修改,如NAT;
C3、根据连接跟踪中的两个五元组计算出对应的两个哈希值;
C4、连续获取到控制表中两个哈希值对应的锁。这里要求按照哈希值从小到大的顺序获取这两把锁,(其它地方如果也需要连续获取到这两把锁的话也必需按照相同的顺序,否则有可能导致死锁);
C5、将控制表的表项结构插入到控制表中。也就是将两个五元组的链表节点都分别插入到对应的哈希位置的冲突链的开始位置;
C6、将转发表的表项结构插入到转发表中。将两个五元组的链表节点都分别插入到对应的哈希位置冲突链的开始位置;
C7、按相反的顺序释放步骤C4中获取到的两把锁。
在上述步骤D3中,流的老化具体指:在新建连接跟踪时,为每一条连接跟踪都绑定一个定时器;定时器的定时长度由连接跟踪的协议类型和状态决定;当有报文经过时,需要更新对应连接跟踪的定时器,实际上就是让定时器重新开始计时;如果长时间都没有与连接跟踪对应的报文经过,那么连接跟踪的定时器就会到期;连接跟踪定时器到期后会执行删除连接跟踪的动作。
在上述步骤D4中,删除连接跟踪包括如下步骤:
D41.根据连接跟踪中的两个五元组计算出对应的两个哈希值;
D42.连续获取到控制表中两个哈希值对应的锁(也是按照哈希值从小到大的顺序获取这两把锁);
D43.将对应的转发表的表项从转发表中删除;
D44.将对应的控制表的表项中控制表中删除;
D45.按相反的顺序释放步骤D42中获取到的两把锁;
D46.释放控制表和转发表的表项结构。
本发明对普通的连接跟踪表的实现方案做了改进,将连接跟踪表分为了转发表和控制表两部分。实现在报文转发过程中对连接跟踪表的无锁访问,提高了协议栈报文转发效率。特别是在转发线程的数量较多时,这一点体现得尤为明显。
本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。