Linux C/C++ 实现网络流量分析(性能工具)

网络流量分析的原理基于对数据包的捕获、解析和统计分析,通过对网络流量的细致观察和分析,帮助管理员了解和优化网络的性能、提高网络安全性,并快速排查和解决网络故障和问题。

Linux中的网络流量常见类型
在Linux中,网络流量可以分为几种不同的类型。以下是一些常见的网络流量类型:

  1. TCP流量:TCP(传输控制协议)是一种可靠的、面向连接的协议。TCP流量通常用于传输可靠的数据,例如网页浏览、文件传输等。

  2. UDP流量:UDP(用户数据报协议)是一种无连接的协议,不保证数据的可靠性和顺序。UDP流量通常用于实时应用,如VoIP(网络电话)、视频流传输等。

  3. ICMP流量:ICMP(Internet控制消息协议)用于传输网络控制消息和错误报告。ICMP流量通常用于网络故障排查、Ping命令等。

  4. HTTP流量:HTTP(超文本传输协议)是一种应用层协议,用于在Web浏览器和服务器之间传输数据。HTTP流量通常用于网页浏览、下载文件等Web应用。

  5. HTTPS流量:HTTPS是HTTP的安全版本,使用SSL(安全套接字层)或TLS(传输层安全)协议加密通信。HTTPS流量通常用于安全的Web传输,例如在线银行、电子商务等。

  6. DNS流量:DNS(域名系统)用于将域名与IP地址相互映射。DNS流量通常用于解析域名、获取IP地址等。

  7. FTP流量:FTP(文件传输协议)用于在客户端和服务器之间传输文件。FTP流量通常用于文件上传、下载等。

  8. SSH流量:SSH(安全壳层)是一种加密的网络协议,用于安全和远程登录。SSH流量通常用于安全的远程管理和文件传输。

这些网络流量类型在不同的应用场景和协议中扮演着不同的角色。分析和监控不同类型的网络流量可以帮助管理员了解网络使用情况、排查故障并优化网络性能。

Linux下监控网络流量的目的
Linux下监控网络流量的目的有多个:

  1. 网络性能优化:监控网络流量可以帮助管理员了解网络的使用情况和瓶颈,以便进行性能优化和提高网络效率。

  2. 安全性增强:通过监控网络流量,可以及时发现异常的网络流量,如DDoS攻击、恶意软件传播等,以便及时采取相应的防御措施。

  3. 资源管理:监控网络流量可以帮助管理员了解各个主机或设备的网络使用情况,对网络资源进行分配和管理,以避免某个用户或设备占用过多的带宽和资源导致其他用户或设备受到影响。

  4. 计费和成本控制:监控网络流量可以帮助提供网络服务的机构或企业对用户的网络使用情况进行计费和成本控制,确保网络资源的合理利用和节约成本。

  5. 故障排查和问题定位:通过监控网络流量,可以及时发现网络故障、问题和异常,辅助管理员进行故障排除和问题定位,以减少网络停机时间和降低维护成本。

总而言之,监控网络流量可以提高网络性能、保障网络安全、管理网络资源、控制成本和故障排查,对于维护良好的网络运行非常重要。

有哪些专门的工具和技术分析网络流量

要实现Linux上的网络流量分析,可以使用一些专门的工具和技术。下面是一些常用的方法和原理:

  1. 使用抓包工具:在Linux上,可以使用像tcpdump、Wireshark这样的抓包工具来捕获网络数据包。这些工具可以监听网络接口,并将捕获到的数据包保存到文件中进行分析。

  2. 使用流量监控工具:像ntop、iftop、bmon等工具可以实时监控网络接口的流量情况,并提供统计信息和图形化展示。

  3. 分析捕获的数据包:捕获到的数据包可以使用Wireshark等工具进行解析和分析。Wireshark可以显示捕获的数据包的详细信息,如源IP地址、目的IP地址、协议类型、端口等,并提供过滤机制来筛选感兴趣的数据。

  4. 使用流量分析工具:除了抓包工具和流量监控工具,还有一些专门用于网络流量分析的工具,如tcpflow、Bro等。这些工具可以解析并分析网络流量中的各种协议,提供更深入的网络流量分析功能。

