数据包获取

2024-08-07

数据包获取(精选三篇)

数据包获取 篇1

由于Linux系统强大的网络管理功能,很多网络设备都是基于Linux开发的,通过Linux自带的netfilter模块,以及丰富的开源软件可以打造出功能完善的网络接入设备。其中典型的运用就是虚拟子网VLAN,在交换机上划分多个VLAN子网,并且汇聚到中继口Trunk上,同时网关启用VLAN模块,通过配置对应的VLAN虚拟网卡实现与交换机的互联通讯。目前大多数网卡为了提高数据包的处理能力,直接对报文的VLAN Tag进行移除和插入操作,因此到达内核中的数据包已经不包含VLAN Tag。为了实现对数据包的分析审计等需求,需要知道每个数据包是属于哪个VLAN的。基于这个目的本文通过对数据包的收发流程,抓包原理的分析,提出了一种通过直接修改内核让数据包带上VLAN ID的方法。

1 VLAN概述

现在使用最广泛的VLAN协议标准是IEEE 802.1Q,许多厂家的交换机,路由器产品都支持IEEE 802.1Q标准。802.1Q Tag的长度是4 bytes,它位于以太网帧中源MAC地址和长度类型之间。802.1Q Tag包含4个字段。

(1)Type:长度为2 bytes,表示帧类型,802.1Q tag帧中Type字段取固定值0x8100,如果不支持802.1Q的设备收到802.1Q帧,则将其丢弃。

(2)PRI:priority字段,长度为3 bit,表示以太网帧的优先级,取值范围是0~7,数值越大,优先级越高。当交换机,路由器发生传输拥塞时,优先发送优先级高的数据帧。

(3)CFI:Canonical Format Indicator,长度为1bit,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。该字段用于区分以太网帧、FDDI帧和令牌环网帧,在以太网帧中,CFI取值为0。

(4)VID:VLAN ID,长度为12 bit,取值范围是0~4095, 其中0和4095是保留值,不能给用户使用。

2数据包收发流程

数据包到达网卡以后,网卡判断数据包是否为802.1Q报文, 如果是的话则移除VLAN Tag,修改以太网帧,同时把VLAN信息储存在sk_buff中。网卡驱动从网卡收到的报文,已经不带VLAN tag了。接着通过netif_rx进入协议栈,netif_rx调用napi_schedule调度,发送NET_RX_SOFTIRQ软中断,触发net_rx_action执行其poll操作process_backlog , 接着调用netif_receive_skb来处理收到的skb数据。VLAN模块通过调用dev_add_pack注册了802.1Q的协议类型,将自己的prot_hook挂到了ptype_all链表中。在netif_receive_skb遍历ptype_all找到对应的VLAN钩子,于是进入了vlan的接收函数vlan_skb_recv, 这个函数会移除VLAN Tag重置以太网层的proto,再调用netif_rx重新进入协议栈处理流程。由于VLAN Tag已经在网卡上被移除了,实际上并不会进入vlan_skb_recv。不过网卡只会移除第一层VLAN Tag,如果你的报文是QINQ这种双层VLAN的协议,那么第二层VLAN Tag将由vlan_skb_recv来移除。

数据包进入ip_crv以后,根据目的IP进行路由判断,如果是发往本地的报文则进入ip_local_deliver后发往本地应用。如果目的IP不是本机则根据默认路由进入转发模块ip_forward,如果需要NAT则内核修改数据包的源IP等信息,接着协议栈通过dev_queue_xmit调用dev_hard_start_xmit,关联到了具体的网络设备处理函数,从而调用了vlan_dev_hard_start_xmit,在这里插入VLAN Tag头,并压入sk_buffer中,找到真实的网络设备, 再次调用dev_queue_xmit,进入网卡驱动,这里只有双层VLAN协议才会由内核插入内层的VLAN TAG,最外层的VLAN TAG由网卡完成插入。

3 Libpcap抓包原理

Libpcap通过创建AF_PACKET类型的套接字,把自己的prot_hook挂到了ptype_all链表上,AF_PACKET套接字注册的钩子函数是packet_rcv。可以看出无论是接收还是发送的报文,内核都会对ptype_all链表进行遍历,最终会调用到packet_rcv函数, 把数据包加入到了AF_PACKET套接字的接收队列。当应用程式调用recv接收数据包时内核最终会调用packet_recvmsg从接收队列中取出skb,将数据包内容skb->data拷贝到用户空间。

4修改内核插入VLAN ID

通过上面的分析,我们只要在packet_recvmsg函数里在将数据包拷贝到用户空间的时候将VLAN ID插入到报文的结尾,再通过libpcap等AF_PACKET套接字接口获取数据的时候就可以得到VLAN ID。代码修改如下。

修改前:

修改后:

以发送带有VLAN ID为100的报文为例,下图是交换机发出的报文:

Linux网关接收到数据包以后将VLAN ID插入结尾:

5总结

通过修改内核的方式使得AF_PACKET套接字获取的报文携带VLAN ID,为数据包的分析审计提供了基础。

参考文献

[1][美]Robert Love;陈莉君等译.Linux Kernel Develop ment.机械工业出版社.2006.

[2]http://www.netfilter.org/documentation/HOWTO//n etfilter-hacking-HOWTO.html.

数据包获取 篇2

2.滤除系统自带应用;

3.通过列表显示出应用程序的图标(icon),和其他文字信息(应用名称,包名称package name,版本号等等)

首先,我们定义一个数据结构,来保存应用程序信息(icon,name,packageName,versionName,versionCode,等)

