高速网络中IPv6分片包重组的实现

2009-06-05 03:59胡垂立
新媒体研究 2009年9期

[摘要]通过分析IPv6协议,分片攻击的基本特点和Linux多线程算法的实现,建立IPv6分片包并行重组模型,并给出该模型的一种实现方法,在Linux环境下进行了测试,最后对实验结果进行了分析。

[关键词]高速网络 IPv6协议 分片并行重组

中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0510040-01

随着IPv6互联网的逐渐发展、普及,不安全问题并没有随着IPv6逐步取代IPv4而消失,反而日益受到重视。为防范分片攻击以及实现基于IPv6包的后续应用,并减少丢包率,本文提出了IPv6分片包并行重组模型,采取多线程并行重组方式以加快分片包的重组。

一、IPv6协议和分片攻击

基于IPv4协议的上一代互联网因其固有的不稳定性,不安全性,以及其IPv4地址耗尽的现实因素,越来越成为互联网发展的不利因素,与IPv4协议相比,IPv6协议具有许多新的特点并弥补了IPv4的许多不足,比如巨大的地址空间;简洁的IPv6协议报头(基本报头如图1所示)以及全新的扩展报头,其中特别增加了IPSEC安全协议;全新的ICMPv6协议,并将ARP协议和RARP协议功能集成进ICMPv6协议中;自动配置功能;对移动IPv6的支持等。

物理网络通过将IPv6数据包封装进物理帧来在物理层进行数据传输的,每一种物理网络都规定了一帧所能携带的最大数据量。这一限制称为最大传输单元(Maximum Transmission Unit,MTU)。因而一个数据包必须小于或等于一个网络的MTU,否则无法进行封装和传输。IPv6协议规定,如果要发送的IPv6数据包长度大于路由过程中所经过的所有子网的最小MTU值,那么源节点必须对此数据包进行分片,不同于IPv4协议,中间路由器不必再分片了,最后由目的节点进行分片重组。因此,对于数据包捕获系统来说,将网卡设置成混杂(Promiscuous)模式后,也要模拟目的节点将捕获的分片数据包进行重组成原始数据包。

IPv6数据包的分片只能在源节点进行,路由中间节点不再进行分片操作,简化了中间节点对数据包的处理,提高的中间节点对数据包的转发效率;IPv6的分片包重组只发生在目的节点。通过MTU发现机制,源节点可以确定路由中的最小MTU值,以此作为发送数据的最大限度。当源节点要进行分片时,它将在IPv6数据包的可分片部分插入分片扩展报头。这些分片包拥有相同的分片标志,但是分片偏移量各不相同。因此对于每一个分片包,必须包含三个部分,依次是原始数据包的不可分片部分、分片扩展头(fragment header),原始数据包的可分片部分的某一个分片。分片扩展头如图2所示。

其中当M=1的时候表示此分片包不是最后一个分片包,M=0则表示是最后一个分片包。偏移量是13位的无符号整数,以8byte为单位,表示此分片数据相对于未分片的原始数据包中可分片部分的偏移量。

二、分片并行重组模型

本文所叙述的多线程分片并行重组方法可以设计为运行在用户空间和内核空间,这里在用户空间实现此基于libpcap的分片并行重组设计。 利用符合POSIX标准的pthread库来进行多线程编程。为了提高性能,使用基于libpcap和mmap的pfring模块来捕捉数据包。通过使用多线程,可以充分使用多核CPU,进行分片并行重组,减少丢包率。

三、模型的实现

本系统使用LINUX 2.6内核,采用C语言为编程工具,并参考了libnids的源码实现。

(一)主要数据结构。主要用到的数据有:struct hosts hostable,关于hosts的哈希表;hosts,相同hash值的所有主机链表头结点;hostfrags,相同hash值的主机节点;ip6q,ip6frag链表的头结点,链接同一原始数据包的所有分片包;ip6frag,分片包节点;pthread_mutex_t,互斥锁,用于并发访问、主要数据结构之间的逻辑关联如图3所示。

(二)分片重组逻辑流程。1.通过pthread_create循环创建多个线程,设置相应的回调函数;2.在每个回调函数线程中,无限循环调用pfri

ng的pfring_rcv函数获取数据包,若不是分片包,则交由上层的icmp6,tcp6或者udp6模块处理,否则按分片并行重组流程处理;3.分片并行重组流程将收到的每个分片包按分片偏移量的顺序插入到ip6q队列里,当所有的分片包都捕获到了,就将ip6q队列里的所有分片包重组成原始IPv6数据包,交由上层的icmp6,tcp6或者udp6模块处理,并释放相应的ip6q队列。注意的是,在插入或删除hostfrags节点,ip6q节点和ip6frag节点时要锁住相应的上层节点锁。

(三)测试数据。测试用硬件:(1)服务器,配置是双至强CPU,4G

内存,千兆网卡,使用Linux 2.6.25内核,网络协议为IPv6;(2)Smartb

it 6000C测试仪。以Smartbit提供测试流量,发往服务器。以单线程分片重组和两个线程(每CPU一个线程)并行重组为对比,在服务器中获取的测试结果表明,在带宽为100%利用时,小包产生较大的丢包率,但双线程仍然比单线程捕包率高,在大包时,反而会产生丢包,原因是过多拷贝分片包时消耗了CPU时间;在带宽为80%时,各项数据表现良好。

四、总结

本文提出的并行重组算法使用了pthr- ead_mutex_t锁机制,由于mutex锁会使得没有得到资源的线程休眠,产生进程/线程调度,因此对于1Gbit的高速网络中,由于数据包来的非常快,使得并发线程会不停地竞争mutex锁资源,这样大量的CPU用于进程/线程调度,浪费了CPU时间,不利于数据包的捕获,重组等后续处理;spin_lock机制可以使得CPU忙等,线程不必放弃CPU,避免了调度浪费的时间,可以考虑采用spin_lock锁机制。同时,如果要在多核上实现多线程处理,并从根本上避免访问冲突,可以考虑恰当设计数据结构,使得每个CPU只访问属于自己的数据,并给予并行处理线程实时调度策略,和线程专属各自CPU,即线程被调度时不会切换CPU。

参考文献:

[1]Pv6下协议分析技术在入侵检测系统中的研究与应用,暨南大学硕士论文,2006.6.

[2]张会汀、郑力明,IP分片重组算法(RFC815)的实现及其改进,计算机工程与设计,2005.04(26).

作者简介:

胡垂立,男,汉族,在读硕士,广东技术师范学院天河学院计算机系讲师,研究方向为计算机网络、视频技术等。