STP笔记总结

STP --- 生成树协议

STP(Spanning Tree Protocol,生成树协议)是根据 IEEE802.1D标准建立的,用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路,并有选择地对某些端口进行阻塞,以最终实现将环路网络结构修剪成无环路的树型网络结构,从而防止报文在环路网络中不断增生和无限循环,避免设备由于重复接收相同的报文所造成的报文处理能力下降的问题发生。

冗余链路产生的问题

  • 广播风暴导致网络不可用;

    • 如果HostA发出广播请求,交换机S1和S2的端口port1都将收到这个广播报文,然后从所有其他同网段的端口(如 port2)广播出去,这时对端交换机与之相连的端口又收到相同的广播报文,这台交换机再从它的其他端口(如 port1)转发出去,对端交换机又会收到相同的广播报文,如此反复,最终导致整个网络资源被耗尽,网络瘫痪不可用。

  • MAC地址表的翻摆:MAC地址表震荡导致MAC地址表项被破坏;

    • 假设图所示的网络中没有广播风暴,HostA发送一个单播报文给HostB,如果此时HostB临时从网络中移去,那么交换机上有关HostB的MAC地址表项也将被删除。此时HostA发给HostB的单播报文,将被交换机S1和S2上的端口port1接收,由于S1上没有相应的MAC地址转发表项了,因此该单播报文将被同时泛洪转发到其他端口(如port2)上,交换机S2的端口port2在收到从对端port2端口发来的单播报文后,然后又以泛洪方式从其他端口(如 port1)发出去,使交换机 S1 的 port1 端口又会收到这个单播报文。如此反复,在两台交换机上,由于不间断地从端口 port2、port1 收到主机A 发来的单播文,交换机会不停地修改自己的MAC地址表项,从而引起了MAC地址表的抖动。如此下去,最终导致MAC地址表项被破坏。

  • 多重复数据帧。

    • 假设图所示的网络中没有广播风暴,HostA发送一个报文给HostB。S1和S2同时接收到报文,两个都要发送给HostB,这样HostB接收到两个相同的报文,消耗了链路资源。

生成树协议原理:在二层交换网络中,逻辑的阻塞部分接口,实现从根节点到所有节点唯一的路径的生成,成为一个没有环路的拓扑。当最佳路径数显故障时,个别被阻塞的接口将被打开,形成备份链路。

802.1D生成树

802.1D ---- 由IEEE组成颁布的公有协议 ---- 标准的STP协议

RSTP --- 802.1W

MSTP --- 802.1S

STP基本概念

  • 桥ID

    • 每一台运行STP协议的交换机都拥有的唯一的BID

    • 桥ID一共8字节,包含16bit的桥优先级和48bit的桥MAC地址,其中桥优先级占据桥ID的高16bit位。

  • 根桥(RootBridge)

    • 根桥是整个网络的逻辑中心,但不一定是物理中心,且会根据网络拓扑的变化而动态变化。一般是需要将环路中所有交换机当中性能最好的一台设置为根桥交换机,以保证能够提供最好的网络性能和可靠性。网络收敛后,根桥会按照一定的时间间隔产生并向外发送配置BPDU,其他设备仅对该报文进行转发,传达拓扑变化记录,从而保证拓扑的稳定。

    • 对于一个运行STP协议的网络,根桥在全网中只有一个,就像一棵树只有一个树根一样,那就是网络中具有最小桥ID(BID)的桥。网络中除根桥外的其他桥统称为非根桥。

    • 缺省情况下,桥优先级为32768。 --- 可以修改,但是修改范围为0-61440,且必须是4096的倍数。

  • 开销cost与根路径开销RPC

    • 每一个激活了STP的接口都维护着一个cost值,接口的cost主要用于计算RPC,也就是计算到达根的开销

    • 在一个运行STP协议的交换网络中,某端口到根桥累计的路径开销就是所经过的各个桥上的各端口的路径开销累加值,这个值叫做根路径开销(Root Path Cost)。根桥上所有端口的根路径开销,以及同交换机上不同端口间的路径开销值均为零。

    • 默认使用IEEE802.1T标准

  • 接口ID --- PID

    • 每一个运行了STP协议的交换机的接口会存在一个PID值,来标识该接口信息。

    • 接口ID长度是16bit,高4bit是接口优先级,低12bit是接口编号

    • 接口优先级默认为128,可以修改,取值范围0-240,必须为16的倍数