这些工具的实现原理都涉及到网络协议、socket编程、数据包的捕获和解析等知识。具体来说,抓包工具通过监听网络接口,将接收到的数据包保存到文件中;流量监控工具通过读取接口的流量数据并进行统计和展示;数据包分析工具和流量分析工具则依靠网络协议和数据包的解析来提供更深入的分析功能。

总体来说,实现网络流量分析需要一定的网络知识和编程技巧,同时需要使用相关工具和技术进行数据的捕获、解析和分析。

在Linux文件系统的/proc目录下分析网络流量

在Linux文件系统的/proc目录下,可以找到一些与网络流量相关的信息。以下是一些常见的文件和目录:

  1. /proc/net/dev:这个文件提供了网络设备的收发网络流量统计信息,包括每个网络接口的接收和发送数据包数量、错误统计、丢弃的数据包数量等。
    使用cat或者less命令:你可以使用cat或者less命令来查看/proc下的文件内容,例如:cat /proc/net/dev可以查看网络设备的收发网络流量统计信息。
    使用awk或者sed命令进一步处理:你可以使用awk或者sed命令来处理和过滤数据,例如:cat /proc/net/dev | awk '{print $1, $2}'可以只打印出网络设备名称和接收流量的统计值.
    在这里插入图片描述

  2. /proc/net/tcp:这个文件提供了当前TCP连接的详细信息,包括本地和远程IP地址、端口号,连接状态,以及一些统计信息。
    使用grep命令筛选:你可以使用grep命令来筛选你感兴趣的信息,例如:grep "ESTABLISHED" /proc/net/tcp可以查看当前所有TCP连接中状态为ESTABLISHED的连接信息。

  3. /proc/net/udp:类似于/proc/net/tcp文件,提供了当前UDP连接的详细信息。

  4. /proc/net/raw:提供了当前原始套接字(RAW socket)的相关信息,包括本地和远程IP地址、协议类型等。

  5. /proc/net/snmp:提供了简单网络管理协议(SNMP)相关的统计信息,包括接口、IP、TCP、UDP等各层的统计信息。

  6. /proc/net/ip_conntrack:如果系统启用了连接跟踪(conntrack)功能,这个文件提供了关于当前连接的跟踪信息,包括连接状态、源IP地址、目的IP地址、端口号等。

这些文件提供了一些基本的网络流量统计和连接信息,可以通过读取这些文件进行分析和监控。想要更加深入和详细地分析网络流量,则需要使用更专业的网络流量分析工具。

Linux C/C++ 网络流量分析

代码中网络流量分析是一个用于网络统计的命令行工具,用于监视系统网络接口的流量、带宽使用情况以及与网络相关的统计数据。它可以提供网络传输的各种统计信息,包括数据包的数量、字节数、错误、丢包等。

