一.前言

Libnids是一个用于网络入侵检测开发的专业编程接口,它使用Libpcap进行数据包的捕获。同时,Libnids提供了TCP/IP数据流重组功能,因此省去了应用层自己考虑数据分片、重传等情况的麻烦。它是模仿了Linux 2.0.x的IP协议栈进行数据处理,因此非常稳定可靠。当然,libnids还有一项非常实用的功能,那就是:TCP端口扫描检测和异常数据包的检测功能。

二.应用背景

最近对之前做过的一个关于BT数据流检测及追踪程序进行重构,最大的改变就是抛弃之前在应用程序中自己考虑数据分片、重传等情况的做法,而改用
libnids作为底层数据接收端,然后再把数据交给上层BT数据处理模块进行解析。当然,这样做有极大的好处。主要体现在:

1)程序架构变得清晰而简洁。由于使用libnids来接收数据,上层模块可以专注于BT协议的解析,而不用考虑数据本身是否可靠。

2)内存管理变得简单。之前因为考虑数据的分片及重传,需要对TCP数据进行缓存,既浪费了内存空间,又带来了内存管理的麻烦。

经过重构,程序不仅在代码量上得到极大的简化,而且相比之前,性能更高,并且更稳定。最重要的是,在梳理之后,整个程序变得条理清晰,无论是从可靠性还是扩展性方面讲,都得到极大的提升。

三.libnids概述

网上关于libnids的文章很多,这里就不详细介绍。libnids的源码包中也提供了好几个例子,基本上涵盖了它主要API的用法。并且由于开源,可以直接从源码中窥探个究竟。我主要说一些,使用libnids过程中,需要注意的一些情况。

1)windows下libnids的安装

安装libnids前需要安装winpcap和libnet。其中winpcap(linux下是libpcap)是一个专业的捕包开发工
具;libnet是专业的网络数据包构造和发送开发工具(libcurl也具有类似的功能)。顺便说一下,有很多强悍的开源工具,都是以lib开头,可以
学会使用,能够极大减轻开发任务。winpcap和libnet的具体安装过程可以参见参考文献[2][3]。libnids的源码中直接就有VS工程,
可以进行编译安装。

2)libnids中的几个陷阱

(1)struct
tuple4结构体存储连接双方ip和端口信息。需要注意的是,这里的源地址与目的地址可能跟我们想的不太一样。它跟一次通信中是由client像
server发送数据还是server像client发送数据无关,而是由一次连接是由谁发起来决定源地址和目的地址的。通俗的讲,如果A给B发送数
据,A不一定是源,B不一定是目的。只有当本次连接是由A发起时,A才是源,B是目的。

(2)当tcp_stream中的nids_state为NIDS_JUST_EST时,必须把client.collect和server.collect置成非零的数值,才能够在状态为NIDS_DATA时接受数据并进行处理。否则,数据都会被抛弃。

(3)void nids_discard(struct tcp_stream *a_tcp,int num)函数的用法:如果你期望将要处理的数据长度为n,但是已经收到的数据包总长度为m,其中m<n。那么你可以把第二个参数设置为0,告诉libnids这次数据暂时不处理,给我缓存起来,等到新的数据到来时,一块处理。说白了,该函数的意思就是把第一个参数a_tcp中缓存的数据丢掉第二个参数num个字节,如果还有剩余的话,留到下一次处理。

四.总结

上面提到的问题是我在项目中遇到的具体问题,当然,libnids的功能很强大,我只是利用到了它的TCP/IP数据重组的功能。其他关于libnids 的具体信息,可以参见参考文献[4][5]。

五.参考文献:

1.http://libnids.sourceforge.net/

2.http://blog.hfq.me/windows-libnet.html

3.http://hi.baidu.com/kuangxiangjie/blog/item/19e2c23f7505a7ca7c1e7160.html/cmtid/735b4a609ee549cf8db10dac

4.http://blog.csdn.net/kl222/article/details/6248827

5.http://www.linuxnote.org/libnids-api-chinese-version.html

from: http://blog.csdn.net/xywlzd/article/details/7931429

Libnids---编写网络应用程序的利器的更多相关文章

  1. [转]提高 Linux 上 socket 性能,加速网络应用程序的 4 种方法

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-hisock.html 使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在 ...

  2. 使用 Java 开发兼容 IPv6 的网络应用程序

    根据现有 IPv4 地址的部署速度,剩余的地址将在 10 到 20 年被使用殆尽.因此网络逐渐从 IPv4 向 IPv6 转换是不可避免的,相应的各种网络应用程序都将支持 IPv6.对于 Java,从 ...

  3. 提高 Linux 上 socket 性能 加速网络应用程序的 4 种方法

    使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过 Internet 在全球范围内进行通信.与其他 API 一样,您可以通过一些方法使用 Soc ...

  4. CSharpGL(11)用C#直接编写GLSL程序

    CSharpGL(11)用C#直接编写GLSL程序 +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharp ...

  5. 在Linux上编写C#程序

    自从C#开源之后,在Linux编写C#程序就成了可能.Mono-project就是开源版本的C#维护项目.在Linux平台上使用的C#开发工具为monodevelop.安装方式如下: 首先需要安装一些 ...

  6. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  7. Netty 异步的、事件驱动的网络应用程序框架和工具

    Netty是由JBOSS提供的一个Java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 项目地址:https://githu ...

  8. 如何让VS2013编写的程序

    总体分c++程序和c#程序 1.c++程序 这个用C++编写的程序可以经过设置后在XP下运行,主要的“平台工具集”里修改就可以. 额外说明:(1)程序必须为Dotnet 4.0及以下版本.(XP只支持 ...

  9. 编写一个程序,求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值

    编写一个程序,求s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)的值 1 #import <Foundation/Foundation.h>  2   3 int main( ...

随机推荐

  1. 几年的Git使用技巧总结

    用git有一年了,下面是我这一年来的git使用总结,覆盖了日常使用中绝大多数的场景.嗯,至少是够用一年了,整理出来分享给大家,不明白的地方可以回复交流. 创建和使用git ssh key 首先设置gi ...

  2. 第一个php网页

    <?php date_default_timezone_set('PRC'); if($_POST[ok]) { //echo "记录"; //echo "here ...

  3. [转]JQuery判断浏览器类型版本1.9和2.0之后的区别

    转至:http://zhidao.baidu.com/link?url=Nzk2aSxBKRZKYg9Evqn8hLwMyXTI-4jza-zCAZq4Vd6hWCOHIvuBX6yj8hzDYDrf ...

  4. 《机器学习实战》——K近邻算法

    三要素:距离度量.k值选择.分类决策 原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最 ...

  5. Oracle的commit详解(转)

    java通过jdbc thin方式连接数据库后,对数据库操作时会出现以下两种情况,我这可能记录不全: 1.在sqlplus中查询得到和java终端中输出的查询结果不同 2.执行某些sql语句卡住不动 ...

  6. 实战RPM包制作

    在开发中经常会用到一些rpm包,但是一直没有自己手动制作过.今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo ...

  7. Android开发环境搭建(windows OS)之补充

    这几天搭建了个安卓开发环境,也想玩玩安卓开发.在查询CSDN,CNBLOG,视频网站之后终于把开发环境搭建起来了,发现所有的指导都比较离散,比如有些只说安装方法,有些只说下载方法.本文来个集大成,算是 ...

  8. QT运行时加载UI文件

      写QT程序里运行时加载UI文件,代码如下: 点击(此处)折叠或打开 #include "keyboard.h" #include <QtUiTools> #incl ...

  9. 【转】GitHub平台最火的iOS开源项目——2013-08-25 17

    http://www.cnblogs.com/lhming/category/391396.html 今天,我们将介绍20个在GitHub上非常受开发者欢迎的iOS开源项目,你准备好了吗? 1. AF ...

  10. 谈谈Javascript线程

          其实,大家都知道Javascript的语言执行环境是单线程的,浏览器无论在什么时候都有且只有一个线程在运行Javascript程序.那Ajax发送异步请求怎么解释,setTimeout/s ...