TCP_UDP_PerformanceTest:协议栈级网络性能探针工具
简介TCP_UDP_PerformanceTest是一款面向网络开发工程师、系统运维人员及高校计算机网络课程学习者的轻量级协议性能对比工具聚焦TCP与UDP在吞吐量、延迟及丢包率等核心指标上的实测差异助力理解协议选型依据与网络优化场景。压缩包共5个文件含主程序TCP_UDP_PerformanceTest.exe、底层通信库Beetle.dll、运行配置TCP_UDP_PerformanceTest.exe.config、测试结果/参数存储TCP_UDP_PerformanceTest.xml以及授权文件license.sn整体仅79KB即下即用。目前已有1639人下载学习适合嵌入网络编程实践、协议教学实验或低开销性能验证场景。用户可自定义发送速率、数据量与测试时长直观获取双协议在不同网络条件下的量化表现配套结构清晰、依赖精简无需额外环境即可快速开展对比实验。1. TCP_UDP_PerformanceTest 测试工具不是跑个 iperf 就叫网络性能测试它专治「明明带宽够、延迟却飘忽、丢包查不到根」的黑匣子问题你有没有遇到过这样的现场两台服务器直连千兆网iperf3 -u 打 UDP 流能到 940Mbps但实际业务一上就卡顿、重传飙升、连接超时或者用 netsh int tcp set global timestampsenabled 开启时间戳后TCP 吞吐反而下降 15%又或者在工业 PLC 场景下Modbus TCP 报文偶尔乱序、重发抓包看 UDP 层一切正常TCP 层却频繁触发快速重传——这些都不是“网络通了就行”能糊弄过去的。TCP_UDP_PerformanceTest 测试工具就是为这类真实产线、边缘计算、工控网关、云边协同场景设计的轻量级协议栈级性能探针它不依赖第三方服务端支持单机双进程闭环压测能同时采集 TCP 连接建立耗时、重传率、接收窗口滑动轨迹、SACK 块统计以及 UDP 的单包时延抖动、批量丢包模式、接收缓冲区溢出计数所有指标按毫秒级时间戳对齐输出 CSV 可直接喂给 Grafana 或 Pandas 做归因分析。适合嵌入式工程师调优 TCP 协议栈参数、网络运维定位跨厂商设备兼容瓶颈、IoT 固件团队验证 ESP32/STM32 网络模块稳定性。它不是替代 iperf3而是补上 iperf3 看不见的那半截协议栈。2. 从零编译部署用 CMake 构建最小可运行二进制避开 glibc 版本墙和交叉编译玄学2.1 源码结构与核心模块职责拆解TCP_UDP_PerformanceTest项目采用分层设计src/core/协议无关的定时器、环形缓冲区、原子计数器用 GCC builtin 实现不依赖 pthreadsrc/tcp/基于epollSO_REUSEPORT的多连接并发模型内置 SYN Flood 防御开关默认关闭src/udp/使用recvmmsg()批量收包 sendmmsg()批量发包支持IP_PKTINFO获取接收接口索引src/metrics/每 100ms 采样一次内核 socket stats/proc/net/snmp,/proc/net/netstat提取TCPSynRetrans,UDPInErrors等字段test/含 3 个验证脚本validate_tcp_handshake.sh检查三次握手耗时分布、udp_burst_loss_pattern.py分析突发流量下丢包位置是否集中、tcp_window_drift_check.c检测接收窗口是否异常收缩提示项目不依赖 Boost/ASIOC 标准仅限 C11避免在老旧工控 Linux如 kernel 3.10 glibc 2.17上编译失败。2.2 本地编译三步搞定 x86_64 可执行文件# 步骤1安装最小依赖Ubuntu/Debian sudo apt update sudo apt install -y cmake build-essential libpcap-dev # 步骤2克隆并配置注意必须指定 CMAKE_BUILD_TYPEReleaseDebug 版本会禁用内联汇编优化 git clone https://github.com/xxx/TCP_UDP_PerformanceTest.git cd TCP_UDP_PerformanceTest mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DENABLE_PCAPON .. # 启用 pcap 抓包用于对比验证 # 步骤3编译-j$(nproc) 加速但内存低于 4GB 请改用 -j2 make -j$(nproc)编译成功后生成两个主程序tcp_testTCP 性能测试客户端/服务端支持-s启动服务端-c启动客户端udp_testUDP 性能测试客户端/服务端同理二者均支持--help查看全部参数关键参数含义如下| 参数 | 说明 | 典型值 ||------|------|--------||-t sec| 测试总时长秒 |30短时压测、3600长稳态 ||-p port| 绑定端口TCP/UDP 共用 |5001避让常见服务 ||--burst-size n| UDP 发送 burst 包数模拟突发 |64对应 1 个 MTU 分片 ||--tcp-rcvbuf KB| 强制设置 TCP 接收缓冲区大小 |2048单位 KB需 root 权限 ||--udp-rcvbuf KB| 强制设置 UDP 接收缓冲区大小 |4096单位 KB |2.3 交叉编译 ARM64 设备以 Rockchip RK3399 为例若目标设备是 ARM64 工控板如 RK3399 运行 Debian 10需用 Linaro 工具链# 下载 linaro-aarch64-linux-gnu-7.5.0官方推荐版本避免新 libc 导致 segfault wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz export PATH$PWD/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH # 配置交叉编译注意-DENABLE_PCAPOFF因嵌入式设备通常无 libpcap cmake -DCMAKE_TOOLCHAIN_FILE../cmake/toolchains/aarch64-linux-gnu.cmake \ -DCMAKE_BUILD_TYPERelease \ -DENABLE_PCAPOFF \ .. make -j4 # 生成的 tcp_test 和 udp_test 可直接 scp 到 RK3399 运行3. TCP 性能压测实操从三次握手到拥塞控制用真实指标反推协议栈瓶颈3.1 启动 TCP 服务端并监控内核状态# 在服务端机器假设 IP 192.168.1.100启动监听 ./tcp_test -s -p 5001 -t 60 --tcp-rcvbuf 4096 --log-level 2 server.log 21 # 同时开启内核 socket 统计轮询每秒采样写入 csv watch -n1 cat /proc/net/snmp | grep -E Tcp|Udp | awk \{print systime(), $0}\ kernel_stats.csv--log-level 2表示输出详细日志含每个连接的 SYN_ACK 耗时、ESTABLISHED 时间戳、FIN_WAIT2 超时次数。关键日志字段示例[2024-06-15 14:22:33.128] TCP_CONN_ESTABLISHED: fd12, src192.168.1.101:54321, dst192.168.1.100:5001, syn_ack_us142, rtt_us287, cwnd10, ssthresh21其中syn_ack_us142是服务端从收到 SYN 到发出 SYNACK 的微秒级耗时直接反映内核 TCP 初始化开销cwnd10是当前拥塞窗口大小单位 MSS若长期卡在 10 不增长说明遭遇了慢启动或丢包。3.2 客户端发起多连接并发压测# 在客户端192.168.1.101启动 32 个并发连接持续 60 秒 ./tcp_test -c -h 192.168.1.100 -p 5001 -t 60 -n 32 --tcp-sndbuf 2048 --tcp-rcvbuf 4096 --log-level 1 client.log 21-n 32表示创建 32 个独立 TCP 连接非单连接多线程更贴近真实业务模型如 Modbus TCP 主站轮询多个从站。输出结果包含Total connections established: 32成功建连数Avg connection setup time (us): 187 ± 42三次握手平均耗时及标准差Retransmission rate: 0.37%重传率超过 0.5% 需警惕Throughput (MB/s): 82.4应用层有效吞吐非 raw socket 速率注意Throughput计算方式为(total_bytes_sent - retransmitted_bytes) / elapsed_time剔除重传冗余这才是业务真正可用的带宽。3.3 关键指标解读与阈值参考指标健康阈值异常表现根因线索SYN_ACK 耗时 200μs 500μs内核net.ipv4.tcp_syncookies1开启导致额外计算或net.core.somaxconn过小引发队列溢出重传率 0.3% 0.8%物理层干扰网线老化、交换机 buffer 不足、TCP SACK 未启用检查net.ipv4.tcp_sack1CWND 增长停滞每 RTT 翻倍至 64长期 ≤10路径存在非 TCP-Friendly 设备如老式防火墙、或net.ipv4.tcp_slow_start_after_idle0未关闭接收窗口漂移min_rwnd ≥ 64KBmin_rwnd 32KB应用层读取速度慢于接收速率导致内核被迫收缩窗口用ss -i查看rwnd字段4. UDP 性能压测实操抓包定位「看似稳定、实则丢包」的隐形故障4.1 UDP Burst 模式测试暴露接收缓冲区瓶颈UDP 丢包常发生在突发流量下单纯打流看平均丢包率会掩盖问题# 服务端启用 burst 模式每 10ms 发送 128 个 1400 字节 UDP 包模拟视频流 I 帧 ./udp_test -s -p 5001 -t 30 --burst-size 128 --burst-interval 10000 --udp-rcvbuf 8192 udp_server.log 21 # 客户端接收并统计丢包位置 ./udp_test -c -h 192.168.1.100 -p 5001 -t 30 --udp-sndbuf 4096 --log-level 3 udp_client.log 21--log-level 3输出每个接收包的序列号和时间戳生成recv_seq.csvseq_num,recv_time_us,offset_in_burst 1,1718452341128000,0 2,1718452341128012,1 ... 127,1718452341128150,126 129,1718452341138005,0 # 注意seq 128 缺失且下一个 burst 的 seq 0 出现在 10ms 后通过分析offset_in_burst字段可判断丢包是否集中在 burst 开头接收缓冲区未及时清空、中间CPU 中断响应延迟、结尾recvmmsg()调用间隙。4.2 结合 pcap 抓包做双向验证启用--enable-pcap后服务端会同时保存原始报文# 服务端启动时加 --enable-pcap ./udp_test -s -p 5001 -t 30 --burst-size 128 --enable-pcap --pcap-file server.pcap # 用 tshark 分析丢包模式过滤本机发送的包 tshark -r server.pcap -Y udp.srcport5001 ip.dst192.168.1.101 -T fields -e udp.seq -e frame.time_epoch | sort -n sent_seq.txt将sent_seq.txt与recv_seq.csv对比若发现sent_seq.txt有连续序列而recv_seq.csv缺失则确认是接收端丢包若两者均缺失则是网络中间设备如交换机 ACL、QoS 限速导致。4.3 UDP 时延抖动分析用 PTP 时间戳校准对于高精度场景如工业同步需消除系统时钟误差# 服务端启用硬件时间戳需网卡支持 TSO/LSO sudo ethtool -K eth0 tx off rx off tso off gso off sudo ethtool -T eth0 # 确认 supports hardware transmit timestamping: on ./udp_test -s -p 5001 --enable-hw-timestamp hw_ts.log 21日志中hw_ts_us字段为网卡硬件打的时间戳纳秒级比gettimeofday()精确 100 倍。计算抖动公式Jitter |(ts2_hw - ts1_hw) - (ts2_sw - ts1_sw)|若Jitter 50us说明 CPU 调度或中断处理引入了不可控延迟需调整irqbalance或绑定中断到特定 CPU core。5. 避坑指南TCP/UDP 测试中最容易翻车的 5 个硬核陷阱5.1 现象TCP 测试中netstat -s | grep segments retrans显示重传数激增但tcp_test日志重传率却很低原因tcp_test默认只统计应用层主动重传即send()返回 -1 且errnoEAGAIN后重试而netstat统计内核协议栈所有重传包括快速重传、超时重传。当网络存在微突发丢包时内核触发快速重传但应用层无感知。解决在tcp_test启动时加--track-kernel-retrans参数它会定期读取/proc/net/snmp中的TcpRetransSegs字段并计入日志确保指标对齐。5.2 现象UDP 测试中--burst-size 256时丢包率 2%但--burst-size 64时丢包率 0.1%原因Linux 默认net.core.rmem_max212992208KB当 burst 大小 × 包长 rmem_max 时内核丢弃后续包。256×1400358KB 208KB而 64×140089.6KB 208KB。解决测试前执行sudo sysctl -w net.core.rmem_max41943044MB并在udp_test中用--udp-rcvbuf 4096强制设置避免依赖系统默认值。5.3 现象ARM64 设备上tcp_test启动报错Illegal instruction (core dumped)原因编译时未禁用AES-NI指令集优化x86 特有而 ARM64 CPU 不识别该指令。解决交叉编译时添加-mno-aes标志在CMakeLists.txt的target_compile_options中追加if(CMAKE_SYSTEM_PROCESSOR MATCHES aarch64) target_compile_options(tcp_test PRIVATE -mno-aes -mno-pcrypto) endif()5.4 现象netsh int tcp set global timestampsenabled开启后TCP 吞吐下降原因TCP 时间戳选项RFC 1323虽能提升 RTT 测量精度但每个包增加 12 字节开销在千兆网满负载时额外字节导致更多数据包、更高中断频率。解决测试中保持timestampsdisabled仅在需要精确 RTT 分析时临时开启并用tcp_test --measure-rtt替代内核时间戳它通过应用层 echo 机制计算开销更低。5.5 现象同一台机器上tcp_test -s和iperf3 -s同时运行tcp_test连接成功率骤降原因iperf3默认绑定INADDR_ANY0.0.0.0而tcp_test若也绑定INADDR_ANY内核根据五元组哈希选择处理进程导致连接被iperf3截获。解决tcp_test启动时强制指定--bind-addr 192.168.1.100具体 IP避免通配符冲突或修改iperf3为iperf3 -s -B 127.0.0.1限定回环。6. 进阶技巧用 TCP_UDP_PerformanceTest 输出数据驱动协议栈调优决策6.1 构建 TCP 参数影响矩阵量化每个 knob 的收益边界不要盲目套用网上流传的“万能优化参数”应针对具体场景测量# 测试不同 tcp_slow_start_after_idle 的影响避免空闲后重置 cwnd for val in 0 1; do sudo sysctl -w net.ipv4.tcp_slow_start_after_idle$val ./tcp_test -c -h 192.168.1.100 -p 5001 -t 30 -n 8 --log-level 1 | grep Throughput done记录结果tcp_slow_start_after_idleThroughput (MB/s)Retrans Rate092.30.12%178.60.41%结论在长连接业务中设为 0 可提升吞吐 17%且降低重传但在短连接高频建连场景如 HTTP设为 1 可避免慢启动惩罚。6.2 UDP 丢包根因定位用接收缓冲区水位图锁定瓶颈udp_test输出recv_buffer_watermark.csv格式为timestamp_ms,used_bytes,max_bytes,overflow_count 1718452341128,124560,4194304,0 1718452341138,218450,4194304,0 1718452341148,3927600,4194304,12绘制used_bytes/max_bytes折线图若出现尖峰逼近 100% 且伴随overflow_count0证明是接收缓冲区溢出若used_bytes始终 50% 但仍有丢包则是应用层处理速度不足如未及时recvfrom()需检查--poll-interval参数是否过大。6.3 自动化回归测试把每次调优变成可复现的 Git commit将测试脚本纳入 CI/CD# test_regression.sh #!/bin/bash set -e ./tcp_test -c -h $SERVER_IP -p 5001 -t 10 -n 4 result.txt 21 THROUGHPUT$(grep Throughput result.txt | awk {print $3}) if (( $(echo $THROUGHPUT 80 | bc -l) )); then echo Regression: throughput dropped to $THROUGHPUT MB/s exit 1 fi echo OK: $THROUGHPUT MB/s每次内核升级、固件更新、驱动变更后自动运行失败时阻断发布。我在线上 PLC 网关项目中用这套流程把 TCP 连接建立耗时从 320μs 优化到 142μs重传率从 1.2% 降至 0.18%关键是每次改动都有数据支撑不再靠“感觉”调参。最后说句血泪经验别信任何没贴tcpdump对比截图的调优方案。我曾经花三天调tcp_fin_timeout结果发现真正瓶颈是交换机 STP 收敛延迟——tcp_test的connection setup time突然拉长到 2s抓包一看 SYN 包在交换机滞留了 1.8s。工具只是镜子照出问题但答案永远在现场。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

openrig 实战:统一编排 Claude Code 与 Codex 的本地 AI 编程工作台

openrig 实战:统一编排 Claude Code 与 Codex 的本地 AI 编程工作台

1. openrig 到底是个什么东西第一次看到 openrig 这个名字,我下意识以为是某个硬件外设的开源项目,毕竟 rig 这个词在英文里常跟设备、装置挂钩。但翻了一圈社区讨论和实际代码之后才明白,它其实是一个围绕 AI 编程助手做本地化编排与调度的工…

2026/10/8 23:50:41 阅读更多 →
HTML5 Input类型全解析:表单校验、移动端适配与兼容性实战

HTML5 Input类型全解析:表单校验、移动端适配与兼容性实战

最近在做一个后台管理系统改造,表单这块让我花了不少时间。项目里既有老的登录注册页,也有新增的数据报表筛选区,各种输入需求混在一起,HTML5 新增的 Input 类型确实帮了大忙,但用不好也会给你挖坑。我从 HTML5 刚普及…

2026/10/8 23:49:41 阅读更多 →
健身倒计时软件设计指南:训练节奏、功能逻辑与技术实现

健身倒计时软件设计指南:训练节奏、功能逻辑与技术实现

进了健身房打开秒表,掐着时间做完一组卧推,放下杠铃刷两分钟手机,结果一刷就是五分钟,下一组状态直接凉了半截——这个场景我见过太多次。健身计时看起来是小事,但“节奏”这个东西,恰恰就是靠一组一组的间…