/** 接口统计信息*/
typedef struct nic_stats {struct timeval tv;		/* tv_sec, tv_usec */uint64_t rbytes;		/* total read bytes */uint64_t wbytes;		/* total written bytes */uint64_t rpackets;		/* total read packets */uint64_t wpackets;		/* total written packets */uint64_t ierr;			/* total input errors */uint64_t oerr;			/* total output errors */uint64_t coll;			/* total collisions */uint64_t nocp;			/* total nocanput */uint64_t defer;			/* total defers */uint64_t sat;			/* saturation value */
} nicstats_t;/** print_header - 打印标题行*/
static void
print_header(void)
{if (g_style)(void) printf("%8s %5s %14s %14s\n","Time", "Int", "rKb/s", "wKb/s");else(void) printf("%8s %5s %7s %7s %7s %7s %7s %7s %7s %7s\n","Time", "Int", "rKb/s", "wKb/s", "rPk/s","wPk/s", "rAvs", "wAvs", "%Util", "Sat");
}static int split_ifname(char *if_name, char *drv, uint32_t *instance)
{
...n = 0;for (p = if_name; *p; p++)n++;if (n <= 1)return (B_FALSE);m = n;for (p--; isdigit(*p); p--)n--;if (m == n || n == 0)return (B_FALSE);(void) strncpy(drv, if_name, n);drv[n] = '\0';*instance = (uint32_t)atol(++p);
...
}
...
static void update_ksp_by_type(kstat_t **kspp, uint32_t types, char *name)
{
...if (types & KS_LINK) {*kspp = fetch_ksp("link", 0, name);return;}(void) split_ifname(name, drv, &instance);if (types & KS_DRV_MAC) {*kspp = fetch_ksp(drv, instance, "mac");return;}if (types & KS_DIN) {*kspp = fetch_ksp(drv, instance, name);return;}if (types & KS_DRV) {*kspp = fetch_ksp(drv, instance, NULL);return;}if (types & KS_NAME) {*kspp = fetch_ksp(name, -1, NULL);return;}...
}
static void update_stats(void)
{
...(void) gettimeofday(&now_tv, NULL);if (g_tcp) {/* 更新TCP统计信息 */if (g_new_kstat_chain) {g_tcp_ksp = kstat_lookup(g_kc, "tcp", -1, "tcp");if (! g_tcp_ksp)die(1, "kstat_lookup");}if (kstat_read(g_kc, g_tcp_ksp, NULL) < 0)die(1, "kstat_read");g_tcp_new->tv.tv_sec = now_tv.tv_sec;g_tcp_new->tv.tv_usec = now_tv.tv_usec;TCP_UPDATE(inDataInorderSegs, "inDataInorderSegs");TCP_UPDATE(outDataSegs, "outDataSegs");TCP_UPDATE(inDataInorderBytes, "inDataInorderBytes");TCP_UPDATE(inDataUnorderSegs, "inDataUnorderSegs");TCP_UPDATE(inDataUnorderBytes, "inDataUnorderBytes");TCP_UPDATE(outDataBytes, "outDataBytes");TCP_UPDATE(estabResets, "estabResets");TCP_UPDATE(outRsts, "outRsts");TCP_UPDATE(attemptFails, "attemptFails");TCP_UPDATE(retransBytes, "retransBytes");TCP_UPDATE(passiveOpens, "passiveOpens");TCP_UPDATE(activeOpens, "activeOpens");TCP_UPDATE(halfOpenDrop, "halfOpenDrop");TCP_UPDATE(listenDrop, "listenDrop");TCP_UPDATE(listenDropQ0, "listenDropQ0");}if (g_udp) {/* 更新UDP统计信息 */if (g_new_kstat_chain) {g_udp_ksp = kstat_lookup(g_kc, "udp", -1, "udp");if (! g_udp_ksp)die(1, "kstat_lookup");}if (kstat_read(g_kc, g_udp_ksp, NULL) < 0)die(1, "kstat_read");g_udp_new->tv.tv_sec = now_tv.tv_sec;g_udp_new->tv.tv_usec = now_tv.tv_usec;UDP_UPDATE(inDatagrams, "inDatagrams");UDP_UPDATE(outDatagrams, "outDatagrams");UDP_UPDATE(inErrors, "inErrors");UDP_UPDATE(outErrors, "outErrors");}if (g_style == STYLE_NONE && ! g_list)return;/* 更新接口统计信息 */for (nicp = g_nicdatap; nicp; nicp = nicp->next) {if (! (nicp->flags & NIC_UP))/* 链接未打开 */continue;if (g_nonlocal && (nicp->flags & NIC_LOOPBACK))continue;if (! (nicp->flags & NIC_OK_UPDATED))if (kstat_read(g_kc, nicp->op_ksp, NULL) < 0)die(1, "kstat_read");/* 保存网络值 */nicp->new.tv.tv_sec = now_tv.tv_sec;nicp->new.tv.tv_usec = now_tv.tv_usec;nicp->new.rbytes =fetch6432(nicp->op_ksp, "rbytes64", "rbytes", 0);nicp->new.wbytes =fetch6432(nicp->op_ksp, "obytes64", "obytes", 0);nicp->new.rpackets =fetch6432(nicp->op_ksp, "ipackets64", "ipackets", 0);nicp->new.wpackets =fetch6432(nicp->op_ksp, "opackets64", "opackets", 0);switch (g_style) {case STYLE_EXTENDED_PARSEABLE:case STYLE_EXTENDED:nicp->new.ierr = fetch32(nicp->op_ksp, "ierrors", 0);nicp->new.oerr = fetch32(nicp->op_ksp, "oerrors", 0);/*FALLTHROUGH*/case STYLE_FULL:case STYLE_SUMMARY:nicp->new.coll = fetch32(nicp->op_ksp, "collisions",0);nicp->new.nocp = fetch_nocanput(nicp->op_ksp, 0);nicp->new.defer = fetch32(nicp->op_ksp, "defer_xmts",0);nicp->new.sat = nicp->new.defer + nicp->new.nocp +nicp->new.coll;nicp->new.sat += fetch32(nicp->op_ksp, "noxmtbuf", 0);break;}nicp->speed = fetch64(nicp->op_ksp, "ifspeed", 0);nicp->duplex = fetch32(nicp->op_ksp, "link_duplex", 0);}
...
}
static void load_snmp(FILE *snmp)
{
.../* 从/proc/net/snmp加载TCP和/或UDP统计信息 */
...while (remaining) {p = fgets(buf, sizeof (buf), snmp);if (! p)break;if (g_tcp && strncmp("Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ""ActiveOpens PassiveOpens AttemptFails ""EstabResets CurrEstab InSegs OutSegs ""RetransSegs InErrs OutRsts", p, 141) == 0) {int n;n = fscanf(snmp, "Tcp: %lld %lld %lld %lld ""%lld %lld %lld %lld %lld %lld ""%lld %lld %lld %lld\n",&ll[0], &ll[1], &ll[2], &ll[3],&ll[4], &ll[5], &ll[6], &ll[7],&ll[8], &ll[9], &ll[10], &ll[11],&ll[12], &ll[13]);if (n == 14) {g_tcp_new->inDataInorderSegs = ll[9];g_tcp_new->outDataSegs = ll[10];g_tcp_new->estabResets = ll[7];g_tcp_new->outRsts = ll[13];g_tcp_new->attemptFails = ll[6];/* Note: bytes */g_tcp_new->retransBytes = ll[11];g_tcp_new->passiveOpens = ll[5];g_tcp_new->activeOpens = ll[4];}remaining--;} else if (g_udp && strncmp("Udp: InDatagrams NoPorts ""InErrors OutDatagrams RcvbufErrors ""SndbufErrors\n", p, 72) == 0) {int n;n = fscanf(snmp, "Udp: %lld %lld %lld %lld ""%lld %lld\n",&ll[0], &ll[1], &ll[2], &ll[3],&ll[4], &ll[5]);if (n == 6) {g_udp_new->inDatagrams = ll[0];g_udp_new->outDatagrams = ll[3];g_udp_new->inErrors = ll[2]; /* + ll[4]? */g_udp_new->outErrors = ll[5];}remaining--;}}
}
...
static void update_timestr(time_t *tptr)
{
...if (tptr)t = *tptr;elset = time(NULL);tm = localtime(&t);(void) strftime(g_timestr, sizeof (g_timestr), "%H:%M:%S", tm);
}static void sleep_for(hrtime_t period, hrtime_t start_n)
{
...do {pause_tv.tv_sec = pause_n / NANOSEC;pause_tv.tv_nsec = pause_n % NANOSEC;status = nanosleep(&pause_tv, (struct timespec *)NULL);if (status < 0)if (errno == EINTR){now_n = gethrtime();pause_n = start_n + period - now_n;if (pause_n < 100)return;}else {...}} while (status != 0);
}
...

If you need the complete source code, please add the WeChat number (c17865354792)

运行结果:


Time列:表示当前采样的响应时间.
Int: 网卡名称.
rKB/s : 每秒接收到千字节数.
wKB/s : 每秒写的千字节数.
rPk/s : 每秒接收到的数据包数目.
wPk/s : 每秒写的数据包数目.
rAvs : 接收到的数据包平均大小.
wAvs : 传输的数据包平均大小.
%Util : 网卡利用率(百分比).
Sat : 网卡每秒的错误数.网卡是否接近饱满的一个指标.尝试去诊断网络问题的时候,推荐使用-x选项去查看更多的统计信息.

这将显示ens33接口的流量、带宽使用情况以及其他统计数据:
监控所有网络接口的统计信息,同时显示TCP和UDP连接相关的统计信息:

总结

网络流量分析需要一定的技术知识和经验,但通过学习和实践,我们可以掌握这个技能,更好地管理和维护网络环境。

Welcome to follow WeChat official account【程序猿编码

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

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

相关文章

校园物业报修小程序开发笔记一

背景 校园规模和复杂性&#xff1a; 大型学校和校园通常拥有众多的建筑物、设施和设备&#xff0c;需要有效的维护和报修系统&#xff0c;以满足学生、教职员工和校园管理人员的需求。 学生和员工需求&#xff1a; 学生和员工在校园内可能遇到各种维修问题&#xff0c;如故障的…