STP报文 --- BPDU

STP协议采用的是BPDU(Bridge Protocol Data Unit,桥协议数据单元)类型报文,也称为配置消息。STP就是通过在设备之间传递BPDU来确定最终修剪完成的网络拓扑结构。

  • 配置BPDU:用来进行生成树计算和维护生成树拓扑的报文,是初始阶段中各交换机发送的BPDU消息。

  • TCN BPDU:当拓扑结构发生变化时,下游设备用来通知上游设备网络拓扑结构发生变化的报文。它是当拓扑稳定后,网络中出现了链路故障,网络拓扑发生改变时所发送的BPDU消息。

BPDU载荷被直接封装在以太网数据帧中,数据帧的目的MAC地址是组播MAC地址:0180-c200-0000

配置BPDU报文

  • 在交换网络初始化过程中,每台交换机都从自己激活了STP的接口向外发送配置BPDU。

  • 当STP收敛完成后,只有根网桥才会周期性发送配置BPDU,缺省为2秒。非根网桥会在自己接收到根网桥发送的配置BPDU以后,使用触发更新方式,将自己的配置BPDU发送出去。

  • 配置BPDU的长度至少要35个字节,包含了桥ID、路径开销和端口ID等参数

  • 只有当“发送者BID”或“发送端口PID”两个字段中至少有一个和本桥接收端口不同,所收到的这个BPDU报文才会被处理,否则丢弃。这样避免了处理和本端口信息一致的BPDU报文。

  • 协议版本 --- PVI

    • stp ·········> 0;

    • rstp ·········> 2;

    • mstp ·········> 3

  • 标志字段 ---STP仅仅使用了最高位(TCA---拓扑变 更确认标记)和最低位(TC--->拓扑变更标记)

  • 消息寿命

    • 与TTL值相同,但是为设备数量,代表BPDU从发出到现在经过的时间。

    • 初始值为0,没经过一台交换机,数值加1。

    • Max Hop参数----最大消息寿命,默认值为20

  • 生存时间

    • 缺省20秒

TCN BPDU报文

该报文用于在网络拓扑发生变化时,向根桥通知变化的发生。该报文是为了修改全网交换机的MAC地址表信息而存在的,而非是为了改变STP的生成树结构。

  1. 本地交换链路发生故障后,STP将重新收敛,为了加快刷新全网交换机的MAC地址表,故障交换机会向本地其余运行了STP的接口发送TCN BPDU报文

  2. 邻居交换机收到TCN BPDU报文后,将回复一个TCA标记为1的配置BPDU报文,用于可靠性传输。

    1. 该过程会一直持续到根网桥接收到TCN BPDU报文。

    2. 注意:非根网桥不能主动发送配置BPDU,故需要等待接收到根网桥的BPDU后,将TCA标记位置为1,转发给故障设备。

  3. 之后该TCN BPDU会一直转发到根网桥处,由根网桥下发TC标记位为1的配置BPDU(只有根可以设置该标记位),逐级下发给所有交换机。

  4. 所有交换机在收到TC标记位为1的配置BPDU后,会立即将MAC地址表的老化时间临时性修改为15秒(转发延迟),使得MAC地址表能够提前刷新。

STP的角色选举

  • 根桥选举 --- RB <········ 交换机角色

    • 选举范围:整个交换网络

    • 一个交换网络有且只有一个根网桥

    • 选择最小BID ---- 在进行BID比较时,先比较桥优先级,优先级值小的为根桥;当桥优先级值相等时,再比较桥MAC地址,MAC地址小的为根桥。

    • 根网桥是具有可抢占性的。

  • 根接口 <········ 接口角色

    • 选举范围:每一个非根网桥设备上,有且只有一个跟接口。

    • 所谓根接口 ---- 是非根网桥上所有接口中收到最优BPDU报文的接口。

  • 指定接口 <········ 接口角色

    • 选举范围:两台交换机之间的物理链路上选举一个指定接口。有且只有一个。

    • 该接口是该物理链路内达到网桥最优的接口,也就是接收到最优的BPDU报文的接口。

    • 对于非根桥而言,其所有接口中收到最优BPDU的接口将成为该设备的跟接口,随后,该非根桥使用自己接收到的最优BPDU,为本设备上的其他接口各自计算一个BPDU报文。

      • 然后使用计算出的BPDU报文与该接口上所接收到的BPDU报文进行对比,最优的BPDU报文,那么该BPDU所在的接口为指定接口

    • 一般而言,根网桥的所有接口都是指定接口;在存在跟接口的链路上,对端必然是指定接口

  • 非指定接口

    • 所有的不是跟端口和指定端口都被称为非指定端口。而**非指定端口会被交换机进行

    • 被阻塞的接口既不会接收也不会转发业务数据,且该接口不会发送BPDU报文,但是可以接收BPDU报文。

最优BPDU的比较原则
  1. 选择具有最小桥ID的BPDU。

    • 这一步,实际上是在选举根网桥。通过对比BID参数。

  2. 比较入向BPDU的RPC数值,选择最小的接口作为最优BPDU报文

  3. 如果交换机接收到的多个BPDU报文的RPC相同,则比较对端设备的BID,选择具有较小BID参数的设备所对应的接口作为最优BPDU报文

  4. 如果存在对端设备的BID相同,则比较对端的PID值,选择较小的PID所在接口的对应接口作为最优BPDU报文

  5. 若对端PID相同,则比较本端接收到BPDU报文的接口的PID值,选择较小的作为最优BPDU报文

STP工作过程

  1. STP交换机初始化启动后,都会认为自己是根网桥,并在发送给其他交换机的配置BPDU中宣告自己为根桥。因此,此时的BPDU中的根桥ID为各自设备的网桥ID数值。

    1. 当交换机收到网络中其他设备发来的BPDU后,会对比BPDU报文中的根桥ID字段和自己的BID。

    2. 交换机不断交互BPDU报文,同时对BID进行对比,最终选举一台BID最小的交换机作为根网桥,其他为非根网桥。

    3. 根网桥的角色是可抢占的

  2. 选举完根网桥后,根网桥仍然会持续性发送配置BPDU报文,起到保活的效果。而其他非根网桥将持续不断的收到根网桥发送的BPDU,并计算自己的BPDU报文从其他指定端口发送出去。

  3. 每个交换机根据从自己不同接口收到的BPDU报文中选择出最优的BPDU,从而选举根端口。

    1. RPC

    2. 比较对端BID

    3. 比较对端PID

    4. 比较本地PID

  4. 每台交换机的每一条链路选举指定端口

    1. RPC

    2. BID

    3. 链路两端的PID

  5. 在确定了根端口和指定端口之后,交换机上所有剩余的端口都被称为非指定端口。并且会在逻辑上阻塞所有的非指定端口。

    1. 当非指定端口被阻塞后,生成STP树。

    2. 被阻塞的接口既不会接收也不会转发业务数据,且该接口不会发送BPDU报文,但是可以接收BPDU报文。

在交换网络中,一般将网关所在地、流量汇聚地点以及STP根网桥三点合并在一起

