Libnids---编写网络应用程序的利器
一.前言
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
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---编写网络应用程序的利器的更多相关文章
- [转]提高 Linux 上 socket 性能,加速网络应用程序的 4 种方法
原文链接:http://www.ibm.com/developerworks/cn/linux/l-hisock.html 使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在 ...
- 使用 Java 开发兼容 IPv6 的网络应用程序
根据现有 IPv4 地址的部署速度,剩余的地址将在 10 到 20 年被使用殆尽.因此网络逐渐从 IPv4 向 IPv6 转换是不可避免的,相应的各种网络应用程序都将支持 IPv6.对于 Java,从 ...
- 提高 Linux 上 socket 性能 加速网络应用程序的 4 种方法
使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过 Internet 在全球范围内进行通信.与其他 API 一样,您可以通过一些方法使用 Soc ...
- CSharpGL(11)用C#直接编写GLSL程序
CSharpGL(11)用C#直接编写GLSL程序 +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharp ...
- 在Linux上编写C#程序
自从C#开源之后,在Linux编写C#程序就成了可能.Mono-project就是开源版本的C#维护项目.在Linux平台上使用的C#开发工具为monodevelop.安装方式如下: 首先需要安装一些 ...
- 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 ...
- Netty 异步的、事件驱动的网络应用程序框架和工具
Netty是由JBOSS提供的一个Java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 项目地址:https://githu ...
- 如何让VS2013编写的程序
总体分c++程序和c#程序 1.c++程序 这个用C++编写的程序可以经过设置后在XP下运行,主要的“平台工具集”里修改就可以. 额外说明:(1)程序必须为Dotnet 4.0及以下版本.(XP只支持 ...
- 编写一个程序,求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( ...
随机推荐
- boost------function的使用(Boost程序库完全开发指南)读书笔记
function是一个函数对象的“容器”,概念上像是c/c++中函数指针类型的泛化,是一种“智能函数指针”.它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象. 因此, ...
- 微信开发第8章 通过accesstoken将长连接转换为短链接
业务场景:开发的过程中经常会有一些很长的链接,这个时候如果生成二维码,会导致扫码的过程中识别比较慢,如果存入数据库,会导致数据库的字段长度要设定的很长才行,所以把长连接转换为短链接就越来越重要了. 接 ...
- NOI 1998 免费馅饼
附题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4901 时间限制(普通/Java ...
- <a href> 带有cookie
<a href = <s:url action="exam/examAction_startExam.action" > <s:param name=&qu ...
- JSON与JAVA数据的相互转换
http://www.cnblogs.com/linjiqin/archive/2011/09/19/2181408.html import net.sf.json.JSONArray; import ...
- 分页存储过程--From:桌面备份 -> sql2005新功能.docx
二.以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序. USE AdventureWorks; GO WITH OrderedOrders AS (SELECT Sale ...
- js select onchange事件
<select id='a' name='a' onchange="javascript:alert('测试');">
- ActionBarSherlock
https://github.com/JakeWharton/ActionBarSherlock https://github.com/ddewaele/GoogleMapsV2WithActionB ...
- 【Android】BroadCast广播机制应用与实例
如何编写广播接收器 第一步:需要继承BroadcastReceiver类,覆写其中的onReceive()方法. class MyBroadcastReceiver extends Broadcast ...
- Apache的prefork模式和worker模式(转)
prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求 ...