IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 生成树协议STP、RSTP、MSTP原理是什么?三者有啥区别?一文带你了解! -> 正文阅读

[系统运维]生成树协议STP、RSTP、MSTP原理是什么?三者有啥区别?一文带你了解!

在组网中,很可能会出现环路或者称冗余链路,为避免形成广播风暴,需要一种方法来避免形成环路,并且在主链路故障中断时候,可以将冗余链路自动切换为转发状态,以恢复网络的连通性。生成树协议(STP、RSTP、MSTP)就可以实现这样的功能。

STP(802.1D,Spanning Tree Protocol,生成树协议)

基本思想

将网络的拓扑修剪为树形拓扑,拓扑图形状与一棵树相似,这样就不会产生环路了。

  1. 在每个运行STP协议的设备上依据一定的准则选举出一个树根节点作为网络中的根桥,其他节点为非树根节点。

  2. 每一个非树根节点,会选择最优的路径和根桥相连,每个非树根节点上位于最优路径的端口,为该非树根节点的根端口。

  3. 如果非树根节点存在冗余链路,则会对相应端口进行阻塞

基本概念介绍

  • 根桥(Root Bridge):是整个生成树的根节点,所有网桥中优先级最高的桥。

  • 指定桥(Designate Bridge):负责一个物理段(相对于两个网桥而言是一个物理段)上数据转发任务的桥。

  • 根端口(Root Port):指一个网桥上距离跟桥最近的端口。根桥上没有根端口,只有非根桥上有且仅有一个根端口。

  • 指定端口(Designate Port):指定桥上的端口,就是用于转发生成树信息报文的端口。根桥上全是指定端口。

  • 候补端口(Alternate Port):用来为根端口或指定端口做备份的端口,即为最终需要阻塞的端口。

  • 桥ID(Bridge ID):每一个运行STP协议的网桥都会有一个桥ID,用于在网络中唯一标识一个桥,由桥优先级和桥MAC地址组成,桥优先级占2字节,桥MAC地址占6个字节。桥优先级只能是4096的整数倍,最大为61440,默认为32768。

  • 路径开销(Path Cost):STP中每条链路都具有开销值,默认的开销值取决于链路的带宽,带宽越大,开销越小。例如IEEE标准的开销,链路速度为10Gbps开销为2,速度为100Mbps时开销为19,速度为10Mbps时候开销为100。

  • BPDU(Bridge Protocol Data Unit,桥协议数据单元):用于网桥之间传递BPDU来交互协议信息。BPDU分为配置BPDU和TCN BPDU。配置BPDU用来进行生成树的计算和维护生成树拓扑的报文。TCN BPDU是当拓扑结构改变时候,用来通知相关桥设备网络拓扑结构发生变化的报文。

BPDU报文分析

  • Protocol Identifier:固定为0x0000,表示是生成树协议

  • Protocol Version Identifier:协议版本号,STP版本号为0x00

  • BPDU Type:配置BPDU类型为0x00,TCN BPDU类型为0x80

  • Flags:由8位组成,最低位为TC标志位,最高位为TCA标志位,其他6位保留。当拓扑结构变化时候,下游网桥将会从根端口发送TCN BPDU报文,TC标志位置为1,上游网桥收到后进行相应处理,回复配置BPDU报文,TCA标志位置为1.

  • Root Identifier:根桥ID,包含优先级和MAC地址,标识网络中的根桥。

  • Root Path Cost:根路径开销,指从发送该配置BPDU的网桥到根网桥的最小路径开销,是所有链路开销的代数和。

  • Bridge Identifier:发送该配置BPDU的网桥ID,即该指定桥的ID。

  • Port Identifier:发送该配置BPDU的网桥的发送端口ID。

  • Message Age:从根桥生成配置BPDU开始,到当前时间为止配置BPDU的存活时间。

  • Max Age:配置BPDU存活的最大时间。

  • Hello Time:根桥生成并发送配置BPDU的周期,默认为2s

  • Forward Delay:配置BPDU传播到全网的最大时延,默认为15s

接口状态

状态名称

状态描述

禁用(Disable)

不能收发BPDU,也不能收发数据帧

阻塞(Blocking)

该接口被STP阻塞。不能发送BPDU,但是会持续侦听BPDU。不能收发数据帧

侦听(Listening)

表明STP初步认定该接口为根接口或指定接口,但STP还在计算过程中,可以收发BPDU,但不能收发数据帧,也不能进行MAC地址学习

学习(Learning)

会侦听业务数据帧,但不能转发数据帧,并可以学习MAC

转发(Forwarding)

正常收发数据帧,也会进行BPDU处理,只有根端口或指定端口才能进行转发态

当交换机的一个接口被激活后,该接口会从禁用状态自动进入阻塞状态。阻塞状态的接口如果被选举为根接口或者指定接口,那么它将从阻塞状态进入侦听状态,并在侦听状态停留15s(转发延迟时间),为了让STP完成整个网络的计算。15s后如果还是根接口或者是指定接口,就会进入学习状态,因为此时交换机没有学习到任何MAC地址,这个状态也要停留15秒,之后才会变成转发态。

计算过程

确定跟桥

每一个交换机启动stp服务,都会认为自己是跟桥,并向外发送以自己为根桥的配置BPDU报文。

交换机接收到BPDU报文,会和自己的桥ID对比,桥ID由优先级和mac地址组成,先比较优先级,优先级相同,再比较mac地址,值越小就会认为更优。比如接收到BPDU报文的root id为8192-0000.0000.0001,自己的桥id为32768-0000.0000.0002,因为先比较优先级,优先级8192优于32768,则认为自己不是根桥,就不发送认为自己是根桥的BPDU了,并通过接收到的BPDU报文更新自身的配置BPDU。直到网络中所有的交换机都达成一致,认为某一个交换机为根桥,根桥的选举结束,从而确认唯一根桥。

确定端口角色

当确认自己本身不是根桥的同时就开始确认端口角色了。

确定根端口

当一个交换机多个接口同时接收到了根桥发来的配置BPDU报文,会获取Root Path Cost,也就是根路径开销,与接收端口的链路开销相加,得到此端口到根桥的根路径开销,对比,根路径开销值最小的作为根端口。

如果根路径开销相同,对比BPDU报文中的Bridge Identifier,也就是发送该BPDU报文指定桥的ID,ID小的作为根端口。

如果指定桥ID也相同,则对比Port Identifier,发送口的端口ID,ID小的作为根端口

确定指定端口和Alternate备份端口

当确定根端口后,会将通过自己从根端口收到的BPDU报文计算生成的配置BPDU报文与非根端口接收到的配置BPDU进行比较,依次对比根路径开销、指定桥和端口id,自己计算产生的BPDU优于接收到的,则将此接收到的端口设置为指定端口,否则设置为Alternate端口(即阻塞起来)。

拓扑结构发生改变时

当有端口断开或新网桥加入时,拓扑发生了改变,就会使用到TCN BPDU报文,目的是让STP能快速的收敛。

产生BPDU报文的条件:

  1. 网桥上有端口转变为Forwarding转发状态,且该网桥至少包含一个指定端口。

  2. 网桥上有端口从Forwarding状态或Learning状态转变为Blocking状态。

拓扑改变时候STP处理步骤:

  1. 会从该发生变化的交换机的根端口发送TCN BPDU报文

  2. 上游交换机收到TCN BPDU报文,会将下一个配置BPDU报文中的TCA置为1,发送给下游交换机,来确保通往根桥的链路有效性

  3. 重复1,2步骤,直到根桥交换机收到TCN BPDU报文,并将下一个配置BPDU报文中的TC置为1,发送给下游所有的交换机,各网桥收到TC置为1的配置BPDU报文后,会将MAC地址老化时间缩短为15秒

STP的不足

为避免环路,每一个端口在确认为根端口或指定端口后仍需要等待30s才能进入转发状态。

对于网络中有大量主机时候,频繁上下线会导致频繁发送TCN BPDU报文,导致网桥MAC地址老化时间长期为15s。

RSTP(802.1W,Rapid Spanning Tree Protocol,快速生成树协议)

STP与RSTP区别概要

STP

RSTP

端口状态

禁用、阻塞、侦听、学习、转发

丢弃、学习、转发

端口角色

根端口、指定端口、备份端口(Alternate)

根端口、指定端口、根备份端口(Alternate)、指定端口备份端口(Backup)

BPDU

协议版本号为0x00

配置BPDU类型为0x00,TCN BPDU类型为0x80

协议版本号为0x02

类型为0x02

使用Flags字段的全部8位

最后增加了Versionl Length字段

STP与RSTP的接口状态对应关系

STP的接口状态

RSTP的接口状态

禁用(Disabled)

丢弃(Discarding)

阻塞(Blocking)

侦听(Listening)

学习(Learning)

学习(Learning)

转发(Forwarding)

转发(Forwarding)

RSTP端口会在Discarding状态完成角色的确定,当端口确定为根端口或指定端口后,经过Forward Delay时间会进入Learning状态,比STP就少一个Forward Delay时间,并且有P/A快速机制,可以直接从Discarding直接到Forwarding状态。不是根端口或指定端口就会维持Discarding状态。

端口角色

根端口和指定端口角色的定义和STP相同,就不说了。

较STP新增了两个端口概念,替代接口和备份接口。但同样都是阻塞起来的,只是为了指定端口出故障时可以快速收敛。

替代接口(Alternate)

可以理解为根接口的备份接口,是由于收到了其他设备发送的BPDU且优于自身所要发送的BPDU从而被阻塞的接口。当根端口进入阻塞状态时,会选择优先级最高的替代接口作为新的根端口。当对端端口是Forwarding状态,则可以立即进入转发状态。

备份接口(Backup)

一台设备上收到了自己所发送的BPDU从而被阻塞的接口。

如图,LSW2上的GE 0/0/3阻塞,因为是收到了LSW3的BPDU报文,形成了环路,且收到的BPDU报文比自己的优,从而阻塞,就变成了替代接口。而LSW2上的GE 0/0/5,因为收到的是自己发送过来的BPDU报文且端口id较大被阻塞,从而变成备份接口。

BPDU报文

与STP BPDU相比较

  1. Protocol Version Identifier为2

  2. BPDU Type为0x02,表示为RST BPDU

  3. BPDU flags使用全部的8位

  4. 在报文的最后增加了Versionl Length字段,值为0,表示本BPDU中不包含Versionl内容。

最高位和最低位TCA和TC与STP相同。Agreement(同意)及Proposal(提议)用于RSTP的P/A机制,会大大提高RSTP的收敛速度。Port Role(接口角色)两个bit位,01表示根接口,10表示替代接口,11表示指定接口,00保留。Forwarding(转发)和Learning(学习)用于表示该RST BPDU发送接口的接口状态。

RSTP与STP不同,在网络稳定后,STP的非根桥之会转发根桥发来的BPDU报文,而RSTP无论是非根桥还是根桥都会周期性的发送BPDU。

在STP中只有在指定端口收到低优先级的配置BPDU时才会立即回应(发送自己计算的配置BPDU报文),阻塞状态端口不会对低优先级的配置BPDU做出回应。

在RSTP中,指定端口或阻塞状态的端口收到低优先级的RST BPDU,也可以立即对其做出回应。

P/A快速收敛机制

当网络中增加新的链路或故障链路恢复时,链路两端必有一个端口的角色是指定端口,在STP中,该指定端口需要等待30s才能进入Forwarding状态。

P/A机制是指定端口可以通过与对端网桥进行一次握手,即可快速进入转发状态,无需任何定时器。

前提条件是必须是点到点的链路。

当新链路连接时候,链路两端的端口初始都为指定端口并处于阻塞的状态。

当指定端口处于Discarding和Learning状态时,所发送的BPDU中的Proposal位将被置为1,端口的角色位11,是指定端口。(都是指定端口发的哟)