STP的接口状态

  • 禁用状态(Disable)

    • 此时端口不仅不能转发 BPDU 报文,也不能转发用户流量。端口状态为Down。

    • 接口禁用生成树协议。

  • 阻塞接口(Blocking)

    • 是生成树协议激活后进入的第一个状态。

    • 该状态会停留一个最大老化时间(20秒)。然后进入到下一个状态。

    • 此时端口仅可接收并处理BPDU,不转发用户流量。

  • 侦听状态(Listening)

    • 可以收发BPDU报文。进行STP角色选举过程。

    • 该状态会选举出根网桥、根接口、指定接口和非指定接口。

    • 停留一个转发延迟时间(15秒)后,进入下一个状态。这也是一种过渡状态。

    • 只有根端口和指定端口会进入到学习状态,而非指定端口会退回到阻塞状态

  • 学习状态(Learning)

    • 接收业务流量,并学习MAC地址信息,但不转发用户流量。----目的:为了减少单播帧的洪泛。

    • 停留一个转发延迟时间(15秒)后,进入下一个状态。

    • 这是一种过渡状态,增加Learning状态为防止临时二层环路。

  • 转发状态(Forwarding)

    • 可以正常接收和转发业务数据和BPDU报文。

    • 只有根端口和指定端口可以进入该状态。

状态迁移过程

①:端口从禁止状态开始初始化或者使能后首先进入阻塞状态。

②:在端口突然被禁用或者链路失效时将从当前其他所有状态下直接进入到禁用状态。

③:在端口被选举为根端口或指定端口后,由阻塞状态进入到监听状态。

④:在端口不再是根端口或指定端口时,会从当前其他状态直接进入阻塞状态。

⑤:当新选出的根端口和指定端口要经过两倍的转发延时(即从监听状态进入学习状态,再从学习状态进入转发状态)后才能进入转发状态,以确保新的配置消息传遍整个网络,防止临时环路的产生。

STP的收敛时间

基于计时器进行收敛。

  • 首次收敛 --- 50s(阻塞20s + 2 * 转发延迟)

  • 根桥故障 --- 50s(最大寿命 + 2 * 转发延迟)

  • 直连链路故障 --- 30s( 2 * 转发延迟)

  • 非直连链路故障 --- 50s(最大寿命 + 2 * 转发延迟)

STP的定时器

  1. Hello Time(Hello定时器)

    • Hello定时器是指运行STP协议的设备发送配置BPDU的时间间隔,即设备会每隔Hello Time时间向周围的设备发送配置消息BPDU,以确认链路是否存在故障。

    • 默认为2s。

    • 当网络拓扑稳定之后,该定时器的修改只有在根桥修改后才有效。新的根桥会在发出的BPDU报文中填充适当的字段以向其他非根桥传递该定时器修改的信息。

    • 当拓扑变化之后,TCN BPDU的发送不受这个定时器的管理。

  2. Forward Delay(转发延时)

    • 转发延时是设备进行状态迁移的延迟时间,是指一个端口处于Listening和Learning状态的各自持续时间,缺省是15s。即Listening状态持续15s,随后进入Learning状态,然后再持续15s。

    • 链路故障会引发网络重新进行生成树的计算,生成树的结构将发生相应的变化。 但是重新计算得到的新配置消息不可能立即传遍整个网络,如果此时新选出的根端口和指定端口就立即开始数据转发的话很可能会造成临时的二层环路。为此,STP 采用了一种状态迁移机制,新选出的根端口和指定端口要经过两倍的 Forward Delay延时后才能进入转发状态,这个延时保证了新的配置消息传遍整个网络,从而防止了临时环路的产生。

  3. Max Age(最大生存时间)

    • 最大生存时间是指端口的BPDU报文的老化时间。

    • 运行 STP协议的网络中非根桥设备收到配置BPDU报文后,会对报文中的Message Age(消息生存时间)和Max Age进行比较:如果Message Age小于等于Max Age,则该非根桥设备继续转发配置BPDU报文;如果Message Age大于Max Age,则该配置BPDU报文将被老化。该非根桥设备直接丢弃该配置 BPDU,可认为网络直径过大,导致根桥连接失败。

    • 当配置 BPDU从根桥发出时报文中的Message Age值为 0。配置BPDU报文每经过一个桥,Message Age增加 1。

STP的配置

[sw1]stp enable   ---启动STP协议,华为默认开启该协议
[sw1]stp mode stp  ---修改STP的工作模式,默认工作模式为MSTP
​
[sw1]stp root primary   ---将交换机设定为根网桥,其本质是将优先级修改为0
[sw2]stp root secondary  ---将交换机设定为备份根网桥,其本质是将优先级修改为4096
[sw3]stp priority 8192  ---将交换机优先级设定为8192
​
[sw6-GigabitEthernet0/0/1]stp port priority ? ---修改接口优先级,干涉PID数值
  INTEGER<0-240>  Port priority, in steps of 16
  
 
[sw6]stp pathcost-standard ?  ----修改本地开销值计算方法类型,全网均需要修改
  dot1d-1998  IEEE 802.1D-1998
  dot1t       IEEE 802.1T
  legacy      Legacy
  
​
[sw6-GigabitEthernet0/0/1]stp cost ?  ----直接修改接口cost值
  INTEGER<1-200000000>  Port path cost  ---该参数可以修改的范围是根据开销值计算类型而定
​
[sw1]display stp   ---查看STP协议运行状况
[sw1]display stp brief  ---查看STP接口状态

  • DESI ········> 指定接口

  • ROOT ········> 根端口

  • ALTE ········> 备份端口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/248351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytest + yaml 框架 -60.git+jenkins+allure+钉钉通知反馈

前言 当我们自动化用例写完后&#xff0c;接下来就是如何运行用例&#xff0c;生成报告以及反馈通知了。 如果你们公司已经有jenkins了&#xff0c;那么直接集成到jenkins上构建你的自动化任务是非常方便的。 用例上传git仓库 第一步&#xff0c;将写好的自动化用例&#xf…

IDEA设置查看JDK源码

问题 我们在查看JDK源码时&#xff0c;可能会遇到这种情况&#xff0c;步入底层查看JDK源码时&#xff0c;出现一堆var变量&#xff0c;可读性非常之差&#xff0c;例如笔者最近想看到nio包下的SocketChannelImpl的write方法&#xff0c;结果看到这样一番景象&#xff1a; pu…

3小时快速入门自动化测试 —— Selenium测试工具

自动化测试 自动化测试简单来说就是利用自动化测试工具和自动化测试脚本来完成指定的测试任务&#xff0c;测试启动过程无需人工参与&#xff0c;但自动化测试之前的准备工作需要人工手动配置好。它是一种将重复性、繁琐的测试任务交给计算机自动执行的方法&#xff0c;能够显…

多条件三元表达式如何写?

在某些业务需求情况下&#xff0c;如何书写多条件三元表达式&#xff1f;&#xff08;例如&#xff0c;父组件传值给子组件&#xff0c;子组件根据不同的值去响应不同的颜色变化该如何实现&#xff1f;&#xff09; 父组件&#xff1a; 父组件传testData的值给子组件&#xff…

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题 Idea 在升级了2023.3以后&#xff0c;Jrebel 无法以 debug 的模式启动&#xff0c;找了半天&#xff0c;最后在插件主页的评论区找到了解决方案 特此记录一下

Springboot+vue的公寓报修管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的公寓报修管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的公寓报修管理系统&#xff0c;采用M&#xff08;model&…

HarmonyOS使用HTTP访问网络

HTTP数据请求 1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种…

Android 12.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在12.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

Gartner发布2024年网络安全预测一:人工智能与网络安全将颠覆转化为机遇

