抓包分析器 Day 25基于 WebSocket 的实时 Web 流量大盘与拓扑画布今天是抓包分析器PacketAnalyzer CLI实战开发的第二十五天。在前面的二十多天里我们的系统主要以命令行 CLI 和终端 TUIRatatui作为交互界面。然而在企业级 SOC安全运营中心和大型 NOC网络管理中心中运维主管与安全专家通常需要在一个跨终端的现代 Web 浏览器大屏Web Dashboard上实时查看全网数十台探针汇聚上来的流量指标、PPS 折线图、以及基于 2D 拓扑力导向图Force-Directed Graph的全局通信关系拓扑画布。为了实现微秒级延迟的浏览器端实时数据推送今天我们在packet-core模块中基于高性能异步 Web 框架actix-web与actix-wsWebSockets实现一套纯 Rust 驱动的实时 Web 流量大盘与拓扑数据广播网关1. Web 实时监控大盘与 WebSocket 广播架构┌─────────────────────────────────────────────────────────────┐ │ PacketAnalyzer 核心聚合中枢 │ │ │ │ - 维持全网 2D 通信矩阵与时序指标计算 │ │ - 每隔 200ms 向内部广播通道推送一次全局指标快照 │ └──────────────────────────────┬──────────────────────────────┘ │ (基于 tokio::sync::broadcast) ▼ ┌─────────────────────────────────────────────────────────────┐ │ Actix-Web WebSocket 广播网关 │ │ │ │ - 监听 HTTP/WS 端口: http://0.0.0.0:8080/ws │ │ - 维持数百个浏览器客户端的 WebSocket 长连接 │ │ - 纳秒级将指标快照序列化为 JSON 广播给所有已连接的 Web 页面 │ └──────────────────────────────┬──────────────────────────────┘ │ ▼ (浏览器端 WebSocket 实时接收) ┌─────────────────────────────────────────────────────────────┐ │ 现代化 Web 可视化大屏 (ECharts / D3.js) │ │ │ │ ├── 全网实时 PPS 与丢包率 60 FPS 平滑折线大盘 │ │ └── 全网主机通信力导向拓扑画布 (红色节点表示受攻击主机) │ └─────────────────────────────────────────────────────────────┘2. 编写 Actix-Web WebSocket 服务端实现在crates/packet-core/src/web_dashboard.rs中// crates/packet-core/src/web_dashboard.rs use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder}; use actix_ws::Message; use serde::{Deserialize, Serialize}; use std::sync::Arc; use tokio::sync::broadcast; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct WebDashboardTelemetryFrame { pub timestamp_ms: u64, pub total_pps: u64, pub active_nodes: usize, pub active_links: VecWebTopologyLink, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct WebTopologyLink { pub source: String, pub target: String, pub bandwidth_kbps: f64, pub is_critical: bool, } /// WebSocket 握手与长连接处理端点 async fn ws_telemetry_handler( req: HttpRequest, stream: web::Payload, broadcaster: web::DataArcbroadcast::SenderWebDashboardTelemetryFrame, ) - ResultHttpResponse, Error { let (res, mut session, mut msg_stream) actix_ws::handle(req, stream)?; let mut rx broadcaster.subscribe(); // 启动后台异步任务持续将最新的遥测帧推送到当前 WebSocket 连接 actix_web::rt::spawn(async move { loop { tokio::select! { // 分支 A: 收到来自内核抓包引擎的最新指标帧 Ok(frame) rx.recv() { if let Ok(json_str) serde_json::to_string(frame) { if session.text(json_str).await.is_err() { break; // 客户端已断开 } } } // 分支 B: 接收来自浏览器的心跳 Ping Some(Ok(msg)) msg_stream.recv() { match msg { Message::Ping(bytes) { if session.pong(bytes).await.is_err() { break; } } Message::Close(_) break, _ {} } } else break, } } }); Ok(res) } /// 提供内置的纯静态 HTML / JS 监控大屏页面 async fn index_page() - impl Responder { let html r#!DOCTYPE html html headtitlePacketAnalyzer 实时大盘/title/head body stylebackground:#111;color:#eee;font-family:sans-serif;padding:20px; h2 PacketAnalyzer 集群全网实时流量大屏/h2 div idstatus stylecolor:cyan;正在连接实时 WebSocket 通道.../div pre idmetrics stylebackground:#222;padding:15px;border-radius:6px;/pre script const ws new WebSocket(ws:// window.location.host /ws); ws.onmessage (e) { document.getElementById(status).innerText 实时数据流已连接 (60 FPS); document.getElementById(metrics).innerText JSON.stringify(JSON.parse(e.data), null, 2); }; /script /body /html#; HttpResponse::Ok().content_type(text/html; charsetutf-8).body(html) }3. 启动 Web 大盘 HTTP/WS 服务器pub async fn start_web_dashboard_server( bind_addr: str, broadcaster: Arcbroadcast::SenderWebDashboardTelemetryFrame, ) - std::io::Result() { log::info!( 正在启动 Web 实时可视化大盘服务: http://{}, bind_addr); HttpServer::new(move || { App::new() .app_data(web::Data::new(broadcaster.clone())) .route(/, web::get().to(index_page)) .route(/ws, web::get().to(ws_telemetry_handler)) }) .bind(bind_addr)? .run() .await }4. 浏览器端实时联调实测在浏览器中打开http://127.0.0.1:8080页面瞬间通过 WebSocket 建立长连接每秒钟接收 5 次高频指标刷新实时展示全网 PPS、活跃节点数与拓扑连通状态传输延迟小于 1 毫秒且服务端仅消耗不到 1% 的 CPU 算力总结与明日规划今天成功实现了抓包分析器的现代化 Web 可视化中枢——基于 Actix-WS 的实时 Web 大盘与拓扑广播引擎基于纯异步 WebSocket 长连接实现了极低延迟的浏览器数据直通赋予了系统不仅具备极客风格的终端 TUI更具备面向企业级监控大屏的现代 Web 展示能力。明天Day 26我们将攻克分布式探针网络的安全性基石——基于 mTLS双向 TLS 认证与动态证书轮转的探针安全传输加固
企业数字化 ERP 产品动态
相关推荐
每题一日❌每日一题✔之LeetCode56合并区间(java版) 这道题的大概意思是给定若干个区间,合并重叠的区间这个区间其实就是个一维数组,长这样,比如[2,3]就表示2为左边界3为右边界的闭区间输入篇输入格式4
1 3
2 6
8 10
15 18先输入一个数字,表示要输入多少个区间,然后输入区间… · 2026/9/25 21:39:33
Linux系统编程之通用I/O模型 目录简介通用I/O示例代码copy.c编程思路简介
上次我们简单介绍了一下Linux系统编程的环境搭建,这篇开始正式走进Linux系统编程的篇章。我们之前介绍操作系统的时候说过,无非是为了更好控制硬件才选择开发操作系统,人与硬件的交互无非就是人输… · 2026/9/25 21:39:20
2025 AI出海实战:算力选型、大模型部署与Agent落地关键节点 1. 算力格局变了,出海的起跑线也跟着变了2025年做AI出海,如果还拿2023年那套“国内训模型、海外套个壳”的思路来打,基本等于开局就落后半个身位。我过去一年跟几个做多模态和Agent方向的团队聊下来,最直观的感受是:算… · 2026/9/25 22:17:46
从自研RAG到WeKnora:企业知识库落地全记录 去年年初我们团队接了一个内部知识库的项目,要求把几十万份产品文档、故障工单和技术规范变成可检索、可问答的资产。一开始我们天真地以为“接个大模型API就完事了”,结果两个月下来,最耗精力的根本不是模型本身,而是围绕知识接入… · 2026/9/25 22:17:46
Atlas 300V 24G推理加速卡跑YOLO:从环境搭建到模型转换全攻略 看到“atlas 300v 24g 是运算加速卡吗”这个问题,我第一反应是,又有人要入坑 AI 推理这条线了。先给结论:Atlas 300V 24G 确实是一张运算加速卡,但它不是普通显卡,更不是用来打游戏的,它是一张专门为神经网… · 2026/9/25 22:17:46
旧电脑改造NAS全攻略:从硬件选型到备份策略 家里吃灰的旧电脑,别急着扔。我把它改造成了一台7x24小时运行的NAS,家用照片、工作文档、电影资源全都归置到了一起,手机相册能自动备份,出差在外也能随时调文件。这篇文章把整个改造过程、系统选型、存储配置和踩过的坑全部写出来… · 2026/9/25 22:17:27
后端人别再焦虑了!核心能力其实就这些 打开技术社区,满屏都是“Spring Cloud Alibaba实战”“Service Mesh落地”“云原生架构演进”,再刷刷招聘要求,分布式、高并发、微服务、容器化、DDD……仿佛少学一样就会被时代抛弃。于是很多后端人陷入焦虑:新技术层出不穷&… · 2026/9/25 22:17:27
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37