网络数据包抓取以及流量分析

合集下载

网络流量分析技术的基本原理及工作流程(一)

网络流量分析技术的基本原理及工作流程(一)

网络流量分析技术是指通过对网络数据包进行深入研究和分析,了解和提取其中的有用信息,以便更好地了解网络的运行状况、网络安全状况、网络性能优化等方面的问题。

本文将从基本原理和工作流程两个方面来详细探讨网络流量分析技术。

一、基本原理网络流量分析技术的基本原理包括数据包捕获、数据包解析和数据包分析。

1. 数据包捕获网络流量分析技术的第一步是捕获数据包。

在网络通信中,所有的数据传输都是通过数据包的形式进行的,因此捕获数据包是进行流量分析的基础。

捕获数据包有多种方法,其中一种常用的方法是通过网络抓包软件来实现,这些软件能够在网络链路上截获数据包,并将其保存下来以供后续分析。

2. 数据包解析捕获到数据包后,需要对其进行解析,以便能够获取其中的有用信息。

数据包解析的过程主要包括以下几个方面的内容:源IP地址和目标IP地址、源端口号和目标端口号、传输协议、数据包大小等。

这些信息可以帮助分析人员了解数据包的来源和目的地,以及所使用的通信协议等核心信息。

3. 数据包分析数据包解析完毕后,分析人员可以对数据包进行深入的分析。

数据包分析的内容包括但不限于:网络流量监测、网络性能评估、网络安全检测等。

通过对数据包的分析,可以发现网络中存在的问题和潜在威胁,然后采取相应的措施进行处理。

二、工作流程网络流量分析技术的工作流程通常分为准备阶段、数据采集阶段、数据处理阶段和数据分析阶段。

1. 准备阶段在进行网络流量分析之前,需要进行一些准备工作。

首先,需要选择合适的网络抓包工具,并进行配置以便能够捕获到所需的数据包。

其次,需要准备一台或多台计算机来进行数据包的存储和分析。

最后,还需要明确分析的目标和需求,以便能够有针对性地进行数据采集和分析。

2. 数据采集阶段在准备工作完成后,进入数据采集阶段。

这个阶段的核心任务就是通过网络抓包软件来进行数据包的捕获。

捕获到的数据包可以保存在本地计算机上,也可以通过网络传输到远程服务器上进行存储。

数据包抓包分析

数据包抓包分析

数据包抓包分析数据包抓包分析是一种网络通信分析技术,通过捕获网络数据包并对其进行详细的分析,可以深入了解网络流量的详细情况,发现网络通信中的各种问题、威胁和漏洞。

以下是关于数据包抓包分析的详细介绍。

一、数据包抓取数据包抓取是进行数据包分析的第一步,它通过截获网络数据包并将其记录下来,以便后续的分析和处理。

在网络数据包抓取过程中,通常使用一些专门的数据包抓取工具,如Wireshark、tcpdump等来实现。

这些工具可以通过旁路监听或者利用操作系统的数据包过滤功能等方式,截获网络数据包并记录下来。

二、数据包分析工具在进行数据包分析时,需要使用一些专门的数据包分析工具。

这些工具可以对截获的数据包进行详细的解析和处理,帮助分析人员更好地了解网络流量和通信情况。

常用的数据包分析工具包括Wireshark、tcpdump、Sniffer等。

其中,Wireshark是一款非常流行的开源网络协议分析工具,它可以捕获网络数据包并显示详细的层次结构和协议信息。

tcpdump则是一款常用的命令行网络分析工具,它能够以人类可读的格式输出数据包的详细信息。

三、数据包分析实践在进行数据包分析时,通常需要遵循一定的步骤。

首先,需要明确分析的目的和需求,确定需要抓取哪些数据包以及需要分析哪些协议和端口。

其次,选择合适的数据包抓取工具进行数据包的捕获,并将捕获到的数据包保存为文本或者二进制文件。

然后,使用数据包分析工具对捕获到的数据包进行分析和处理,根据需求过滤、查找和分析数据包中的各种信息。

最后,根据分析结果得出结论,解决问题或漏洞。

四、数据包分析应用数据包抓取和分析在网络通信领域有着广泛的应用。

例如,在日常网络管理中,可以使用数据包分析工具检测网络通信中的异常和故障,如网络延迟、丢包、断流等。

在网络安全领域,可以使用数据包分析工具检测网络攻击、病毒传播等安全威胁,及时发现并防范潜在的安全风险。

此外,在软件开发和调试过程中,可以使用数据包分析工具对软件产生的网络流量进行分析,帮助开发人员更好地了解软件的运行情况和通信机制。

如何进行网络数据包分析和抓包

如何进行网络数据包分析和抓包

如何进行网络数据包分析和抓包网络数据包分析和抓包是网络安全和网络调试中非常重要的技能。

通过对网络数据包的深入分析和抓取,我们可以了解网络通信的细节,识别出潜在的安全威胁,解决网络故障,提高网络性能。

本文将介绍如何进行网络数据包分析和抓包的基本知识、常用工具和实际操作过程。

一、网络数据包分析的基本知识1. 什么是网络数据包网络数据包是在计算机网络中传输的基本单位。

它包含了源地址、目标地址、协议类型、数据内容等信息。

通过分析数据包的头部和负载部分,我们可以了解网络通信的详细过程。

2. 数据包分析的目的数据包分析的目的是为了了解网络通信中存在的问题,如安全漏洞、传输错误、性能瓶颈等。

通过分析数据包,我们可以检测恶意攻击、监测网络流量、优化网络性能,并提供证据用于网络调查等。

二、常用的网络数据包分析工具1. WiresharkWireshark是一款功能强大的开源网络分析工具,支持多种操作系统平台。

它可以捕获和分析网络数据包,并提供详细的统计信息、过滤器和可视化功能,帮助我们深入了解数据包的结构和内容。

2. tcpdumptcpdump是一款命令行网络抓包工具,适用于Unix/Linux操作系统。

它可以捕获网络接口上的数据包,并以文本形式输出。

tcpdump可以通过设置过滤规则过滤数据包,提供更灵活的抓包方式。

三、进行网络数据包分析和抓包的步骤以下是进行网络数据包分析和抓包的一般步骤,具体操作可根据实际情况调整。

1. 准备必要的工具和环境首先,确保已安装合适的网络数据包分析工具,如Wireshark或tcpdump。

同时,保证工作环境的网络连接正常,并具备足够的权限进行抓包和分析操作。

2. 选择抓包的目标根据需要,确定抓包的目标。

可以是整个网络流量,也可以是特定的IP地址、端口或协议。

这有助于提高分析效果,节约存储空间。

3. 开始抓包使用选择的工具开始抓包。

可以设置过滤器,只抓取感兴趣的数据包。

抓包期间,可以进行其他相关操作,如执行特定应用程序、浏览网页等,以增加抓取的数据多样性。

计算机网络中的网络流量分析

计算机网络中的网络流量分析

计算机网络中的网络流量分析网络流量分析是指对计算机网络中的数据流进行监测、收集和分析的过程。

它通过对网络上的数据包进行捕获和解析,获得关于网络流量的各种信息,如流量量、流量类型、流量来源等,以便对网络状况进行评估、故障诊断和网络优化。

本文将介绍网络流量分析的基本概念、常用技术和应用领域。

一、网络流量分析的基本概念网络流量分析是指通过对网络中传输的数据进行捕获和解析,获取网络流量的相关信息。

其中,数据包是网络传输的最基本单位,它包含了源IP地址、目的IP地址、协议类型、端口等关键信息。

通过对数据包的分析和解析,可以获取到网络中传输的各种流量信息。

二、网络流量分析的常用技术1. 抓包技术:通过在网络中放置嗅探器或使用软件工具捕获网络数据包。

常见的抓包工具有Wireshark、tcpdump、WinPcap等。

这些工具可以捕获到网络中的数据包,进而进行进一步的分析。

2. 流量解析技术:对捕获到的数据包进行解析,提取出关键信息。

常见的解析技术有协议解析、应用层解析等。

协议解析可以分析数据包中的协议类型,如TCP、HTTP、FTP等。

应用层解析可以更深入地分析数据包中的应用层协议,如HTTP请求、DNS查询等。

3. 流量统计技术:对网络中的流量进行统计和分析,了解网络的整体状况和流量分布情况。

常见的统计技术有流量量统计、流量速率统计等。

通过统计分析,可以得出网络的高峰期、流量的来源和去向,以及详细的流量统计报表。

三、网络流量分析的应用领域1. 网络监测与管理:网络流量分析可以监测和管理网络中的流量,从而及时发现网络故障和异常,保障网络的正常运行。

例如,通过实时分析网络流量,可以及时发现异常流量和攻击行为,提高网络的安全性。

2. 带宽优化:通过对网络流量进行分析,可以了解网络的瓶颈和拥堵点,优化网络带宽的分配和利用。

例如,分析流量统计报表,可以发现某些应用程序消耗了大量的带宽资源,进而采取相应的措施进行限制或优化。

计算机网络中的流量分析方法与应用

计算机网络中的流量分析方法与应用

计算机网络中的流量分析方法与应用随着互联网的广泛应用和技术的飞速发展,网络安全成为了互联网进一步发展的重要瓶颈。

网络安全问题可以说涉及到计算机网络的各个方面,其中流量分析更是其中关键的一环。

流量分析是指从网络通信中抓取数据包并进行分析,以便得到网络通信的相关信息,从而对网络安全进行防范和检测。

本文将结合实际案例,介绍计算机网络中的流量分析方法及其应用。

一、流量分析的方法1. 抓包工具抓包工具是一类可以从网络中拦截网络通信数据的软件工具。

通过使用抓包工具,可以实现对网络通信数据进行分析,侦测网络流量瓶颈、网络攻击等一系列操作。

常用的抓包工具有Wireshark、Tcpdump等。

Wireshark可以以图形化的方式方便地显示各种协议信息,支持上千种协议包括TCP、UDP、HTTP、SSH、FTP、SMTP等等。

Tcpdump则是一个命令行工具,可以实时抓取和解码网络数据包,支持过滤掉不需要的内容。

2. 流量分析方法流量分析方法是指在抓包工具基础上,对抓取的网络数据包进行分析,以得到网络通信的相关信息。

流量分析方法有以下几种:(1)协议分析网络通信过程中采用的协议种类较多,协议分析就是抓取数据包后,对其中的协议包进行解析和分析。

协议分析可以分为两个层级:网络层面和应用层面。

网络层面协议分析主要是对IP、TCP/UDP等协议进行深度研究,应用层分析则是对应用层协议例如HTTP、DNS、SMTP等进行分析。

通过分析协议信息,可以获得一些有用的信息,例如IP地址、端口号、访问计数、流量大小等等。

(2)数据包重建数据包重建是指抓取到的多个数据包通过一个特定的规则进行组合和重建,以还原出原始数据的过程。

重建后的数据包可以被用于数据包内容及其属性的分析。

数据包重建命令在Wireshark等抓取工具中可以直接使用。

3. 网络流量的常见指标网络流量的常见指标包括:(1)包速率——单位时间内收发的数据包数量(2)位速率——单位时间内收发的数据总量,通常以bps(比特/秒)为单位(3)时延——从发向网络的数据包到其到达目的地所需的时间(4)抖动——时延的抖动范围,即数据包到达目的地的时间的波动情况(5)可靠性——数据包在传输过程中损坏或丢失的频率二、流量分析的应用1.网络入侵行为检测网络入侵是指未经授权访问计算机系统或利用计算机系统漏洞进入、破坏计算机系统和网络的行为。

如何进行网络流量分析和监控

如何进行网络流量分析和监控

如何进行网络流量分析和监控网络流量分析和监控是保障网络安全和性能优化的重要工作。

通过分析网络流量,可以及时发现和识别各种网络攻击,保护网络的安全性;同时,网络流量监控可以帮助管理员及时发现和解决网络拥堵、性能瓶颈等问题,提高网络的稳定性和性能。

本文将探讨如何进行网络流量分析和监控。

一、网络流量分析网络流量分析是指对网络中传输的数据进行抓包和分析,以了解网络的行为和性能,识别异常情况。

下面是进行网络流量分析的一些方法和工具:1. 抓包工具网络流量分析的第一步是抓取网络数据包。

常用的抓包工具有Wireshark、Tcpdump等。

这些工具可以在特定的网络接口上捕获数据包,并将其保存到文件中供后续分析。

2. 数据包解析抓包后,需要对数据包进行解析,以获取更多有用的信息。

Wireshark等抓包工具提供了各种过滤器和解码器,可以解析数据包的协议头、载荷等,并显示在用户界面上,方便查看和分析。

3. 流量统计对网络流量进行统计分析,可以从宏观上了解网络的使用情况。

例如,可以统计某个IP地址的发送/接收数据量、占用带宽等,以及根据某个端口号来统计应用程序或服务的使用情况。

常用的统计工具有Cacti、Ntop等。