Gartner 预测人工智能将以积极的方式持久地破坏网络安全&#xff0c;但也会造成许多短期的幻灭。安全和风险管理领导者需要接受 2023 年只是生成式 AI 的开始&#xff0c;并为其演变做好准备。 主要发现 生成式人工智能 (GenAI) 是一系列公认的颠覆性技术中的最新技术&#xff…

nodejs+vue+微信小程序+python+PHP全国天气可视化分析系统-计算机毕业设计推荐

3.2.1前台用户功能 前台用户可分为未注册用户需求和以注册用户需求。 未注册用户的功能如下&#xff1a; 注册账号&#xff1a;用户填写个人信息&#xff0c;并验证手机号码。 浏览天气资讯&#xff1a;用户可以浏览天气资讯信息详情。 已注册用户的功能如下&#xff1a; 登录&…

安装统信UOS服务器操作系统1060

原文链接&#xff1a;安装统信UOS服务器操作系统1060 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是如何安装统信UOS服务器操作系统1060。统信UOS是一款基于Linux内核&#xff0c;专为中国市场定制开发的操作系统。它不仅提供了良好的用户体验&#xff0c;还在…

MySQL事务与MVCC详解

前置概念之事务 在开始MVCC的讨论之前&#xff0c;我们必须了解一些关于事务的概念。 什么是事务 现在我们开发的一个功能需要进行操作多张表&#xff0c;假如我们遇到以下几种情况: 某个逻辑报错数据库连接中断某台服务器突然宕机… 这时候我们数据库执行的操作可能才到一…

黑马点评04集群下的并发安全

实战篇-08.优惠券秒杀-集群下的线程并发安全问题_哔哩哔哩_bilibili 为了应对高并发&#xff0c;需要把项目部署到多个机器构成集群&#xff0c;所以需要配置nginx。 1.如何模拟集群 通过idea的ctrl d修改配置&#xff0c;实现多个tomcat运行模拟集群 然后在nginx上配置节点&…

菜鸟学习日记(python)——函数

函数是组织好的&#xff0c;用来实现某些功能的代码块&#xff0c;它可以重复使用。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。Python提供了许多内建函数&#xff0c;比如print()。但我们也可以自己创建函数&#xff0c;这被叫做用户自定义函数。 定义函数 用…

可视化数据监控大屏网页界面,数据大屏模版PS资料(免费UI源文件)

数据大屏模板在大数据领域被广泛应用&#xff0c;其优势在于能够将复杂的数据通过图形、图表等方式呈现出来&#xff0c;使数据更易于理解。数据大屏模板可以用来进行数据分析。通过对数据的比较、趋势分析、异常检测等&#xff0c;可以发现数据中的规律和问题&#xff0c;为决…

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 数据库 文章目录 前言合并区间问题&#x1f4d5;现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

《Kotlin核心编程》笔记:面向对象

kotlin 中的类 // Kotlin中的一个类 class Bird {val weight: Double 500.0val color: String "blue"val age: Int 1fun fly() { } // 全局可见 }把上述代码反编译成Java的版本&#xff0c;然后分析它们具体的差异&#xff1a; public final class Bird {privat…

一种用于心音分类的轻量级1D-CNN+DWT网络

这是由National Institute of Technology Rourkela, Central University of Rajasthan发布在2022 ICETCI的论文&#xff0c;利用离散小波变换(DWT)得到的多分辨率域特征对1D-CNN模型进行心音分类训练。 预处理& DWT 由于FHS和各种病理声的频率范围在500hz以下[5]&#xff…

华为配置VRRP负载分担示例

组网需求 如图1所示&#xff0c;HostA和HostC通过Switch双归属到SwitchA和SwitchB。为减轻SwitchA上数据流量的承载压力&#xff0c;HostA以SwitchA为默认网关接入Internet&#xff0c;SwitchB作为备份网关&#xff1b;HostC以SwitchB为默认网关接入Internet&#xff0c;Switc…

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…
最新文章