go build -o netmonitor net_quality_monitor.go #### 2. 部署与运行 **第一步:在主机 B 上启动服务端** 服务端将监听 TCP 28080 和 UDP 28081 端口,等待 A 的连接。 ```bash # Linux/Mac ./netmonitor -mode server -tcp 28080 -udp 28081 **第二步:在主机 A 上启动客户端** 客户端将每隔 5 秒测试一次到 140.238.52.228 的网络质量。 ```bash # 开启测试 ./netmonitor -mode client -target 140.238.52.228 -tcp 28080 -udp 28081 -duration 10 -interval 60 # 德国 ./netmonitor -mode client -target 43.154.83.213 -tcp 28080 -udp 28081 -duration 15 -interval 600 ### 功能特点详解 1. **真实 TCP 交互**: * 代码中的 `testTCPLatency` 函数不使用 ICMP Ping,而是通过 `net.DialTimeout` 建立完整的三次握手,并发送 Payload 数据。服务端接收并回写(Echo)。 * 计算的时间包含了:`TCP握手时间` + `数据传输时间` + `ACK时间`。这比普通的 Ping 更能反映应用程序(如 HTTP/RPC)的真实感受。 2. **UDP 丢包监测**: * `testPacketLoss` 采用 UDP 协议。UDP 是无连接的,不保证到达。 * 客户端连续快速发送 `LossTestCount` (默认20个) 包。如果接收端(Echo模式下)没有及时返回,则判定为丢包。 * 这种方法能有效检测线路拥塞或防火墙限流情况。 3. **定时与报告**: * 程序使用 `time.Ticker` 保证精准的执行周期。 * 结果会同时输出到 **控制台** 和 **net_quality_report.log**。 * 另外生成 **net_report_data.jsonl**,每行一个 JSON 对象,方便后续通过脚本(如 Python/ELK)进行图表分析。 4. **关于 Traceroute 的说明**: * 我在代码中预留了 `TraceRoute` 接口。 * *注意*:在 Go 语言中实现真正的 Traceroute(修改 TTL)需要引入 `golang.org/x/net/ipv4` 包并使用 Raw Socket,这要求程序必须以 **root/管理员** 权限运行。为了保持代码作为一个简洁的“单文件”工具,且能保证在普通用户权限下运行,我没有包含 Raw Socket 代码。目前的实现是应用层层面的连通性检查。 ### 报告样本 日志文件 (`net_report_data.jsonl`) 内容示例: ```json {"timestamp":"2023-10-27 10:00:00","target":"192.168.1.200","tcp_latency_ms":12.5,"tcp_jitter_ms":1.2,"loss_rate_a_to_b":0.0,"loss_rate_b_to_a":0.0} {"timestamp":"2023-10-27 10:00:10","target":"192.168.1.200","tcp_latency_ms":12.8,"tcp_jitter_ms":0.9,"loss_rate_a_to_b":0.05,"loss_rate_b_to_a":0.05} 你可以直接用 Excel 或 Python 读取这个文件来生成网络质量波动图。