4. 异常检测网络流量分析还可以用于异常检测,通过对比网络的正常行为和异常行为,识别出潜在的安全威胁。

常用的异常检测方法包括规则匹配、行为分析等。

IDS(入侵检测系统)和IPS(入侵防御系统)是常用的异常检测和防御工具。

二、网络流量监控网络流量监控是指持续地监视网络的流量,及时发现和解决网络问题。

下面是进行网络流量监控的一些方法和工具:1. 流量收集首先,需要选择一个合适的流量收集方法,将网络流量导入到监控系统中。

常见的方法有镜像端口、流量镜像(SPAN/RSPAN)以及网络超级节点(NetFlow、sFlow等)。

这些方法可以将网络流量复制到监控设备上进行分析和存储。

2. 流量分析对于大规模网络,直接分析原始流量可能会变得非常困难和耗时。

网络流量监测与分析

网络流量监测与分析

网络流量监测与分析网络流量监测与分析是一项重要的技术,它能够帮助网络管理员实时了解网络中的数据流动情况,分析网络流量特征,检测网络威胁,并提供优化网络性能的方案。

本文将重点论述网络流量监测与分析的原理、应用和挑战。

一、网络流量监测的原理网络流量监测是指通过监视网络的数据包,收集和分析各种网络流量信息。

其主要原理包括数据包捕获、数据包分析和数据可视化。

1. 数据包捕获数据包捕获是指通过网络监控设备(如防火墙、IDS/IPS等)或专业的网络流量监控工具,实时获取网络中的数据包。

常用的捕获方式包括端口镜像、混杂模式捕获等。

2. 数据包分析数据包分析是指对捕获到的数据包进行深入分析,提取有价值的网络流量信息。

通过解析协议头部信息、提取有效载荷等手段,可以获取到源IP地址、目的IP地址、端口号、数据流量大小等关键信息。

3. 数据可视化数据可视化是将分析得到的网络流量信息以图形化的形式展示,使得网络管理员可以直观地了解网络流量的趋势、峰值、异常等。

常用的可视化工具包括柱状图、折线图、热力图等。

二、网络流量监测的应用网络流量监测在网络管理中起着至关重要的作用,主要应用于以下几个方面:1. 网络性能优化通过对网络流量进行监测和分析,可以帮助网络管理员了解网络带宽的利用率、瓶颈问题以及流量分布情况。

根据分析结果,可以采取相应的措施,优化网络性能,提升用户体验。

2. 网络安全保障网络流量监测可以帮助发现和阻止各种网络威胁,如网络攻击、恶意软件传播等。

通过对流量的分析,可以检测到异常的流量模式,及时采取措施应对,保护网络安全。

3. 运营分析对网络流量进行分析还有助于网络运营商做出决策,提升服务质量。

比如,可以根据用户的网络使用习惯和流量消耗情况,进行网络资源调配,提供更优质的网络服务。

三、网络流量监测的挑战尽管网络流量监测与分析有着广泛的应用前景,但也面临着一些挑战。

1. 流量量庞大随着网络应用的不断增多,网络流量的增长速度呈几何级数增长。

如何进行有效的网络流量分析

如何进行有效的网络流量分析

如何进行有效的网络流量分析网络流量分析是指对网络中传输的数据进行实时监测、捕获和分析的过程。

通过对网络流量的细致分析,可以揭示出网络中的异常活动、漏洞以及威胁,从而有助于网络管理人员及时采取相应的安全措施。

本文将介绍如何进行有效的网络流量分析,希望对网络管理人员有所帮助。

一、收集网络流量数据首先,在进行网络流量分析之前,需要收集足够多的网络流量数据。

通常情况下,可以利用流量分析工具来捕获流量数据包,如Wireshark、tcpdump等。

这些工具可以在目标主机或者网关上进行部署,并将捕获的数据包保存为pcap文件。

一旦有了足够多的流量数据,就可以进行后续的分析工作。

二、预处理流量数据在进行流量分析之前,需要对收集到的流量数据进行预处理。

预处理的目的是为了减少数据的冗余性,并提取出有用的信息。

常见的预处理操作包括去除重复的数据包、去除非关键性的流量等。

通过预处理,可以大大减少后期分析的工作量,提高网络分析的效率。

三、基础流量分析基础流量分析是网络流量分析的第一步,主要是对流量数据进行初步的统计和分析。

可以通过以下几个方面来进行基础流量分析:1. 流量量统计:根据捕获的流量数据包,可以统计出整个网络的流量量,包括流量的大小、方向、协议类型等。

通过对流量的统计,可以了解网络的整体情况,为后续深入的流量分析提供参考。

2. 流量特征分析:通过对流量数据包的内容进行分析,可以发现一些与网络安全有关的特征。

比如,可以通过分析数据包的源IP地址、目标IP地址、端口号等信息,发现潜在的攻击者或者异常活动。

3. 流量行为分析:通过对流量数据包的行为进行分析,可以发现一些网络中的异常行为。

比如,可以监测到大量的SYN Flood攻击、DDoS攻击等。

通过分析这些异常行为,可以及时采取相应的安全措施,保护网络的安全。

四、深入流量分析基础流量分析只是对流量数据进行了初步的处理和分析,为了进一步发掘更多有用的信息,需要进行深入流量分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<pcap.h>#include<stdlib.h>typedef struct macaddress{u_char mac1;u_char mac2;u_char mac3;u_char mac4;u_char mac5;u_char mac6;};typedef struct macheader{macaddress dest;macaddress src;u_short type;};//IP地址32位,这里用4个字节来表示。

typedef struct ipaddress{u_char by1;u_char by2;u_char by3;u_char by4;};//IP报文格式typedef struct ipbaowen{u_char ver_ihl;//首部长度和版本号u_char tos;//服务类型u_short tlen;// 报文总长度u_short ident;// 标识u_short flags_fo;// 标志和片偏移u_char ttl;// 生存时间u_char proto;//协议类型#define IP_ICMP 1#define IP_IGMP 2#define IP_TCP 6#define IP_UDP 17#define IP_IGRP 88#define IP_OSPF 89u_short crc;ipaddress saddr;ipaddress daddr;};typedef struct tcpheader{u_short sport;// 源端口u_short dport;// 目的端口u_int th_seq;// 序列号u_int th_ack;// 确认号u_char th_lenand;// 报文长度u_char th_flags;//标志#define TH_FIN 0x01#define TH_SYN 0x02#define TH_RST 0x04#define TH_PSH 0x08#define TH_ACK 0x10#define TH_URG 0x20u_short th_win;//窗口u_short th_sum;//校验和u_short th_urp;//紧急};// UDP格式typedef struct udpheader{u_short sport;// Source port 源端口u_short dport;// Destination port 目的端口u_short uh_len;// Datagram length 用户数据包长度u_short uh_sum;// Checksum 校验和};typedef struct udpnode{ipaddress saddr;ipaddress daddr;u_short sport;u_short dport;u_short length;u_int upnum;u_int downnum;struct udpnode * next;struct udpnode * pre;};typedef struct tcpnode{ipaddress saddr;ipaddress daddr;u_short sport;u_short dport;u_short length;u_int upnum;u_int downnum;struct tcpnode * next;struct tcpnode * pre;};#define tcphashtablelength 10#define udphashtablelength 10udpnode udphashtable[udphashtablelength];tcpnode tcphashtable[tcphashtablelength];void initudp(){for(int i =0; i < udphashtablelength; i++){udphashtable[i].pre = udphashtable + i;udphashtable[i].next = NULL;udphashtable[i].length =0;}}void inittcp(){for(int i =0; i < tcphashtablelength; i++){tcphashtable[i].pre = tcphashtable + i;tcphashtable[i].next = NULL;tcphashtable[i].length =0;}}int hash(int a,int b,int c,int d){return(a %2+ b %3+ c %4+ d %5);}void packet_handler(u_char *param,const struct pcap_pkthdr *header,const u_char *pkt_data); void dispatcher_handler(u_char *,const struct pcap_pkthdr *,const u_char *);void showudphashtable();void showtcphashtable();////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////int main(){FILE * PP;pcap_if_t *alldevs;pcap_if_t *d;int inum;int i =0;pcap_t *adhandle;char errbuf[PCAP_ERRBUF_SIZE];u_int netmask;char packet_filter[]="ip";struct bpf_program fcode;#define LINE_LEN 10pcap_t *fp;char errbuf2[PCAP_ERRBUF_SIZE];char source[PCAP_BUF_SIZE];initudp();//////////////////////////////////inittcp();////////////////////////////////////获取设备列表;if(pcap_findalldevs(&alldevs, errbuf)==-1)//{fprintf(stderr,"Error?in?pcap_findalldevs:?%s\n", errbuf);exit(1);}//显示设备名及其描述for(d = alldevs; d; d = d->next){printf("%d. %s\n",++i, d->name);//设备名printf(" (%s)\n", d->description);//设备描述}printf("适配器总共有%d个\n", i);if(i ==0){printf("\nNo?interfaces?found!?Make?sure?WinPcap?is?installed.\n");return-1;}//输入某个适配器;printf("Enter the device number(1-%d):", i);scanf_s("%d",&inum);if(inum <=0|| inum>i){printf("\ndevice number out of range.\n");pcap_freealldevs(alldevs);return-1;}//使d指向输入的那个;for(d = alldevs, i =0; i< inum -1; d = d->next, i++);//打开指定的适配器;if((adhandle = pcap_open_live(d->name,65536,1,1000, errbuf))== NULL){fprintf(stderr,"\nUnable?to?open?the?adapter.?%s?is?not?supported?by?WinPcap\n");pcap_freealldevs(alldevs);/*?Free?the?device?list?*/return-1;}//检查链路层if(pcap_datalink(adhandle)!= DLT_EN10MB){fprintf(stderr,"\nThis?program?works?only?on?Ethernet?networks.\n");/*?Free?the?device?list?*/pcap_freealldevs(alldevs);return-1;}/* 获得接口第一个地址的掩码 */if(d->addresses != NULL)//netmask =((struct sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr; elsenetmask =0xffffff;//编译过滤器if(pcap_compile(adhandle,&fcode, packet_filter,1, netmask)<0){fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");/*?Free?the?device?list?*/pcap_freealldevs(alldevs);return-1;}//设置过滤器if(pcap_setfilter(adhandle,&fcode)<0){fprintf(stderr,"\nError?setting?the?filter.\n");pcap_freealldevs(alldevs);return-1;}printf("\nlistening on : %s...\n", d->description);pcap_freealldevs(alldevs);pcap_dumper_t * dumpfp;dumpfp = pcap_dump_open(adhandle,"data");char[]="data";//开始抓包////////////////////////////////////////////////////pcap_loop(adhandle,100, packet_handler,(u_char*)dumpfp);pcap_close(adhandle);pcap_dump_close(dumpfp);/* 根据新的WinPcap语法创建源字符串 */if(pcap_createsrcstr(source,// variable that will keep the source string PCAP_SRC_FILE,// we want to open a fileNULL,// remote hostNULL,// port on the remote host,// name of the want to openerrbuf // error buffer)!=0){fprintf(stderr,"/nError creating a source string/n");return-1;}/* 打开捕捉文件 */if((fp = pcap_open(source,// name of the device65536,// portion of the packet to capture// 65536 guarantees that the whole packet will be captured on all the link layers PCAP_OPENFLAG_PROMISCUOUS,// promiscuous mode1000,// read timeoutNULL,// authentication on the remote machineerrbuf2 // error buffer))== NULL){fprintf(stderr,"/nUnable to open the ", source);return-1;}showudphashtable();showtcphashtable();printf("hashtable----show----is----stopped\n");//打开离线pcap文件,将其显示出来;pcap_loop(fp,0, dispatcher_handler, NULL);system("pause");return0;}void showudphashtable(){printf("start to show udphashtable-------->\n");printf("UDP hashtable:\n");int i;for(i =0; i < udphashtablelength; i++){udpnode *s;printf(" key = %d:\n", i);s = udphashtable + i;while((s->next)!= NULL){printf("\n");s = s->next;printf("这是IP:%d.%d.%d.%d 端口:%d------和-----IP:%d.%d.%d.%d端口:%d之间的连接\n",s->saddr.by1,s->saddr.by2,s->saddr.by3,s->saddr.by4,s->sport,s->daddr.by1,s->daddr.by2,s->daddr.by3,s->daddr.by4,s->dport);printf("数据包总长度:%d字节上行数据包数目:%d个下行数据包数目:%d个\n", s->length,s->upnum,s->downnum);}}printf("UDP显示完---------------------------------------------------------------------------------------------------\n");}void showtcphashtable(){printf("begin:\n");printf("TCP hashtable : ");int i;for(i =0; i < tcphashtablelength; i++){tcpnode *s;printf("%d\n", i);s = tcphashtable + i;while((s->next)!= NULL){s = s->next;printf("目的端口%d->源端口%d->数据包总长度%d字节\n",s->dport,s->sport,s->length);}}printf("TCP显示完--------------------------------------------------------------------------------------\n") ;}////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////void dispatcher_handler(u_char *temp1,const struct pcap_pkthdr *header,const u_char*pkt_data){u_int i =0;/* Print the packet */for(i =1; i < header->caplen +1; i++){printf("%x", pkt_data[i -1]);if((i%LINE_LEN)==30) printf("\n");//每30位一组换行一次;}printf("\n");}int compare(udpnode **p, udpnode **pd){int flag =0;if((*pd)->daddr.by1 ==(*p)->daddr.by1) flag +=1;if((*pd)->daddr.by2 ==(*p)->daddr.by2) flag +=1;if((*pd)->daddr.by3 ==(*p)->daddr.by3) flag +=1;if((*pd)->daddr.by4 ==(*p)->daddr.by4) flag +=1;if((*pd)->saddr.by1 ==(*p)->saddr.by1) flag +=1;if((*pd)->saddr.by2 ==(*p)->saddr.by2) flag +=1;if((*pd)->saddr.by3 ==(*p)->saddr.by3) flag +=1;if((*pd)->saddr.by4 ==(*p)->saddr.by4) flag +=1;if((*pd)->sport ==(*p)->sport) flag +=1;if((*pd)->dport ==(*p)->dport) flag +=1;if(flag ==10) flag =2;else flag =0;int f =0;if((*pd)->daddr.by1 ==(*p)->saddr.by1) f +=1;if((*pd)->daddr.by2 ==(*p)->saddr.by2) f +=1;if((*pd)->daddr.by3 ==(*p)->saddr.by3) f +=1;if((*pd)->daddr.by4 ==(*p)->saddr.by4) f +=1;if((*pd)->saddr.by1 ==(*p)->daddr.by1) f +=1;if((*pd)->saddr.by2 ==(*p)->daddr.by2) f +=1;if((*pd)->saddr.by3 ==(*p)->daddr.by3) f +=1;if((*pd)->saddr.by4 ==(*p)->daddr.by4) f +=1;if((*pd)->sport !=(*p)->dport) f +=1;if((*pd)->dport !=(*p)->sport) f +=1;if(f ==10) f =1;else f =0;return(flag + f);}void packet_handler(u_char *dumpfp,const struct pcap_pkthdr *header,const u_char *pkt_data) {macheader *mh;ipbaowen *ih;tcpheader *th;udpheader *uh;u_int iplen =0;u_int key =0;int flag =0;//定义源端口和目的端口;u_short sport =0;u_short dport =0;//Mac帧各个指针找到自己对应的位置;mh =(macheader*)pkt_data;//mac头ih =(ipbaowen*)(pkt_data +14);//ip头iplen =(ih->ver_ihl &0xf)*4;//ip层的长度uh =(udpheader *)((u_char*)ih + iplen);//udp指针th =(tcpheader *)((u_char*)ih + iplen);//tcp指针//边收边存哈希//printf("%d\n", ih->proto);//system("pause");if((ih->proto)==17)//udp报文2{udpnode *p;p =(udpnode*)malloc(sizeof(udpnode));p->downnum =0;p->upnum =1;int a =0, b =0;a =(ih->saddr.by1)+(ih->saddr.by2)+(ih->saddr.by3)+(ih->saddr.by4);b =(ih->daddr.by1)+(ih->daddr.by2)+(ih->daddr.by3)+(ih->daddr.by4);key = hash(a, b, uh->dport, uh->sport);//得到对应的hash值;//printf("%d\n", key);////////////////////////////////////////////////将新来的节点的数据装入结构体;p->daddr.by1 = ih->daddr.by1;p->daddr.by2 = ih->daddr.by2;p->daddr.by3 = ih->daddr.by3;p->daddr.by4 = ih->daddr.by4;p->saddr.by1 = ih->saddr.by1;p->saddr.by2 = ih->saddr.by2;p->saddr.by3 = ih->saddr.by3;p->saddr.by4 = ih->saddr.by4;p->dport = uh->dport;p->sport = uh->sport;p->length = header->caplen;//判断udphashtable表中是否有该节点;udpnode *pd;pd = udphashtable + key;do{flag = compare(&p,&pd);if(flag>0){break;}if((pd->next)== NULL){break;}else{ pd = pd->next;}}while(1);//有该节点则更新信息;if(flag>0){pd->length =(pd->length)+(p->length);if(flag ==1){ pd->downnum =(pd->downnum)+1;}if(flag ==2){ pd->upnum =(pd->upnum)+1;}}//是否插入新的节点,建立新的节点;if(flag ==0){p->next = NULL;p->pre = udphashtable[key].pre;udphashtable[key].pre->next = p;udphashtable[key].pre = p;}}if((ih->proto)==6)//tcpbaowen{tcpnode *q;q =(tcpnode*)malloc(sizeof(tcpnode));int a, b;a =(ih->saddr.by1)+(ih->saddr.by2)+(ih->saddr.by3)+(ih->saddr.by4);b =(ih->daddr.by1)+(ih->daddr.by2)+(ih->daddr.by3)+(ih->saddr.by4);key = hash(a, b, uh->dport, uh->sport);//得到对应的hash值;//将数据包的内容装到结构体中;q->daddr.by1 = ih->daddr.by1;q->daddr.by2 = ih->daddr.by2;q->daddr.by3 = ih->daddr.by3;q->daddr.by4 = ih->daddr.by4;q->saddr.by1 = ih->saddr.by1;q->saddr.by2 = ih->saddr.by2;q->saddr.by3 = ih->saddr.by3;q->saddr.by4 = ih->saddr.by4;q->dport = th->dport;q->sport = th->sport;q->length = header->len;//判断TCPhashtable里是否有该连接//有,则更新节点信息;//如果没有,则建立新的节点q->next = NULL;q->pre = tcphashtable[key].pre;tcphashtable[key].pre->next = q;tcphashtable[key].pre = q;}struct tm*ltime;char timestr[16];time_t aaa;aaa = header->_sec;ltime = localtime(&aaa);strftime(timestr,sizeof timestr,"%H:%M:%S", ltime);printf("时间:%s 长度;%d字节\n", timestr, header->caplen);//打印时间和长度//输出源和目的Mac地址(链路层)printf("目的Mac地址%x:%x:%x:%x:%x:%x\n源Mac地址%x:%x:%x:%x:%x:%x\n",mh->dest.mac1,mh->dest.mac2,mh->dest.mac3,mh->dest.mac4,mh->dest.mac5,mh->dest.mac6,mh->src.mac1,mh->src.mac2,mh->src.mac3,mh->src.mac4,mh->src.mac5,mh->src.mac6);if((mh->type)==8)printf("网际协议IPv4\n");//网络层协议类型printf("首部长度和版本号%d\n", ih->ver_ihl);//首部长度和版本号printf("服务类型%d\n", ih->tos);//服务类型printf("IP报文总长度%d字节\n", ih->tlen);// 报文总长度printf("标志%d\n", ih->ident);// 标识printf("标志和片偏移%d\n", ih->flags_fo);// 生存时间ih->flags_fo, // 标志和片偏移printf("生存时间%d\n", ih->ttl);// 生存时间if((ih->proto)==6) printf("协议类型:TCP\n");//协议类型else if((ih->proto)==17)printf("协议类型:UDP\n");//协议类型else printf("wrong\n");printf("首部校验和%d\n", ih->crc);printf("源IP地址 %d.%d.%d.%d 目的IP %d.%d.%d.%d\n",ih->saddr.by1,ih->saddr.by2,ih->saddr.by3,ih->saddr.by4,ih->daddr.by1,ih->daddr.by2,ih->daddr.by3,ih->daddr.by4);//进入传输层,判断是什么类型的协议th->th_seq = ntohs(th->th_seq);th->th_ack = ntohs(th->th_ack);th->sport = ntohs(th->sport);th->dport = ntohs(th->dport);//tcpif((ih->proto)==6){printf("源端口:%d 目的端口:%d序列号:%d确认号:%d 报头长度%: 标志%d: 窗口%d: 校验和%d: 紧急%d: ",th->sport,th->dport,th->th_seq,th->th_ack,th->th_lenand,th->th_flags,th->th_win,th->th_sum,th->th_urp);}//udpif((ih->proto)==17){printf("源端口:%d目的端口:%d用户数据包长度:%d校验和:%d",uh->sport,uh->dport,uh->uh_len,uh->uh_sum);}if((ih->proto)!=6&&(ih->proto)!=17){printf("不是IPv4协议\n");}printf("\n\n\n");pcap_dump(dumpfp, header, pkt_data);}。

相关文档
最新文档