收到Proposal置位的RST BPDU报文后,交换机会判断接收端口是否为根端口,如果是根端口,会进行同步过程,同步过程是阻塞除边缘端口(直接与用户终端相连,没有连接到其他交换机或者网桥,一般需要手动配置为边缘端口,可以忽略Forward Delay时间直接进入Forwarding状态,无时延)之外的所有端口,为了消除本交换机产生环路的可能。

完成同步过程后,根端口进入转发状态并从根端口回发Agreement置为1的RST BPDU报文,内容复制收到的Proposal置为的RST BPDU报文,唯一不同的就是Flags字段的Agreement也置为1。

收到Agreement置1的BPDU报文后,该接口会立即进入转发状态。

同步过程阻塞的接口也会继续往下进行这个过程。

如果指定端口发出Proposal置位的BPDU后没有收到Agreement BPDU报文,则该端口需要等待30s(两个延迟时间)才会进入转发状态。

拓扑改变处理

在STP中,端口变为Forwarding状态或从Forwarding变为Blocking状态均会触发拓扑改变处理过程,而RSTP只在非边缘端口转为Forwarding状态时才会触发处理过程。

当交换机由非边缘端口转变为Forwarding状态时,网桥会在两倍的Hello Time时间内向根端口以及指定端口发送TC置位为1的RST BPDU,同时清除这些端口学习到的MAC地址。

其他交换机收到TC置位的RST BPDU时候,会清除接收TC报文的端口以及边缘端口之外的其余端口MAC地址,并同样会在两倍的Hello Time时间内向根端口以及指定端口发送TC置位为1的RST BPDU报文。

交换机收到TC置位的RST BPDU后不需要在Max Age+Forward Delay时间内将MAC地址老化时间设置为Forward Delay,而是直接清除端口MAC地址,重新进行学习,从而实现更快的收敛。

注:本人使用华为模拟器,拓扑改变收到拓扑改变的报文,并没有立即清除端口mac,好像是一个Foreard Delay时间后才清除mac。

RSTP和STP的兼容

当运行RSTP的交换机连续3次接收到配置BPDU时候,认为改端口和STP相连,该端口将切换到STP协议运行。

MSTP(802.1S,Multiple Spanning Tree Protocol,多生成树协议)

基本思想

基于实例(Instance)计算出多棵生成树,每个实例都会生成自己的生成树,并且每个实例可以包含一个或多个VLAN,每一个VLAN只能映射到一个实例。交换机可以通过配置多个实例,实现不同VLAN组之间的负载分担。

基本概念解释

MST域是一个具有相同域名、修订级别和摘要信息的网桥或交换机构成的集合,一个域可以包含多个实例。

域名,本域的名称,MSTP中每一个域都有一个独一无二的名称,配置不同域名会被认为属于不同的域。

修订级别,目前保留,默认为0。

配置摘要,由网桥的vlan和实例映射关系生成的长度为16字节的HMAC-MD5签名。

IST是MST域内的一颗生成树,每颗生成树对应一个实例。实例号为0,一定存在的

MSTI是多生成树实例,实例号从1开始,为0的实例号是IST

MSTI域根,是每一个MSTI实例上优先级最高的网桥

CST(公共生成树)是网络内所有MST域通过计算得到的一棵树。

CIST(公共和内部生成树)是整个网络所有设备经过生成树计算得到的一棵树。由IST和CST共同构成。

CIST总根,是整个网络中优先级最高的桥,是CIST的根桥。

CIST域根,IST的根桥即为CIST的域根,是MST域内距离总根最近的桥,也称为Master桥。

端口角色

相较RSTP,桥的角色上,MSTP增加了Master桥。端口角色上,增加了域边界端口以及Master端口。根端口、指定端口、Alternate端口、Backup端口定义和RSTP一样。

IST(实例号为0网络)中距离总根最近的桥为Master桥,该桥为IST的根,Master桥指向总根(整个网络中优先级最高的桥)的端口为Master端口。

MST域内网桥和其他MST域或STP/RSTP网桥相连的端口称为域边界端口,Master端口也是域边界端口。

如下图创建了三个区域,暂时都只有IST(实例0),优先级和MAC都是我编的,然后下图标注了MSTP所有的概念,更方便理解吧。

BPDU报文

BPDU Type:0x02

BPDU flags:CIST标志字段

Root Identifier:CIST总根交换机ID

Root Path Cost:CIST外部路径开销,指从本交换机所属的MST域到CIST根交换机的累计路径开销。

Bridge Identifier:CIST的域根交换机ID(每个域距离根桥最近的交换机,域根并不是只有一个,每个域都有一个域根,很多资料上也称为CIST域根,我理解一半天),即IST Master的ID。如果总根在这个域内,那么域根交换机ID就是总根交换机ID。

Port Identifier:CIST的指定端口ID(当前报文的上游交换机发送端口)

Version 3 Length:表示MST专有字段的长度,用于接收到BPDU后进行校验。

MST Config ID:格式选择字符固定为0x00。

MST Config name:域名

MST Config revision:修订级别,为0

MST Config digest:配置摘要

CIST Internal Root Path Cost:CIST内部路径开销,表示发送此BPDU的网桥到达CIST域根的路径开销。

CIST Bridge Identifier:发送此BPDU的网桥ID

CIST Remaining hops:CIST剩余跳数,限制MST域的规模,从域根开始,BPDU每经过一个网桥,跳数就减一,网桥会丢弃收到的跳数为0的BPDU,从而限制MST域的规模。默认为20

MSTI配置信息中的内容只在各自实例中有效,且每个实例中这些字段值是独立的

MSTI flag:一个字节,从第一位到第七位的定义和RSTP相同,第八位为Master标志位

Region Root:表示该实例的域根ID

Internal root path cost:表示发送此BPDU的网桥到达MSTI域根的路径开销

Bridge Identifier priority:表示发送此BPDU的网桥,即指定桥的优先级,其中高4位为优先级位,第四位固定为0

Port Identifier priority:表示发送此BPDU的端口的优先级,其中高4位为优先级位,第四位固定为0

Remaining hops:表示BPDU在该MST实例中的剩余跳数。

优先级向量

MSTP计算可以分为CIST和MSTI计算两部分

CIST优先级向量

用于计算生成CIST生成树和CST生成树,总根,域根等

{CIST总根ID、外部路径开销、域根ID、内部路径开销、指定交换设备ID、指定端口ID、接收端口ID}

再次注意(怕你已经被弄晕了),

外部路径开销是当前域的Master桥到总根的路径开销

内部路径开销是当前交换机到当前域根的路径开销

指定交换设备ID就是发送这个报文的交换机的ID

指定端口ID就是发送这个报文的交换机的端口ID

对比是按照从左往右的顺序,值小者为优,给个报文的图直观一些

MSTI优先级向量用于计算生成区域内的生成树和端口状态等,计算范围仅限区域内

{域根ID、内部路径开销、指定交换设备ID、指定端口ID、接收端口ID}

MSTP计算方法

每个BPDU既包含CIST计算所需的信息,也包含MSTI计算所需要的信息。

计算生成树时候和RSTP类似,在进行CST计算时,会把MST域看做逻辑上的一个网桥,网桥ID为IST域根的ID也就是Master桥ID(距离总根最近的桥)。

当网桥收到BPDU并判断不是同一个域后,不会解析MST专有字段的信息。

初始时每个网桥都认为自己是总根,发送以自己为总根、域根和指定桥的BPDU。

计算端口角色和交换机角色过程与RSTP相同。

CST(公共生成树)的计算过程

  1. 需要对比的优先级向量为{总根、外部路径开销、域根、指定端口ID、接收端口ID},因为生成CST时候把相同的域当做一个网桥了,网桥ID为MST域的Master桥ID,所以自然无需对比内部路径开销和指定桥ID了。

  2. 初始时,每个域根向其他域根发送以自己为总根的BPDU。

  3. 确定“根网桥”(一个域看成一个网桥),也是CIST的总根。

  4. 确定端口角色“根端口”也就是一个域的Master端口,“根端口”的网桥也就是域根。

  5. 确定指定端口、Alternate端口或者Backup端口。

  6. 阻塞域之间的Alternate端口和Backup端口。

