首页 > 范文大全 > 正文

Linux环境下基于Raw socket技术的多线程追击抓包法

开篇:润墨网以专业的文秘视角,为您筛选了一篇Linux环境下基于Raw socket技术的多线程追击抓包法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:抓包分析工具一直是维护网络安全分析网络协议必备的工具,但随着网络硬件的发展,网络速度得到大幅提高,从以前的10MHUB到现在的千兆交换机,基于libpcap的抓包分析工具丢包率越来越大,如何使抓包工具支持百兆千兆网卡交换机的同时减少丢包率,对网络安全的维护有很大作用。本文通过比较传统Lipcap抓包技术,发现所存在的弊端,认真研究raw socket,并通过改进多线程对共享数据的访问方式来减少处理线程对抓包线程的影响,提高抓包的速度并达到减少丢包率的目的。

关键词:抓包;多线程;Raw socket技术;共享数据

中图分类号:TP302.7 文献标识码:A 文章编号:1007-9599 (2012) 17-0000-02

1 引言

随着信息技术的快速发展,网络已成为信息交换的主要手段,一些网络支付业务地兴起对网络安全提出了较高的要求。同时,黑客对网络的攻击从未停止,网络安全问题日趋严峻。因此,如何加强网络的安全维护,使抓包工具在支持百兆千兆网卡交换机的同时减少丢包率,对于保障网络安全有重要的现实意义。本文通过比较传统的lipcap抓包技术,找出所存在的弊端,认真研究raw socket,并通过改进多线程对共享数据的访问方式,减少处理包线程对抓包线程的影响来提高抓包的速度,从而达到减少丢包率的目的。

2 传统的libpcap抓包技术的弊端

Libpcap是unix / linux平台下的网络数据包捕获函数包,提供了系统独立的用户级别网络数据包捕获接口,可在绝大多数类unix平台下工作。但是由于它没有提供设置抓包缓存大小的接口,只有32K的内核缓存和32K的用户缓存,存在一定的局限性。每次调用系统进行读写时,只能存取32K的数据,在高速网络中,调用系统读写的次数显著增多,丢包率也相应增高,因此不能满足大数据量的高速网络环境

Libpcap-mmap是libpcap的改进版本,它提供了一个大小可配置的循环缓冲器,并采用了mmap系统调用,完成数据包从内核到用户层的传递,允许用户程序和内核程序同时对该循环缓冲器的不同数据区域进行直接的读取,但是缓冲器必须在抓包开始就创建,耗费空间,当缓冲器一个为满另一个为空时,还要对两个缓冲器做调换操作,势必会影响它的性能。所以一般 linux下的抓包工具都有很严重的丢包问题

3 基于raw socket多线程设计思想及改进

3.1 Raw socket介绍

Raw socket(原始套接字)可以接收本机网卡上的数据帧或数据包,对监听网络的流量和分析是很有作用的。因其可以自如地控制系统下的多种协议,实现对网络底层中传输机制的控制,所以应用原始套接字来操纵网络层和传输层应用。

3.2 多线程设计思想及改进

网络中的抓包程序性能,很大程度上取决于抓包线程保存包的速度,因此要尽量减少从Raw socket中读包并保存的线程的工作量。在此我们采用多线程技术,将抓包与处理包分开,抓包线程将包保存到一个位置,处理线程到指定位置去处理包,此时抓包线程和处理线程就存在访问共享数据的问题。一般情况下需要加锁,但加锁势必会让抓包线程受到处理线程的影响,为了超过libpcap的抓包速度,这里我们设计了线程追击法实现不加锁的多线程互斥访问共享内存。

基本思想如下:

先创建一个全局的指针数组保存所有抓到的包在内存中保存的地址,将这个数组看成一个环,定义变量pos_c 表示抓包线程当前处理的位置,pos_h表示处理线程当前正在处理的位置,初始状态pos_c=pos_h = 0,如图1A所示。

当抓包线程收到一个包之后,分配空间保存此包,当前处理的数组的位置为 poc_c++,当达到最大下标时则变为0,当它的下一个位置==poc_h时,说明数组已满,则暂停抓包,如图1B所示。

当poc_c != poc_h时,处理线程开始工作,每处理完一个包poc_h++,并释放该包内存,已到最大下标时则变为0,一直处理到 pos_c == poc_h时,如图1C所示。

4 多线程编程的具体实现

4.1 抓包线程

抓包线程只做定义 raw socket接收包和保存包的功能,为减少丢包的可能,必须首先提高抓包线程的优先级。这里只说明接收包和保存包到packet数组的实现:

接收包:

定义一个收包的缓存区,这里定义一个最大包长度的字符数组 buff;

Char buff[65535];

用一个死循环来接收 raw socket的包,具体代码见图2A。

4.2 处理线程

此处只说明处理线程读取包的过程,略去具体处理和释放的代码。具体代码见图2B。

5 总结

本文在采用多线程抓包时,利用线程追击法避免抓包线程和处理线程访问共享的数据(包的地址)加锁,从而提高抓包的速度。同时,利用raw socket原生套接字来接收包,从而解决linux平台下libpcap不能设置缓存大小而丢包的问题。具体包的处理不在此文的讨论范围,具体程序退出等其他的控制细节也未详细讨论,代码都在linux下调试可行,仅供参考。另在处理时,也可以采用多线程同时处理的方法,这些处理线程同时在从packet数组中读包时需要加一个锁,但是不影响抓包线程的抓包,从而达到提高速度的目的。

参考文献:

[1]刘循.Linux操作系统及其应用编程[M].高等教育出版社,2011,01.

[2]尤文坚.利用RAW SOCKET捕获网络底层数据包的方法[J].广西轻工业,2007.

[3]寇应展,等.基于libpcap网络数据包捕获技术的改进[J].军械工程学院学报,2011.