Linux C/C++ 嗅探数据包并显示流量统计信息
嗅探数据包并显示流量统计信息是网络分析中的一种重要技术,常用于网络故障诊断、网络安全监控等方面。具体来说,嗅探器是一种可以捕获网络上传输的数据包,并将其展示给分析人员的软件工具。在嗅探器中,使用pcap库是一种常见的方法,因为它提供了一种跨平台的接口,可以有效地访问操作系统的数据包捕获功能。
数据包捕获函数库(Libpcap)
Libpcap是一种独立于系统的用户层包捕获API接口,为底层网络监测提供了一个可移植的框架。它允许程序员使用简单的C语言编程接口,来捕获和分析网络数据包。要使用libpcap来嗅探数据包并显示流量统计信息,可以按照以下步骤进行:
- 1.安装libpcap库:首先需要安装libpcap库,可以在大多数Linux发行版中使用包管理器进行安装,例如在Ubuntu中可以使用以下命令:sudo yum install libpcap-dev。
- 2.创建数据包捕获程序:使用C语言编写程序,并引入libpcap库。在程序中,需要使用libpcap的函数来打开网络接口、捕获数据包、解码数据包等。
- 3.数据包捕获:使用libpcap的pcap_open_live()函数打开网络接口(如eth0),并获取该接口的原始套接字(raw socket)。然后使用pcap_next()或pcap_next_ex()函数从原始套接字中读取数据包。
- 4.数据包解码:对捕获到的数据包进行解码,提取协议字段和数据内容。
- 5.流量统计和分析:对解码后的数据包进行流量统计和分析。例如,可以计算每个数据包的长度、接收到的数据包数量、每个协议的数据流量等。
- 6.数据包过滤:使用BPF(Berkeley Packet Filter)算法对捕获到的数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。
- 7.数据展示:将分析结果以图形化或文本形式展示给用户。
实现上述功能的需要准备的知识点包括:C语言编程、网络协议知识、libpcap库的使用、BPF算法原理等。同时,需要对底层网络监测技术有一定的了解,以便更好地理解和实现嗅探器程序的功能。
怎样使用Wireshark/tcpdump进行数据包嗅探
嗅探数据包并显示统计信息,可以使用Wireshark这个网络协议分析工具。以下是使用Wireshark进行数据包嗅探的步骤:
- 1.下载并安装Wireshark:访问Wireshark官网(https://www.wireshark.org/)下载适合你操作系统的版本,然后按照提示进行安装。
- 2.打开Wireshark:在开始菜单或应用程序列表中找到Wireshark,双击打开。
- 3.选择网络接口:在Wireshark主界面的顶部,点击“捕获”选项卡,然后选择你想要嗅探的网络接口。如果你不确定应该选择哪个接口,可以查看网络连接详细信息,找到正确的接口名称。
- 4.开始嗅探:点击“捕获选项”按钮,设置捕获过滤器(可选),然后点击“开始”按钮开始嗅探数据包。
- 5.停止嗅探:当你完成数据包嗅探后,点击“停止”按钮停止捕获。
- 6.显示统计信息:在Wireshark主界面的顶部,点击“统计”选项卡,可以看到各种统计信息,如捕获的数据包数量、各层协议的数量等(在“每秒更新”下拉菜单中,选择适当值,例如“1秒”)。
- 7.分析数据包:在“捕获”选项卡中,你可以看到实时捕获到的数据包。点击一个数据包,可以在右侧面板中查看该数据包的详细信息。你可以根据需要对数据包进行过滤、排序等操作,以便更好地分析网络流量。
使用tcpdump进行数据包嗅探的步骤如下:
- 1.打开终端窗口并启动tcpdump。
- 2.指定要嗅探的网络接口,例如:tcpdump -i eth0,其中“-i”后面跟着的是网络接口名称。
- 3.抓取数据包,例如:tcpdump -i eth0 -w data.pcap,其中“-w”后面跟着的是输出文件的名称。
- 4.分析和过滤数据包,例如:tcpdump -i eth0 host 192.168.1.101,表示只抓取目标主机为192.168.1.101的数据包。
- 5.分析数据包的内容,可以使用工具如Wireshark打开刚刚保存的pcap文件进行进一步分析。
请注意,使用tcpdump需要具有管理员权限(sudo)。
对于网络安全人员,需要关注那些点
Sniff数据包实现流量统计的原理是基于网络数据包的捕获和解析。Sniff工具通过监听网络接口上的数据传输,对每个经过的数据包进行截获、分析和解码。然后,根据协议类型、源IP、目标IP、数据包长度等属性对数据包进行分类和统计。
对于网络安全人员,需要关注以下几点:
- 1.Sniff工具的合法使用:Sniff工具主要用于网络管理、故障排查和程序调试等方面,也可以被黑客用来进行非法活动,如窃取敏感信息、进行网络攻击等。
- 2.网络隔离和安全措施:为了保护网络安全,需要对网络进行适当的隔离和安全措施。例如,使用VLAN、防火墙等设备来限制网络访问和数据流动,以防止未经授权的访问和恶意攻击。
- 3.数据包的过滤和分析:Sniff工具虽然可以对网络流量进行全面分析,但在实际应用中,可能需要对数据包进行过滤和筛选,以便更准确地掌握网络流量情况。例如,可以针对特定的协议、IP地址、端口等进行过滤,以排除无关数据包的干扰。
- 4.警惕ARP欺骗攻击:ARP欺骗是一种常见的网络攻击手段,黑客通过伪造IP地址和MAC地址映射关系,可以截获网络数据包并进行恶意篡改。在使用Sniff工具时,需要防范ARP欺骗攻击,例如通过设置静态ARP映射表、使用ARP欺骗防御软件等措施来保护网络安全。
Linux C/C++ 嗅探数据包并显示流量统计信息
要实现嗅探数据包并根据网卡流量输出 TCP/UDP 流量信息,你可以参考以下步骤进行实现:安装并导入必要的库:首先,你需要安装一些库,如 libpcap(用于捕获和解析数据包)和 sys(用于获取系统时间)。
打开网络接口并捕获数据包:使用 libpcap 库打开网络接口(如 eth0),并设置过滤器(例如,仅捕获 TCP 和 UDP 数据包):
...
/* IP header */
struct sniff_ip {u_char ip_vhl; /* version << 4 | header length >> 2 */u_char ip_tos; /* type of service */u_short ip_len; /* total length */u_short ip_id; /* identification */u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */u_char ip_ttl; /* time to live */u_char ip_p; /* protocol */u_short ip_sum; /* checksum */struct in_addr ip_src,ip_dst; /* source and dest address */
};
#define IP_HL(ip) (((ip)->ip_vhl) & 0x0f)
#define IP_V(ip) (((ip)->ip_vhl) >> 4)/* 剩下的TCP和UDP标头结构仅用于学习目的,因为计算ip报头中的总分组长度 *//* TCP header */
typedef u_int tcp_seq;struct sniff_tcp {u_short th_sport; /* source port */u_short th_dport; /* destination port */tcp_seq th_seq; /* sequence number */tcp_seq th_ack; /* acknowledgement number */u_char th_offx2; /* data offset, rsvd */
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)u_short th_win; /* window */u_short th_sum; /* checksum */u_short th_urp; /* urgent pointer */
};struct sniff_udp {u_short uh_sport; /* source port */u_short uh_dport; /* destination port */u_short uh_ulen; /* datagram length */u_short uh_sum; /* datagram checksum */
};
...
int main(int argc, char **argv)
{
...while((argch = getopt(argc, argv, "Bkmgdi:t:")) != -1) {switch(argch) {case 'B':batch_mode = 1;break;case 'k':strncpy(show_suffix, "kByte/s", 32);traffic_unit = 1;break;case 'm':strncpy(show_suffix, "MByte/s", 32);traffic_unit = 2;break;case 'g':strncpy(show_suffix, "GByte/s", 32);traffic_unit = 3;break;case 't':sniff_timeout = atoi(optarg);break;case 'i':strncpy(ifname, optarg, IFNAMSIZ);break;case 'd':dflag = 1;break;default:fprintf(stderr, "Incorrect argument provided\n");usage();exit(1);}}/* 如果缺少位置筛选器参数,请退出。 */if(argc - optind < 1) {usage();exit(1);}/* 最后一个参数现在应该是筛选器字符串 */filter = argv[optind];/* 确定设备ifname的IPv4网络和网络掩码. */if(pcap_lookupnet(ifname, &netp, &netmask, errbuf) == -1) {fprintf(stderr, "pcap_lookupnet: %s\n", errbuf);exit(1);}if((capture = pcap_open_live(ifname, 65535, 1, 10, errbuf)) == NULL) {fprintf(stderr, "pcap_open_live: %s\n", errbuf);exit(1);}if(pcap_compile(capture, &comp_filter, filter, 0, netmask) != 0) {fprintf(stderr, "pcap_compile: %s\n", pcap_geterr(capture));exit(1);}if(pcap_setfilter(capture, &comp_filter) == -1) {fprintf(stderr, "pcap_setfilter: %s\n", pcap_geterr(capture));exit(1);}/* 清理回调 */if(atexit(exit_callback) != 0) {perror("atexit: ");exit(1);}/* 发出数据包捕获结束的信号. */if(signal(SIGALRM, output_data) == SIG_ERR) {perror("signal: failed to capture SIGALRM");exit(1);}/* 捕获中断信号以实现整洁的清理. */if(signal(SIGINT, cleanup_capture) == SIG_ERR) {perror("signal: failed to capture SIGINT");exit(1);}/* 获取NIC硬件地址以稍后确定数据包流. */if((mac_address = get_hw_address(ifname, dflag)) == NULL) {fprintf(stderr, "get_hw_address: failed to get hw address from %s\n", ifname);exit(1);}nic_dlt = pcap_datalink(capture);/* 选择一个物理层段大小 */switch(nic_dlt) {case DLT_EN10MB: /* Ethernet */phys_size = 14;break;case DLT_IEEE802: /* WiFi */phys_size = 22;break;case DLT_FDDI: /* Fiber interface */phys_size = 21;break;case DLT_LOOP: /* OpenBSD loop device or RAW device */phys_size = 12;break;case DLT_NULL:phys_size = 4;default:phys_size = 0;break;}if(dflag)fprintf(stderr, "phys_size: %d, nic_dlt: %d\n", phys_size, nic_dlt);/* 清除计时器结构并设置sniff_timeout秒的超时. */
.../* 这将导致发送SIGALARM以输出当前流量统计信息。. */if(setitimer(ITIMER_REAL, itvp, &oitv) < 0) {fprintf(stderr, "setitimer: failed setting timer\n");exit(1);}if(batch_mode == 0)output_header(ifname);/* 将捕获缓冲区中数据包的主pcap循环. */loop_status = pcap_loop(capture, -1, capture_callback, NULL);
...
}...
void fprint_data(double in, double out)
{switch(traffic_unit) {case 1:in /= 1000;out /= 1000;break;case 2:in /= 1000000;out /= 1000000;break;case 3:in /= 1000000000;out /= 1000000000;break;default:in /= 1;out /= 1;break;}...
}
...
unsigned short get_windowsize(void) {struct winsize ws;if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0) {return(-1);}return(ws.ws_row);
}
...
uint8_t * get_hw_address(char *ifname, int dflag)
{
...ifap = ifa;if(sd < 0) {freeifaddrs(ifap);return(NULL);}for(;ifa;ifa = ifa->ifa_next) {if(ifa->ifa_data != 0) {continue;}/* 查找是否与ifname匹配 */if(strncmp(ifname, ifa->ifa_name, sizeof(*ifname)) == 0) {strncpy(req.ifr_name, ifa->ifa_name, IFNAMSIZ);if(ioctl(sd, SIOCGIFHWADDR, &req ) != -1 ) {if((mac = malloc(sizeof(uint8_t)*MAX_ETHER_LEN)) == NULL) {perror("malloc: ");return(NULL);}memcpy(mac, (uint8_t*)req.ifr_ifru.ifru_hwaddr.sa_data, MAX_ETHER_LEN);break;}}}freeifaddrs(ifap);return mac;
}
If you need the complete source code, please add the WeChat number (c17865354792)
运行结果:


根据字节数和时间计算 TCP 和 UDP 的流量(以字节/秒为单位),将 TCP 和 UDP 的流量信息按照指定的格式(如 k/s、m/s 等)输出到控制台。
总结
嗅探数据包是一种网络抓包技术,可以捕获网络上传输的数据包并进行分析。通过统计流量,可以了解网络的使用情况、发现异常行为和攻击等。
Welcome to follow WeChat official account【程序猿编码】
相关文章:
Linux C/C++ 嗅探数据包并显示流量统计信息
嗅探数据包并显示流量统计信息是网络分析中的一种重要技术,常用于网络故障诊断、网络安全监控等方面。具体来说,嗅探器是一种可以捕获网络上传输的数据包,并将其展示给分析人员的软件工具。在嗅探器中,使用pcap库是一种常见的方法…...
Vitis导入自制IP导致无法构建Platform
怎么还有这种问题( 解决Vitis导入自制IP导致无法构建Platform – TaterLi 个人博客 Vitis报错:fatal error: xxx.h: No such file or directory._ly2lj的博客-CSDN博客 在指定位置黏入以上代码即可: INCLUDEFILES$(wildcard *.h) LIBSOUR…...
SQLAlchemy 使用封装实例
类封装 database.py #! /usr/bin/env python # -*- coding: utf-8 -*-import sys import json import logging from datetime import datetimefrom core.utils import classlock, parse_bool from core.config import (MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASS,MYSQL_DA…...
Android Framework通信:Binder
文章目录 前言一、Linux传统跨进程通信原理二、Android Binder跨进程通信原理1、动态内核可加载模块2、内存映射3、Binder IPC 实现原理 三、Android Binder IPC 通信模型1、Client/Server/ServiceManager/驱动Binder与路由器之间的角色关系 2、Binder通信过程3、Binder通信中的…...
如何用精准测试来搞垮团队?
测试行业每年会冒出来一些新鲜词:混沌工程、精准测试、AI测试…… 这些新概念、新技术让我们感到很焦虑,逼着自己去学习和了解这些新玩意,担心哪一天被淘汰掉。 以至于给我这样的错觉,当「回归测试」、「精准测试」这两个词摆在一…...
暴力递归转动态规划(十)
题目 给定一个二维数组matrix[][],一个人必须从左上角出发,最终到达右下角,沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和。返回最小距离累加和。 这道题中会采用压缩数组的算法来进行优化 暴力递归 暴力递归方法的整…...
深度学习-房价预测案例
1. 实现几个函数方便下载数据 import hashlib import os import tarfile import zipfile import requests#save DATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)): #save"""下载…...
【26】c++设计模式——>命令模式
c命令模式 C的命令模式是一种行为模式,通过将请求封装成对象,以实现请求发送者和接受者的解耦。 在命令模式中,命令被封装成一个包含特定操作的对象,这个对象包含的执行该操作的方法,以及一些必要的参数。命令对象可以…...
ElasticSearch容器化从0到1实践(一)
背景 通过kubernetes集群聚合多个Elasticsearch集群碎片资源,提高运维效率。 介绍 Kubernetes Operator 是一种特定的应用控制器,通过 CRD(Custom Resource Definitions,自定义资源定义)扩展 Kubernetes API 的功能…...
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:Vue项目中有封装过axios…...
旅游票务商城小程序的作用是什么
随着环境放开,旅游行业恢复了以往的规模,本地游、外地游成为众多用户选择,而在旅游时,不少人会报名旅行团前往各风景热点游玩,对旅游票务经营者而言,市场高需求的同时也面临一些难题。 对旅游票务经营商家…...
LabVIEW在安装了其它的NI软件之后崩溃了
LabVIEW在安装了其它的NI软件之后崩溃了 在安装了其它的NI软件之后,一些原本安装好的或者新安装的软件由于缺少必要的DLL而崩溃掉了。例如,在这种情况下,Teststand可能会报下面的错误: RetrievingCOM class factory for compone…...
基于Java的个人健康管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
nginx https的配置方法
文章目录 安装证书工具安装根证书生成域名证书配置转发 ssl的请求到http请求 安装证书工具 curl ‘http://pan.itshine.cn:5080/?explorer/share/fileOut&shareID64h6PiQQ&path%7BshareItemLink%3A64h6PiQQ%7D%2F%E5%B7%A5%E5%85%B7%2Fmkcert’ > ‘./mkcert’ c…...
使用WebDriver采样器将JMeter与Selenium集成
目录 第一步:在JMeter中添加Selenium / WebDriver插件 第二步:创建一条测试计划--添加线程组 第三步:下载 chromedriver.exe 第四步:在Web Driver 采样器中添加测试脚本 第五步:运行并且验证 注意: 第…...
flink教程
文章目录 来自于尚硅谷教程1. Flink概述1.1 特点1.2 与SparkStreaming对比 2. Flink部署2.1 集群角色2.2 部署模式2.3 Standalone运行模式2.3.1 本地会话模式部署2.3.2 应用模式 2.4 YARN运行模式2.4.1 会话模式部署2.4.2 应用模式部署 2.5 历史服务 3. 系统架构3.1 并行度3.2 …...
视频监控系统/安防视频平台EasyCVR广场视频细节优化
安防视频监控系统/视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频汇聚平台EasyCVR拓展性强,视频能力丰富,可实现视频监控直播、视频轮播、…...
电脑上播放4K视频需要具备哪些条件?
在电视上播放 4K( 4096 2160 像素)视频是很简单的,但在电脑设备上播放 4K 视频并不容易。相反,它们有自己必须满足的硬件要求。 如果不满足要求,在电脑上打开 4K 分辨率文件或大型视频文件会导致卡顿、音频滞后以及更…...
测试除了点点点,还有哪些内容呢?
今天和一个网友讨论了一下关于互联网行业中测试的情况,希望能够了解现在的互联网行业主要的测试工作内容。小编根据以往的工作经历和经验情况,来做一个总结和整理。 1、岗位分类 现在的岗位划分主要是分为两大类:测试工程师 和 测试开发工程…...
HTTP的本质理解
HTTP是超文本传输协议,从协议、传输和超文本三个关键词进行进行分解。 协议关键词讲解 1.协议的第一个词是协,这个就表明需要至少两方参与到其中。 2.协议的第二个词是议,表明HTTP是规范和约定,需要大家共同遵守,也包…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