IST(内部生成树)和MSTI(内部生成树实例)的计算过程

经过CST的计算生成了域内的根桥(即Master桥)

所需要比较的优先级向量为MSTI优先级向量,即{域根ID、内部路径开销、指定交换设备ID、指定端口ID、接收端口ID}

  1. 域内网桥通过比较内部路径开销来确定根端口。

  2. 通过比较BPDU的优先级确定指定端口、Alternate端口或者Backup端口。

  3. 阻塞IST上的Alternate端口和Backup端口。

MSTP与RSTP交互

RSTP网桥收到MSTP的BPDU时,会将MSTP的BPDU报文里的CIST总根ID,外部路径开销,域根ID,指定端口ID分别与RSTP的BPDU报文里的根桥ID,根桥开销,指定桥ID,指定端口ID对应。

MSTP网桥收到RSTP的BPDU时,会将RSTP的BPDU报文里的根桥ID,根桥开销,指定桥ID,指定端口ID分别与MSTP的BPDU报文里的CIST总根ID,外部路径开销,域根ID,指定端口ID对应。

P/A快速收敛机制

MSTP支持RSTP的快速收敛机制,但有不同点。详细的可以看上面的RSTP的P/A机制,这里只写区别。

RSTP是上游交换机指定端口发送Proposal置位的BPDU,下游网桥执行同步操作之后回应Agreement置位的BPDU,上游网桥收到Agreement置位的BPDU后其指定端口可以立即进入转发状态。

MSTP是上游交换机指定端口发送Proposal置位和Agreement置位的BPDU,下游网桥收到BPDU后执行同步操作然后回应Agreement置位的BPDU,上游网桥收到Agreement置位的BPDU后其指定端口可以立即进入转发状态。

补充

MSTP和实例相关的讲的较少,因为同一个MST域中可以有多个实例,每个实例可以运行通过一个或n个VLAN,但是一个VLAN只能存在一个实例中,然后每个实例都会各自生成生成树,除了IST(实例为0)的根节点是Master桥,其余实例都是按照RSTP类似方法计算出各自实例自己的根桥,指定桥,根端口和指定端口的。

MSTP因为有多个实例,每个端口上对实例的状态可能不一样,比如在实例1端口为根端口,实例2上这个端口为指定端口,所以会出现端口既会发BPDU报文也会收BPDU报文。

拓扑改变的处理和RSTP相同。

MSTP比RSTP就是多了分区域多实例,细化看,每个实例运行的都是RSTP。

RSTP和MSTP启动时简单介绍

当一台交换设备启动RSTP和MSTP时候,会默认自己为根桥,且所有使能RSTP或者MSTP的端口都为指定端口Discarding状态,这样就会触发P/A快速机制,当一个指定端口发送P/A机制报文没收到对端发送过来的回复报文,则需要经过2倍的Forward delay时间才能到转发态。假如下游有一个交换设备同时开启了RSTP或者MSTP,则都会发送P/A机制报文,收到报文后两个指定端口会对比报文确定自己的角色从而继续P/A快速机制。P/A会阻塞除边缘端口和根端口外的其他所有端口,端口两两进行这种操作从而生成整个生成树。

MSTP启动时,多个实例都会在互不干扰的生成对应的生成树,类似多线程一样。

MSTP收到其他区域报文时候,只会对比CIST的信息,MIST内容会忽略

如果您对本文有疑问,可以添加小老虎的微信,共同探讨哦,另外,有想领取太阁课程学习资料的小伙伴,想咨询太阁课程价格的小伙伴,你们都可以扫码添加小老虎微信,跟小老虎聊一聊,大家共同努力,出发吧,就是现在!

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:24:17  更:2022-09-30 01:28:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:45:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码