VRRP配置实操:双路由器冗余,实现网关故障自动切换
VRRP配置实操双路由器冗余实现网关故障自动切换本章学习目标本章进行实战进阶帮助读者将所学知识应用于实际场景。通过本章学习你将全面掌握VRRP配置实操双路由器冗余实现网关故障自动切换这一核心主题。一、引言为什么这个话题如此重要在数字化时代计算机网络已经成为现代社会的基础设施。VRRP配置实操双路由器冗余实现网关故障自动切换作为网络知识体系的重要组成部分是每个IT从业者和网络爱好者必须掌握的核心内容。1.1 背景与意义核心认知计算机网络是连接世界的桥梁。从简单的局域网文件共享到复杂的全球互联网网络技术无处不在。理解网络原理不仅能帮助我们更好地使用网络还能在遇到问题时快速定位和解决。据统计全球互联网用户已超过50亿每天产生的网络流量高达数EB级别。在这样的背景下掌握网络基础知识无论是对于个人职业发展还是企业信息化建设都具有重要的现实意义。1.2 本章结构概览为了帮助读者系统性地掌握本章内容我将从以下几个维度展开 概念解析 → 原理讲解 → 实现方法 → 实践案例 → 常见问题 → 总结展望二、核心概念解析2.1 基本定义让我们首先明确几个核心概念概念一基础定义VRRP配置实操双路由器冗余实现网关故障自动切换是计算机网络领域的核心主题涉及网络通信、数据传输、协议规范等关键内容。概念二技术内涵从技术角度看这一概念包含以下几个层面维度说明重要程度理论基础协议原理与标准规范⭐⭐⭐⭐⭐技术实现设备配置与系统部署⭐⭐⭐⭐⭐实践应用问题排查与优化调整⭐⭐⭐⭐发展趋势新技术与新应用⭐⭐⭐2.2 关键术语解释⚠️注意以下术语是理解本章内容的基础请务必掌握。术语1核心概念这是理解VRRP配置实操双路由器冗余实现网关故障自动切换的关键。在网络通信中我们需要深入理解其工作原理和实现细节。术语2技术指标在评估网络性能时我们通常关注以下指标带宽网络传输的最大数据速率延迟数据从源到目的地的传输时间吞吐量实际的数据传输速率丢包率数据包丢失的比例2.3 与相关概念的关系技巧理解概念之间的关系有助于建立完整的知识体系。概念定义与本章主题的关系OSI模型网络通信的分层模型是理论基础TCP/IP实际使用的协议族是核心实现网络设备实现网络功能的硬件是物理载体三、技术原理深入3.1 核心工作原理技术深度本节将深入探讨技术实现细节。VRRP配置实操双路由器冗余实现网关故障自动切换的核心实现涉及以下关键技术技术一基础原理┌─────────────────────────────────────────┐ │ 应用层 (Application) │ │ HTTP/FTP/SMTP/DNS │ ├─────────────────────────────────────────┤ │ 传输层 (Transport) │ │ TCP/UDP │ ├─────────────────────────────────────────┤ │ 网络层 (Network) │ │ IP/ICMP/ARP │ ├─────────────────────────────────────────┤ │ 数据链路层 (Data Link) │ │ Ethernet/WiFi │ ├─────────────────────────────────────────┤ │ 物理层 (Physical) │ │ 双绞线/光纤/无线信号 │ └─────────────────────────────────────────┘技术二工作流程 VRRP配置实操双路由器冗余实现网关故障自动切换 - 网络通信示例代码 演示基本的网络编程概念 importsocketimportstructfromtypingimportOptional,TupleclassNetworkDemo: 网络通信演示类 展示VRRP配置实操双路由器冗余实现网关故障自动切换的核心概念和实现方法 def__init__(self,host:str0.0.0.0,port:int8080): 初始化网络配置 Args: host: 主机地址 port: 端口号 self.hosthost self.portport self.socketNonedefcreate_tcp_server(self)-socket.socket: 创建TCP服务器 Returns: 服务器socket对象 # 创建TCP socketserver_socketsocket.socket(socket.AF_INET,# IPv4socket.SOCK_STREAM# TCP)# 设置地址复用server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# 绑定地址和端口server_socket.bind((self.host,self.port))# 开始监听server_socket.listen(5)print(fTCP服务器启动监听{self.host}:{self.port})returnserver_socketdefcreate_udp_socket(self)-socket.socket: 创建UDP socket Returns: UDP socket对象 udp_socketsocket.socket(socket.AF_INET,# IPv4socket.SOCK_DGRAM# UDP)udp_socket.bind((self.host,self.port))print(fUDP服务启动监听{self.host}:{self.port})returnudp_socketdefhandle_tcp_client(self,client_socket:socket.socket,client_address:Tuple[str,int]): 处理TCP客户端连接 Args: client_socket: 客户端socket client_address: 客户端地址 print(f客户端连接:{client_address})try:whileTrue:# 接收数据dataclient_socket.recv(1024)ifnotdata:breakprint(f收到数据:{data.decode()})# 发送响应responsef已收到:{data.decode()}client_socket.send(response.encode())exceptExceptionase:print(f处理客户端错误:{e})finally:client_socket.close()print(f客户端断开:{client_address})classIPUtils:IP地址工具类staticmethoddefip_to_int(ip:str)-int: IP地址转换为整数 Args: ip: IP地址字符串 Returns: 整数形式的IP地址 returnstruct.unpack(!I,socket.inet_aton(ip))[0]staticmethoddefint_to_ip(num:int)-str: 整数转换为IP地址 Args: num: 整数形式的IP地址 Returns: IP地址字符串 returnsocket.inet_ntoa(struct.pack(!I,num))staticmethoddefget_network_address(ip:str,mask:str)-str: 计算网络地址 Args: ip: IP地址 mask: 子网掩码 Returns: 网络地址 ip_intIPUtils.ip_to_int(ip)mask_intIPUtils.ip_to_int(mask)network_intip_intmask_intreturnIPUtils.int_to_ip(network_int)staticmethoddefget_broadcast_address(ip:str,mask:str)-str: 计算广播地址 Args: ip: IP地址 mask: 子网掩码 Returns: 广播地址 ip_intIPUtils.ip_to_int(ip)mask_intIPUtils.ip_to_int(mask)network_intip_intmask_int# 主机位全1host_bits~mask_int0xFFFFFFFFbroadcast_intnetwork_int|host_bitsreturnIPUtils.int_to_ip(broadcast_int)classSubnetCalculator:子网计算器staticmethoddefcalculate_subnet(ip:str,prefix:int)-dict: 计算子网信息 Args: ip: IP地址 prefix: 前缀长度 Returns: 子网信息字典 # 计算子网掩码mask_int(0xFFFFFFFF(32-prefix))0xFFFFFFFFmaskIPUtils.int_to_ip(mask_int)# 计算网络地址networkIPUtils.get_network_address(ip,mask)# 计算广播地址broadcastIPUtils.get_broadcast_address(ip,mask)# 计算主机数量host_count(1(32-prefix))-2# 计算可用主机范围network_intIPUtils.ip_to_int(network)first_hostIPUtils.int_to_ip(network_int1)last_hostIPUtils.int_to_ip(IPUtils.ip_to_int(broadcast)-1)return{ip_address:ip,subnet_mask:mask,prefix:prefix,network_address:network,broadcast_address:broadcast,first_host:first_host,last_host:last_host,host_count:host_count}# 使用示例if__name____main__:# 子网计算示例calcSubnetCalculator()resultcalc.calculate_subnet(192.168.1.100,24)print( 子网计算结果 )forkey,valueinresult.items():print(f{key}:{value})3.2 协议分析协议详解 网络协议分析工具 解析常见网络协议的数据包 importstructfromtypingimportDict,AnyclassPacketAnalyzer:数据包分析器staticmethoddefparse_ethernet_header(data:bytes)-Dict[str,Any]: 解析以太网帧头 Args: data: 原始数据 Returns: 解析结果 iflen(data)14:return{error:数据长度不足}# 解析目的MAC、源MAC、类型dst_macdata[0:6].hex(:)src_macdata[6:12].hex(:)eth_typestruct.unpack(!H,data[12:14])[0]return{dst_mac:dst_mac,src_mac:src_mac,ethertype:hex(eth_type),payload:data[14:]}staticmethoddefparse_ip_header(data:bytes)-Dict[str,Any]: 解析IP头部 Args: data: IP数据包 Returns: 解析结果 iflen(data)20:return{error:数据长度不足}# 解析IP头部各字段version_ihldata[0]versionversion_ihl4ihl(version_ihl0x0F)*4tosdata[1]total_lengthstruct.unpack(!H,data[2:4])[0]identificationstruct.unpack(!H,data[4:6])[0]flags_fragmentstruct.unpack(!H,data[6:8])[0]ttldata[8]protocoldata[9]checksumstruct.unpack(!H,data[10:12])[0]src_ip..join(str(b)forbindata[12:16])dst_ip..join(str(b)forbindata[16:20])return{version:version,header_length:ihl,tos:tos,total_length:total_length,identification:identification,flags_fragment:flags_fragment,ttl:ttl,protocol:protocol,checksum:checksum,src_ip:src_ip,dst_ip:dst_ip,payload:data[ihl:]}staticmethoddefparse_tcp_header(data:bytes)-Dict[str,Any]: 解析TCP头部 Args: data: TCP数据段 Returns: 解析结果 iflen(data)20:return{error:数据长度不足}src_portstruct.unpack(!H,data[0:2])[0]dst_portstruct.unpack(!H,data[2:4])[0]seq_numstruct.unpack(!I,data[4:8])[0]ack_numstruct.unpack(!I,data[8:12])[0]data_offset(data[12]4)*4flagsdata[13]windowstruct.unpack(!H,data[14:16])[0]checksumstruct.unpack(!H,data[16:18])[0]urgentstruct.unpack(!H,data[18:20])[0]# 解析标志位flag_names[FIN,SYN,RST,PSH,ACK,URG]active_flags[]fori,nameinenumerate(flag_names):ifflags(1i):active_flags.append(name)return{src_port:src_port,dst_port:dst_port,seq_num:seq_num,ack_num:ack_num,header_length:data_offset,flags:active_flags,window:window,checksum:checksum,urgent:urgent,payload:data[data_offset:]}# 使用示例if__name____main__:analyzerPacketAnalyzer()# 模拟解析IP头部print( 协议分析示例 )# 这里可以传入实际抓包的数据进行分析3.3 配置与管理配置方法# 网络配置常用命令# 1. 查看网络接口ipaddr showifconfig# 2. 配置IP地址ipaddradd192.168.1.100/24 dev eth0ifconfigeth0192.168.1.100 netmask255.255.255.0# 3. 配置默认网关iprouteadddefault via192.168.1.1 routeadddefault gw192.168.1.1# 4. 配置DNSechonameserver 8.8.8.8/etc/resolv.conf# 5. 查看路由表iproute show route-n# 6. 查看网络连接netstat-tulnss-tuln# 7. 网络连通性测试ping-c48.8.8.8traceroute8.8.8.8# 8. 查看ARP缓存arp-aipneigh show四、实践应用指南4.1 应用场景分析✅核心场景以下是VRRP配置实操双路由器冗余实现网关故障自动切换的主要应用场景。场景一网络故障排查故障类型排查方法常用工具物理连接检查网线、端口状态网线测试仪IP配置检查IP、掩码、网关ipconfig/ifconfigDNS解析测试域名解析nslookup/dig路由问题检查路由表traceroute场景二网络性能优化带宽优化流量整形、负载均衡延迟优化CDN加速、就近接入可靠性优化冗余链路、故障切换4.2 实施步骤详解操作指南以下是完整的实施步骤。步骤一需求分析在开始之前需要明确① 网络规模多大② 用户数量多少③ 业务需求是什么④ 预算范围如何步骤二方案设计## 网络设计方案模板 ### 1. 项目概述 - 项目背景 - 建设目标 - 预期效果 ### 2. 需求分析 - 用户需求 - 业务需求 - 技术需求 ### 3. 网络设计 - 拓扑结构 - IP规划 - 设备选型 ### 4. 实施计划 - 阶段划分 - 时间安排 - 资源配置 ### 5. 运维保障 - 监控方案 - 备份策略 - 应急预案步骤三设备配置设备类型配置要点常用命令交换机VLAN、端口配置vlan, interface路由器路由、NAT配置ip route, nat防火墙安全策略配置access-list, policy4.3 最佳实践分享经验总结最佳实践一网络规划① 合理规划IP地址② 设计冗余链路③ 预留扩展空间④ 文档规范管理最佳实践二故障处理先排查物理层逐层向上定位善用抓包分析记录处理过程五、案例分析5.1 成功案例案例一企业网络升级背景介绍某企业原有网络设备老旧经常出现网络故障影响业务运行。解决方案## 网络升级方案 ### 1. 问题分析 - 设备老化性能不足 - 缺乏冗余单点故障 - 安全防护薄弱 ### 2. 升级方案 - 更换核心交换机 - 部署双链路冗余 - 增加防火墙设备 ### 3. 实施效果 | 指标 | 升级前 | 升级后 | |------|--------|--------| | 网络可用性 | 95% | 99.9% | | 故障恢复时间 | 2小时 | 5分钟 | | 安全事件 | 10次/月 | 0次/月 |5.2 失败教训❌案例二网络规划不当问题分析某项目网络规划不合理导致① IP地址冲突频繁② 网络广播风暴③ 性能严重下降经验教训⚠️警示合理划分子网控制广播域范围定期检查网络状态六、常见问题解答6.1 技术问题Q1如何选择网络设备建议场景推荐设备关键指标小型网络普通交换机端口数量中型网络三层交换机背板带宽大型网络核心交换机转发性能Q2如何排查网络故障## 网络故障排查流程 1. 物理层检查 - 网线连接 - 设备电源 - 端口状态 2. 数据链路层检查 - MAC地址学习 - VLAN配置 - 端口状态 3. 网络层检查 - IP配置 - 路由表 - ARP缓存 4. 传输层检查 - 端口状态 - 连接状态 - 防火墙规则 5. 应用层检查 - 服务状态 - 应用配置 - 日志分析6.2 应用问题Q3如何提升网络性能优化策略① 升级带宽② 优化路由③ 部署缓存④ 流量整形Q4如何保障网络安全⚠️安全要点部署防火墙及时更新补丁定期安全审计员工安全培训七、未来发展趋势7.1 技术趋势发展方向趋势描述预计时间SDN软件定义网络已实现5G/6G移动通信演进持续推进物联网万物互联快速发展边缘计算就近处理主流趋势7.2 应用趋势✅核心判断未来3-5年网络技术将在以下领域产生深远影响①工业互联网智能制造、远程控制②智慧城市城市感知、智能管理③远程办公视频会议、协同工作④在线教育直播课堂、互动教学7.3 职业发展职业建议阶段学习重点时间投入入门期基础概念、简单配置2-3个月进阶期协议原理、故障排查3-6个月专业期架构设计、性能优化6-12个月专家期创新研究、团队领导1年以上八、本章小结8.1 核心要点回顾✅本章核心内容①概念理解明确了VRRP配置实操双路由器冗余实现网关故障自动切换的基本定义和核心概念②技术原理深入探讨了工作原理和实现方法③代码实现提供了完整的示例代码④实践应用分享了实战案例和最佳实践⑤问题解答解答了常见的技术和应用问题⑥趋势展望分析了未来发展方向8.2 学习建议给读者的建议① 理论与实践结合在理解原理的基础上动手实验② 循序渐进从简单概念开始逐步深入③ 持续学习技术发展迅速保持学习热情④ 交流分享加入社区与同行交流8.3 下一章预告下一章将继续探讨相关主题帮助读者建立完整的知识体系。建议读者在掌握本章内容后继续深入学习后续章节。九、课后练习练习一概念理解请用自己的话解释VRRP配置实操双路由器冗余实现网关故障自动切换的核心概念并举例说明其应用场景。练习二实践操作根据本章内容尝试完成以下任务① 配置基本的网络参数② 测试网络连通性③ 分析网络数据包练习三案例分析选择一个你熟悉的场景分析如何应用本章所学知识解决实际问题。十、参考资料10.1 推荐阅读经典教材《计算机网络》- 谢希仁《TCP/IP详解》- W. Richard Stevens《计算机网络自顶向下方法》在线资源Cisco官方文档华为技术支持RFC文档10.2 学习工具模拟工具GNS3: https://www.gns3.comPacket TracerWireshark10.3 社区交流社区推荐CSDN网络技术版块知乎网络话题技术论坛 本章系统讲解了VRRP配置实操双路由器冗余实现网关故障自动切换希望读者能够学以致用在实践中不断深化理解。如有疑问欢迎在评论区交流讨论。