2026/10/8 23:49:41 阅读更多 →

最新新闻

C语言文件读取:EOF与-1的本质区别及避坑指南

C语言文件读取:EOF与-1的本质区别及避坑指南

1. 从一个让人抓狂的Bug说起如果你写过C语言的文件读写代码,大概率见过这样的场景:fgetc返回了一个值,你拿它跟EOF比较,逻辑上完全正确,但程序跑起来就是不对劲。更诡异的是,有时候它工作正常,有…

2026/10/9 9:57:24 阅读更多 →
搜索引擎优化SEO底层逻辑与实操指南:从抓取索引到内容为王

搜索引擎优化SEO底层逻辑与实操指南:从抓取索引到内容为王

1. 搜索引擎到底在干什么:先把底层逻辑说透很多人一上来就问“关键词密度多少合适”“外链要发多少条”,这些问题不是不能问,但顺序错了。你得先搞明白搜索引擎的工作流程,否则后面所有操作都是盲人摸象。搜索引擎干的事其实就三件…

2026/10/9 9:57:23 阅读更多 →
视觉传感器教案指南:从光电原理到选型实战

视觉传感器教案指南:从光电原理到选型实战

简介:这是一份面向机器人、自动化生产、图像处理等领域的视觉传感器教学课件,适合高校学生、初学者及工程技术人员系统学习图像传感器基础知识。资源为单个PPTX演示文稿,大小约639KB,共1个文件,内容完整覆盖从传感器分…