[java]

public class AppInfo {

public String appName=“”;

public String packageName=“”;

public String versionName=“”;

public int versionCode=0;

public Drawable appIcon=null;

public void print()

{

Log.v(“app”,“Name:”+appName+“ Package:”+packageName);

Log.v(“app”,“Name:”+appName+“ versionName:”+versionName);

Log.v(“app”,“Name:”+appName+“ versionCode:”+versionCode);

}

}

然后我们通过PackageManager 来获取已安装的应用包信息,

[java]

ArrayList appList = new ArrayList(); //用来存储获取的应用信息数据 List

packages = getPackageManager().getInstalledPackages(0);

for(int i=0;i

PackageInfo packageInfo = packages.get(i);

AppInfo tmpInfo = new AppInfo();

tmpInfo.appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();

tmpInfo.packageName = packageInfo.packageName;

tmpInfo.versionName = packageInfo.versionName;

tmpInfo.versionCode = packageInfo.versionCode;

tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(getPackageManager());

appList.add(tmpInfo);

}//好啦 这下手机上安装的应用数据都存在appList里了,

[java]

if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)

{

//非系统应用

}

else{//系统应用

}

[java]

ArrayList appList = new ArrayList(); //用来存储获取的应用信息数据

List

packages = getPackageManager().getInstalledPackages(0);

for(int i=0;i

PackageInfo packageInfo = packages.get(i);

AppInfo tmpInfo = new AppInfo();

tmpInfo.appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();

tmpInfo.packageName = packageInfo.packageName;

tmpInfo.versionName = packageInfo.versionName;

tmpInfo.versionCode = packageInfo.versionCode;

tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(getPackageManager());

//Only display the non-system app info

if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)

{

appList.add(tmpInfo);//如果非系统应用,则添加至appList

}

数据挖掘技术与用户知识获取 篇3

摘  要  题】实践研究

【英文摘要】This  paper  discusses  the  commonly-used  technologies  in  data  mining,and  explores&n……

【  正  文】

1 数据挖掘技术概述

随着信息技术的迅速发展,数据库的规模不断扩大,从而产生了大量的数据。为给决策者提供一个统一的全局视角,在许多领域建立了数据仓库。但大量的数据往往使人们无法辨别隐藏在其中的能对决策提供支持的信息,而传统的查询、报表工具无法满足挖掘这些信息的需求。因此,需要一种新的数据分析技术处理大量数据,并从中抽取有价值的潜在知识,数据挖掘(Data  Mining)技术由此应运而生。数据挖掘技术也正是伴随着数据仓库技术的发展而逐步完善起来的。

数据挖掘是指从数据集合中自动抽取隐藏在数据中的那些有用信息的非平凡过程,这些信息的.表现形式为:规则、概念、规律及模式等。它可帮助决策者分析历史数据及当前数据,并从中发现隐藏的关系和模式,进而预测未来可能发生的行为。数据挖掘的过程也叫知识发现的过程,它是一门涉及面很广的交叉性新兴学科,涉及到数据库、人工智能、数理统计、可视化、并行计算等领域。数据挖掘是一种新的信息处理技术,其主要特点是对数据库中的大量数据进行抽取、转换、分析和其他模型化处理,并从中提取辅助决策的关键性数据。数据挖掘是KDD(Knowledge  Discovery  in  Database)中的重要技术,它并不是用规范的数据库查询语言(如SQL)进行查询,而是对查询的内容进行模式的总结和内在规律的搜索。传统的查询和报表处理只是得到事件发生的结果,并没有深入研究发生的原因,而数据挖掘则主要了解发生的原因,并且以一定的置信度对未来进行预测,用来为决策行为提供有利的支持。

2 数据挖掘的常用技术

机器学习、数理统计等方法是数据挖掘进行知识学习的重要方法。数据挖掘算法的好坏将直接影响到所发现知识的好坏,目前对数据挖掘的研究也主要集中在算法及其应用方面。统计方法应用于数据挖掘主要是进行数据评估;机器学习是人工智能的另一个分支,也称为归纳推理,它通过学习训练数据集,发现模型的参数,并找出数据中隐含的规则。其中关联分析法、人工神经元网络、决策树和遗传算法在数据挖掘中的应用很广泛。

1)关联分析法。从关系数据库中提取关联规则是几种主要的数据挖掘方法之一。挖掘关联是通过搜索系统中的所有事物,并从中找到出现条件概率较高的模式。关联实际上就是数据对象之间相关性的确定,用关联找出所有能将一组数据项和另一组数据项相联系的规则,这种规则的建立并不是确定的关系,而是一个具有一定置信度的可能值,即事件发生的概率。关联分析法直观、易理解,但对于关联度不高或相关性复杂的情况不太有效。

2)人工神经元网络(ANN),是数据挖掘中应用最广泛的技术。神经网络的数据挖掘方法是通过模仿人的神经系统来反复训练学习数据集,从待分析的数据集中发现用于预测和分类的模式。神经元网络对于复杂情况仍能得到精确的预测结果,而且可以处理类别和连续变量,但神经元网络不适合处理高维变量,其最大的缺点是不透明性,因为其无法解释结果是如何产生的,及其在推理过程中所用的规则。神经元网络适合于结果比可理解性更重要的分类和预测的复杂情况,可用于聚类、分类和序列模式。

3)决策树(DT)是一种树型结构的预测模型,其中树的非终端节点表示属性

上一篇:卫生质量下一篇:绿化混凝土技术