相关新闻

Vue+SpringBoot音乐网站全栈开发实战指南

Vue+SpringBoot音乐网站全栈开发实战指南

1. 项目概述:基于VueSpringBoot的音乐网站全栈开发 这个毕业设计项目采用前后端分离架构,前端使用Vue.js框架构建用户界面,后端采用SpringBoot提供RESTful API服务,实现了一个功能完整的音乐网站系统。系统核心功能包括音乐播放、…

2026/10/13 8:43:14 阅读更多 →
逆向工程实战:从QQ本地数据库解密学习软件安全分析

逆向工程实战:从QQ本地数据库解密学习软件安全分析

1. 项目概述:从“黑盒”到“白盒”的探索逆向工程,听起来像是电影里黑客的专属技能,其实它更像是一把精密的“数字手术刀”。当我们面对一个功能强大但内部封闭的软件系统时,比如我们每天都在使用的QQ,其聊天记录、好友…

2026/10/13 8:42:29 阅读更多 →
36款Cherry MX键帽3D模型:零基础打造你的专属机械键盘

36款Cherry MX键帽3D模型:零基础打造你的专属机械键盘

36款Cherry MX键帽3D模型:零基础打造你的专属机械键盘 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 还记得那个让你心动的机械键盘吗?当清脆的敲击声在指尖…