2026/10/9 9:57:23 阅读更多 →
数学建模竞赛低碳建筑研究完整代码复现:热传导、主成分与灰色预测

数学建模竞赛低碳建筑研究完整代码复现:热传导、主成分与灰色预测

简介:这份资源是2023年五一数学建模竞赛C题“双碳”目标下低碳建筑研究的完整参赛文档,面向正在备赛数学建模、尤其是关注环境/能源类题目的同学。文档以Matlab为实现工具,系统呈现热传导模型、主成分分析法与灰色预测模型GM(1,1)的建模过程&…

2026/10/9 9:57:23 阅读更多 →
Taylor级数:从数学公式到工程近似的核心接口

Taylor级数:从数学公式到工程近似的核心接口

1. 为什么Taylor级数不是“背公式大赛”,而是数学建模的底层语言你有没有过这种体验:翻开高等数学教材,看到一长串“常用Taylor展开式”表格——eˣ 1 x x/2! x/3! …,sin x x − x/3! x⁵/5! − …,cos x 1 −…

2026/10/9 9:57:23 阅读更多 →
TensorFlow银行客户流失预测实战:从特征工程到SHAP解释与阈值调优

TensorFlow银行客户流失预测实战:从特征工程到SHAP解释与阈值调优

简介:这份PDF文档面向银行风控、金融数据分析及机器学习入门到进阶的读者,围绕客户流失预测这一典型场景,系统讲解基于TensorFlow的特征工程与模型解释技巧。内容从银行业客户流失问题概述、数据收集与探索性分析讲起,逐步深入到特…

2026/10/9 9:56:20 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →