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【程序猿编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorFlow2 之014】在 TF 2.0 中实现 LeNet-5

一、说明 在这篇文章中&#xff0c;我们将展示如何在 TensorFlow 中实现像 \(LeNet-5\) 这样的基础卷积神经网络。LeNet-5 架构由 Yann LeCun 于 1998 年发明&#xff0c;是第一个卷积神经网络。 数据黑客变种rs 深度学习 机器学习 TensorFlow 2020 年 2 月 29 日 | 0 …

AUTOSAR组织发布20周年纪念册,东软睿驰NeuSAR列入成功案例

近日&#xff0c;AUTOSAR组织在成立20周年之际发布20周年官方纪念册&#xff08;20th Anniversary Brochure&#xff09;&#xff0c;记录了AUTOSAR组织从成立到今天的故事、汽车行业当前和未来的发展以及AUTOSAR 伙伴关系和合作在重塑汽车方面的作用。东软睿驰提报的基于AUTOS…

行情分析——加密货币市场大盘走势(10.16)

目前大饼再次止稳&#xff0c;并开始向上攀升&#xff0c;目前MACD来看也是进入了多头趋势。重新调整了蓝色上涨趋势线&#xff0c;目前来看这次的低点并没有跌破上一个低点&#xff0c;可以认为是上涨的中继。注意白天的下跌回调。 以太目前也是走了四连阳线&#xff0c;而MAC…

关于Skywalking Agent customize-enhance-trace对应用复杂参数类型取值

对于Skywalking Agent customize-enhance-trace 大家应该不陌生了&#xff0c;主要支持以非入侵的方式按用户自定义的Span跟踪对应的应用方法&#xff0c;并获取数据。 参考https://skywalking.apache.org/docs/skywalking-java/v9.0.0/en/setup/service-agent/java-agent/cust…

STM32 ---- 再次学习STM32F103C8T6/STM32F409IGT6

目录 一、环境搭建及介绍 关于STM32基础介绍 新建工程 外设案例 LED流水灯 蜂鸣器 上拉电阻和下拉电阻知识 电压比较器 c语言基础知识 类型、结构体、枚举 类型int8_t int16_t int32_t 宏替换 #define 和typedef用法 结构体两种填充方法 和 命名规则 枚举用法 常用…

uniapp中全局页面挂载组件(H5)

前言 我们已经学习了 uniapp中全局页面挂载组件&#xff08;小程序&#xff09; 有些小伙伴问在H5怎么做那让我们试一试 直接上代码 //引用组件 import dialog from ./index.vue; //我这里要把小程序的方法和h5方法写一起所以用了混入 import mixins from ./mixins.js //使用…

ElementUI编辑表格单元格与查看模式切换的应用

需求&#xff1a;有时候在填写表单的时候&#xff0c;想要在输入的时候是input输入框的状态&#xff0c;但是当鼠标移出输入框失去焦点时&#xff0c;希望是查看的状态&#xff0c;这种场景可以通过 v-if实现 vue2ElementUi里面使用如下&#xff1a; 1.el-table标签注册 cell-…

GitLab(1)——GitLab安装

目录 一、使用设备 二、使用rpm包安装 Gitlab国内清华源下载地址&#xff1a; ①下载命令如下&#xff1a; ②安装命令如下&#xff1a; ③删除rpm包 ④配置 ⑤重载 ⑥重启 ⑦配置自启动 ⑧打开8989端口并重启防火墙 三、GitLab登录 ①访问GitLab的URL ②输入用户…

如何实现 Es 全文检索、高亮文本略缩处理(封装工具接口极致解耦)

如何实现 Es 全文检索、高亮文本略缩处理 前言技术选型JAVA 常用语法说明全文检索开发高亮开发Es Map 转对象使用核心代码 Trans 接口&#xff08;支持父类属性的复杂映射&#xff09;Trans 接口可优化的点高亮全局配置类如下真实项目落地效果为什么不用 numOfFragments、fragm…

203、RabbitMQ 之 使用 direct 类型的 Exchange 实现 消息路由 (RoutingKey)

目录 ★ 使用direct实现消息路由代码演示这个情况二ConstantUtil 常量工具类ConnectionUtil 连接RabbitMQ的工具类Publisher 消息生产者测试消息生产者 Consumer01 消息消费者01测试消费者结果&#xff1a; Consumer02 消息消费者02测试消费者结果&#xff1a; 完整代码&#x…

微信小程序框架---详细教程

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 目录 1.框架 1.1响应的数据绑定 1.2.页面管理 1.3.基础组件 1.4.丰富的 API 2.视图层 View 2.1.介绍 …

Jmeter脚本参数化和正则匹配

我们在做接口测试过程中&#xff0c;往往会遇到以下几种情况 每次发送请求&#xff0c;都需要更改参数值为未使用的参数值&#xff0c;比如手机号注册、动态时间等 上一个接口的请求体参数用于下一个接口的请求体参数 上一个接口的响应体参数用于下一个接口的请求体参数&#…

【09】基础知识:React组件的生命周期

组件从创建到死亡它会经历一些特定的阶段。 React 组件中包含一系列勾子函数&#xff08;生命周期回调函数 <> 生命周期钩子函数 <> 生命周期函数 <> 生命周期钩子&#xff09;&#xff0c;会在特定的时刻调用。 我们在定义组件时&#xff0c;会在特定的生…

一文理解登录鉴权(Cookie、Session、Jwt、CAS、SSO)

1 前言 登录鉴权是任何一个网站都无法绕开的部分&#xff0c;当系统要正式上线前都会要求接入统一登陆系统&#xff0c;一方面能够让网站只允许合法的用户访问&#xff0c;另一方面&#xff0c;当用户在网站上进行操作时也需要识别操作的用户&#xff0c;用作后期的操作审计。…

灾害与环境遥感团队本科生在IEEE TGRS 发表高水平论文

2023年9月27日&#xff0c;地球科学和遥感领域顶级期刊《IEEE Transactions on Geoscience and Remote Sensing》&#xff08;IEEE TGRS&#xff09;在线预刊发了灾害与环境遥感团队的最新研究成果“A novel spectral index for rapid dust-proof net mapping based on Sentine…

想做WMS仓库管理系统,找了好久才找到云表

公司内部仓库管理原方式均基于人工电子表格管理方式来实现收发存管理&#xff0c;没有流程化管理&#xff0c;无法保证数据的准确性和及时性&#xff0c;同时现场操作和数据核对会出现不同步的情况&#xff0c;无法提高仓库的运作效率&#xff0c;因此&#xff0c;我们基于云表…

【设计模式】单例模式、“多例模式”的实现以及对单例的一些思考

文章目录 1.概述2.单例模式实现代码2.1.饿汉式单例2.2.懒汉式单例2.3.双检锁单例2.4.静态内部类单例2.5.枚举单例 3.对单例的一些思考3.1.是否需要严格的禁止单例被破坏&#xff1f;3.2.懒汉式真的比饿汉式更佳吗&#xff1f;3.3.单例存在的问题 4.其他作用范围的单例模式4.1.线…

关闭VS Code中的鼠标悬停时的提示框(MDN Reference)

在使用VS Code编辑器写html文件时&#xff0c;鼠标悬停在写的某些内容时会弹出一个提示框&#xff0c;如下图&#xff1a; 这个提示是比较烦人的&#xff0c;接下来分享关闭它的教程&#xff1a; 这里是以Win10版的Visual Studio Code为例 1.打开VS Code 的设置界面 2.在扩展…

《开箱元宇宙》:《福布斯》如何通过 Web3 改进讲故事的方式

你们是否想知道 The Sandbox 如何融入世界上最具标志性的品牌和名人的战略&#xff1f;在本期《开箱元宇宙》系列中&#xff0c;我们与《福布斯》一起探讨了他们为何决定在 The Sandbox 中尝试 Web3&#xff0c;以及他们如何改变讲故事的方式&#xff0c;以便在一次体验中吸引超…

字节跳动2023测试开发岗 3+1 面经+经验分享(收到offer,入职月薪27K)

现在&#xff0c;招聘黄金时间已经来临&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后在十月初拿到了字节跳动测试岗的 offer&…