2026/10/4 14:33:37 阅读更多 →

最新新闻

LiteLLM模型网关实践:统一多模型接入与成本管控

LiteLLM模型网关实践:统一多模型接入与成本管控

最近大半年,我一直在琢磨怎么把团队里五花八门的模型调用方式收敛到一个统一的入口。同事有的用某平台的原生 SDK,有的直接封装 HTTP 请求,有的又绕了一层别的工具,光是“换个模型就改一套代码”这事,就已经耗费了大量…

2026/10/13 8:43:01 阅读更多 →
agent-skills:智能体技能治理的注册、路由与观测实战

agent-skills:智能体技能治理的注册、路由与观测实战

大概三个月前,我所在的某项目组正被一堆混乱的智能体技能调用逼得发疯。也正是那次经历,让我决定动手做一套名为 agent-skills 的技能治理系统。当时项目的现状是:一部分工具逻辑硬编码在对话流程里,一部分挂在外部的消息总线上&a…

2026/10/13 8:43:01 阅读更多 →
opencode进阶实战:工具调用、服务面与MCP集成指南

opencode进阶实战:工具调用、服务面与MCP集成指南

1. 工具、服务面、外壳与实战集成:opencode 的进阶打开方式如果上一篇文章是在讲 opencode 的“发动机”——核心模型调度与上下文工程——那么这篇就是聊“方向盘、仪表盘和车厢布局”:怎么把工具(Tools)、服务面(Ser…

2026/10/13 8:43:01 阅读更多 →
AI 编程助手遇 403:故障定位与降级自救指南

AI 编程助手遇 403:故障定位与降级自救指南

最近不少用 AI 编程助手的同学应该都慌了一下:早上还跑得好好的 Cursor,突然开始刷屏报 403,再看一眼,连着 Claude 那几条接口全挂,项目写到一半直接卡死。这种时候最磨人的还不是报错本身,而是你根本分不清…

2026/10/13 8:43:01 阅读更多 →
数据库期末复习指南:ER图转关系模式、SQL查询与范式分解全攻略

数据库期末复习指南:ER图转关系模式、SQL查询与范式分解全攻略

简介:这是一份面向华南师范大学及其他高校学生的《数据库》期末复习知识点汇总PDF,适合考前系统梳理数据库核心概念与关系运算。内容涵盖数据库三级模式与两级映像、数据独立性、数据库系统组成,以及DDL/DML/DCL语言的功能界定;在…

2026/10/13 8:43:01 阅读更多 →
花店管理系统数据库课程设计:从需求分析到SQL实现全流程解析

花店管理系统数据库课程设计:从需求分析到SQL实现全流程解析

简介:数据库课程设计(花店管理系统)是一份完整的数据库课程设计报告,面向计算机相关专业学生,适用于数据库原理与实践类课程的结业设计参考。报告以花店管理系统为案例,详细展示系统规划、用户需求分析、功能结构设计、数据库概念…

2026/10/13 8:41:59 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →