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.rhkb.cn/news/174021.html

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

相关文章

3.72 Command Buffer及URP概述

一、Command Buffer 1.概念 CommandBuffer携带一系列的渲染命令&#xff0c;依赖相机&#xff0c;用来拓展渲染管线的渲染效果。而且可以指定在相机渲染的某个点执行本身的拓展渲染。Command buffers也可以结合屏幕后期效果使用。 简单来说就是可以在渲染流程中插入一些自定…

R2R 的一些小tip

批次间控制器(Run-to-run Controller)&#xff0c;以应对高混合生产的挑战。将最优配方参数与各种工业特征相关联的模型是根据历史数据离线训练的。预测的最优配方参数在线用于调整工艺条件。 批次控制(R2R control)是一种先进的工艺控制技术&#xff0c;可在运行(如批次或晶圆…

招生报名缴费小程序开发笔记(上)

前期调研 1.数字化趋势&#xff1a; 随着社会的数字化转型&#xff0c;越来越多的教育机构倾向于采用数字工具来简化和优化他们的招生和报名过程。招生报名缴费小程序是应对这一趋势的一种解决方案&#xff0c;可以提供高效、方便、快速的在线招生渠道。2.用户需求&#xff1a…

进行商城的测试用例设计思路是什么?

进行商城的测试用例设计时&#xff0c;可以考虑以下思路&#xff1a; 1. 功能测试&#xff1a;测试商城的基本功能是否正常工作&#xff0c;包括用户注册、登录、浏览商品、搜索商品、添加商品到购物车、下单、支付等。 2. 数据验证测试&#xff1a;验证商城中的数据是否正确…

HarmonyOS 快速入门TypeScript

1.什么是TypeScript&#xff0c;它和JavaScript&#xff0c;ArkTs有什么区别 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发…

jenkins自动化操作步骤(gitblit)

1、登陆地址&#xff1a; http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项&#xff1a; 1&#xff09;使用父项目的pom文件&#xff1a;k56-boot/pom.xml 2&…

《python语言程序设计》(2018版)第5章编程题 第41题第3次路过。总结一下。没有走完的路

这道题最大的需要就是能够进行两个数值的对比&#xff0c;同时还能让更多的数值依次进入到对比中。 这道题的解题版本 这个版本只是能统计出谁是最大数。但是无法统计最大数出现了多少次。 number "" count 0 data_number 0 while number ! 0:number eval(inpu…

Babylonjs学习笔记(五)——创建PBR材质

书接上回&#xff0c;这里讨论PBR材质&#xff01;&#xff01;&#xff01; // 创建天空盒/* */const createSkyBox (scene:Scene):void>{const envTex CubeTexture.CreateFromPrefilteredData(./env/environment.env,scene)scene.environmentTexture envTex;scene.cre…

基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理_董雷 仿真平台&#xff1a; MATLABcplex 主要内容&#xff1a; 主要为多虚拟电厂/微网的优化调度策略&#xff0c;模型…

Stable Diffusion AI绘图

提示词&#xff1a; masterpiece, best quality, 1girl, (anime), (manga), (2D), half body, perfect eyes, both eyes are the same, Global illumination, soft light, dream light, digital painting, extremely detailed CGI anime, hd, 2k, 4k background 反向提示词&…

在Go项目中二次封装Kafka客户端功能

1.摘要 在上一章节中,我利用Docker快速搭建了一个Kafka服务,并测试成功Kafka生产者和消费者功能,本章内容尝试在Go项目中对Kafka服务进行封装调用, 实现从Kafka自动接收消息并消费。 在本文中使用了Kafka的一个高性能开源库Sarama, Sarama是一个遵循MIT许可协议的Apache Kafk…

Flask路由机制分析之二

一、前言 上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念&#xff0c;这节我们具体分析一下路由内部机制&#xff0c;Flask路由依赖于werkzegu的routing模块来实现。 二、werkzegu的routing模块介绍 Werkzegu库的routing模块主要功能在于URL…

PDF 文档处理:使用 Java 对比 PDF 找出内容差异

不论是在团队写作还是在个人工作中&#xff0c;PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档&#xff0c;用户可以快速找出文档增加、删除和修改的内容&#xff0c;更好地了解文档的演变过程&#xff0c;轻松地管理…

大数据Flink(一百零五):SQL性能调优

文章目录 SQL性能调优 一、 ​​​​​​​MiniBatch 聚合

企业如何安全跨国传输30T文件数据

对于一些对数据敏感性比较高的企业&#xff0c;如IT企业和国企等&#xff0c;跨国数据传输是当今企业面临的一个重要挑战&#xff0c;尤其是当数据量达到30T这样的规模时&#xff0c;如何保证数据的速度、安全和合规性&#xff0c;就成为了企业必须考虑的问题。本文将从以下几个…

计算机毕业设计选题推荐-周边美食推荐微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

大数据-Storm流式框架(八)---Storm案例

中国移动项目部署文档 一、项目架构 二、启动集群 1、启动Zookeeper集群 2、启动Hbase&#xff08;完全分布式需要先启动Hadoop集群&#xff09; 在conf/hbase-env.sh中设置JAVA_HOME 在conf/hbase-site.xml中&#xff0c;仅需要指定hbase和zookeeper写数据的本地路径。默…

2023 年值得关注的国外网络安全初创公司

网络安全初创公司试图解决的问题往往有点超前于主流。他们可以比大多数老牌公司更快地填补空白或新兴需求。初创公司通常可以更快地创新&#xff0c;因为它们不受安装基础的限制。 当然&#xff0c;缺点是初创公司往往缺乏资源和成熟度。公司致力于初创公司的产品或平台是有风…

Spring Web MVC入门

一&#xff1a;了解Spring Web MVC (1)关于Java开发 &#x1f31f;Java开发大多数场景是业务开发 比如说京东的业务就是电商卖货、今日头条的业务就推送新闻&#xff1b;快手的业务就是短视频推荐 (2)Spring Web MVC的简单理解 &#x1f497;Spring Web MVC&#xff1a;如何使…

缓解大模型幻觉问题的解决方案

本文记录大模型幻觉问题的相关内容。 参考&#xff1a;Mitigating LLM Hallucinations: a multifaceted approach 地址&#xff1a;https://amatriain.net/blog/hallucinations &#xff08;图&#xff1a;解决大模型幻觉的不同方式&#xff09; 什么是幻觉&#xff1f; 幻觉…