ESP8266,手机与电脑之间的TCP通讯

电脑端运行通讯猫调试助手,作为服务端: 电脑端 电脑的IP地址是: 192.168.2.232 手机与电脑之间的TCP通讯 手机端运行网络调试精灵,作为客户端: 手机端 如果从手机端点击"发送"按钮,则也会将"ghhh东方红广场"几个字发送到电脑上(服务端). ESP8266作为客户…

elasticsearch一些重要的配置参数

先看一下官网给我们提供的全部的参数配置项 官网地址 官方文档链接&#xff1a;注意版本是8.1Configuring Elasticsearch | Elasticsearch Guide [8.1] | Elastic​编辑https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html 重要&#xff08;基本…

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析

【2023Mathorcup大数据】B题 电商零售商家需求预测及库存优化问题 python代码解析 1 题目 2023 年MathorCup 高校数学建模挑战赛——大数据竞赛赛道B&#xff1a;电商零售商家需求预测及库存优化问题电商平台存在着上千个商家&#xff0c;他们会将商品货物放在电商配套的仓库…

通道洗牌的思想神了

大家好啊&#xff0c;我是董董灿。 昨天写了一篇关于分组卷积的文章&#xff1a;分组卷积的思想神了&#xff0c;然后有同学希望多了解下通道洗牌。 我个人感觉&#xff0c;通道洗牌这个算法&#xff0c;或者说这个思想&#xff0c;可以称之为小而精&#xff0c;并且是实际解…

rust 创建多线程web server

创建一个 http server&#xff0c;处理 http 请求。 创建一个单线程的 web 服务 web server 中主要的两个协议是 http 和 tcp。tcp 是底层协议&#xff0c;http 是构建在 tcp 之上的。 通过std::net库创建一个 tcp 连接的监听对象&#xff0c;监听地址为127.0.0.1:8080. us…

NEFU数字图像处理(三)图像分割

一、图像分割的基本概念 1.1专有名词 前景和背景 在图像分割中&#xff0c;我们通常需要将图像分为前景和背景两个部分。前景是指图像中我们感兴趣、要分割出来的部分&#xff0c;背景是指和前景不相关的部分。例如&#xff0c;对于一张人物照片&#xff0c;人物就是前景&…

python把ChestX-Det-Dataset的json样本转为COCO数据集的json格式

ChestX-Det-Dataset数据集网址&#xff1a;https://github.com/Deepwise-AILab/ChestX-Det-Dataset/tree/main 数据集JSON内容&#xff1a; [{"file_name": "36199.png","syms": [],"boxes": [],"polygons": []},{"f…

Hadoop学习总结(搭建Hadoop集群(伪分布式模式))

如果前面有搭建过Hadoop集群完全分布式模式&#xff0c;现在搭建Hadoop伪分布式模式可以选择直接克隆完全分布式模式中的主节点(hadoop001)。以下是在搭建过完全分布式模式下的Hadoop集群的情况进行 伪分布式模式下的Hadoop功能与完全分布式模式下的Hadoop功能相同。 一、克隆…

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯

动态规划理论 动态规划&#xff0c;Dynamic Programming&#xff0c; DP&#xff0c; 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导…

buuctf_练[GYCTF2020]FlaskApp

[GYCTF2020]FlaskApp 文章目录 [GYCTF2020]FlaskApp常用绕过方法掌握知识解题思路解题一 -- 计算pin码解题二 -- 拼接绕过 执行命令 关键paylaod 常用绕过方法 ssti详解与例题以及绕过payload大全_ssti绕过空格_HoAd’s blog的博客-CSDN博客 CTF 对SSTI的一些总结 - FreeBuf网…

Spark UI中Shuffle dataSize 和shuffle bytes written 指标区别

背景 本文基于Spark 3.1.1 目前在做一些知识回顾的时候&#xff0c;发现了一些很有意思的事情&#xff0c;就是Spark UI中ShuffleExchangeExec 的dataSize和shuffle bytes written指标是不一样的&#xff0c; 那么在AQE阶段的时候&#xff0c;是以哪个指标来作为每个Task分区大…

了解单域名证书和通配符证书的区别,选择合适的SSL证书解决方案

随着互联网的不断发展&#xff0c;网站安全性问题一直备受关注&#xff0c;在保护网站数据安全的过程中&#xff0c;SSL证书一直发挥着至关重要的作用。而在选择SSL证书时&#xff0c;单域名证书和通配符证书是两种常见的选择。本文将详细介绍单域名证书和通配符证书的区别&…

Cocos Creator 中使用装饰器进行自动绑定

推荐一个偷懒的方式&#xff0c;使用装饰器自动绑定节点到脚本的属性 背景 用 Cocos Creator 写脚本组件的时候&#xff0c;有时需要场景中一个节点作为这个脚本的属性值。 按照官方文档推荐的方法&#xff0c;需要以下两步 添加一个 property 属性&#xff0c;在场景中拖入这个…

案例分析大汇总

案例分析心得 2018-2022年的案例分析考试内容汇总&#xff08;近五年&#xff09; 架构设计题型 软件系统建模 数据库 Web 系统设计 2018年 胖/瘦客户端 C/S 架构非功能性需求 数据流图DFDE-R图Essential Use Cases(抽象用例)&#xff0c;Real Use Cases(基础用例)信息工…

双目视觉计算三维坐标

一、原理 双目视觉的基本原理&#xff0c;以及公式推导&#xff0c;我参考的b站上的视频&#xff0c;链接如下&#xff1a; 2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q34y1n7ot/?p2&spm_id_from333.…

Android底层摸索改BUG(二):Android系统移除预置APP

首先我先提供以下博主博文&#xff0c;对相关知识点可以提供理解、解决、思考的 Android 系统如何预装第三方应用以及常见问题汇集android Android.mk属性说明及预置系统app操作说明系Android 中去除系统原生apk的方法 取消预置APK方法一&#xff1a; 其实就是上面的链接3&a…

03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)

目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思

Lua脚本语言

1. 概念 Lua&#xff08;发音为"loo-ah"&#xff0c;葡萄牙语中的"lua"意为月亮&#xff09;是一种轻量级的、高效的、可嵌入的脚本编程语言。官网Lua最初由巴西计算机科学家Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开…

【JVM】字节码文件的组成部分

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 一、字节码文件的组成部分1.1 iconst_0…