网络基础:OSPF 协议

OSPF(Open Shortest Path First)是一种广泛使用的链路状态路由协议,用于IP网络中的内部网关协议(IGP)。OSPF通过在网络中的所有路由器之间交换路由信息,选择从源到目的地的最优路径。OSPF工作在OSI模型的第三层,即网络层。OSPF使用IP协议号89进行通信;所有OSPF路由器发送和接收的OSPF报文都封装在IP数据包中,并使用协议号89来标识这些数据包是OSPF报文,OSPF负责在IP网络中进行路由信息的交换和路径计算。

链路状态路由协议和距离矢量路由协议
①链路状态路由协议:链路状态路由协议通告的是链路状态而不是路由表;运行链路状态路由协议的路由器之间首先会建立一个协议的邻居关系,然后彼此之间开始交互 LSA(Link State Advertisement,链路状态通告)。(如OSPF)
​
②距离矢量路由协议:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表;通过路由的交互,每台路由 器都从相邻的路由器学习到路由,并且加载进自己的路由表中;对于网络中的所有路由器而言,路由器并不清楚网络的拓扑,只是简单的知道要去往某个 目的方向在哪里,距离有多远。(如RIP)

OSPF正是一种链路状态路由协议,如上述,运行OSPF路由协议的路由器在交换路由信息时并不是单纯向邻居发送自己的路由表,邻居之间交换路由信息时是彼此交互链路状态通告(LSA)信息。LSA也分成不同类型,不同类型的LSA包含的信息也不一样;用的比较多的Router-LSA中包含的信息有:通告生成该LSA的路由器的链路状态,包括路由器的所有接口、接口状态、链路类型(如点到点、广播、多点等)及其邻居。

OSPF基础术语:
Router-ID(Router Identifier,路由器标识符):用于在一个OSPF域中唯一地标识一台路由器;Router-ID的设定可以通过手工配置的方式,或使用系统自动配置的方式。
度量值:OSPF使用路径开销作为度量;路径开销是通往目标的路径上所有链路的累积开销。
OSPF三大表项:
1.邻居表:

OSPF在传递链路状态信息之前,需先建立OSPF邻居关系;OSPF的邻居关系通过交互Hello报文建立,OSPF邻居表显示了OSPF路由器之间的邻居状态。在思科(Cisco)、华为(Huawei)和华三(H3C)网络设备上,可以通过命令行接口(CLI)来查看OSPF邻居表。以下是各个设备上的具体命令:

思科(Cisco)

在思科设备上,可以使用以下命令查看OSPF邻居表:

show ip ospf neighbor

此命令将显示所有OSPF邻居的详细信息,包括邻居ID、状态、邻居IP地址和接口信息。

示例输出:
Router# show ip ospf neighbor
​
Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.1.1       1   FULL/DR         00:00:39    10.1.1.1        GigabitEthernet0/1
192.168.1.2       1   FULL/BDR        00:00:36    10.1.1.2        GigabitEthernet0/1
华为(Huawei)

在华为设备上,可以使用以下命令查看OSPF邻居表:

display ospf peer

此命令将显示所有OSPF邻居的详细信息,包括邻居ID、状态、邻居IP地址和接口信息。

输出示例;

<Huawei> display ospf peer
​OSPF Process 1 with Router ID 192.168.1.1Neighbor Brief Information
​Area 0.0.0.0 interface 10.1.1.1 (GigabitEthernet0/1)'s neighbors
-------------------------------------------------------------------------------
Router ID       Address         Pri    State         Dead Time   Neighbor Area
192.168.1.2     10.1.1.2        1      Full/BDR      00:00:36    0.0.0.0
192.168.1.3     10.1.1.3        1      Full/DR       00:00:39    0.0.0.0
​
华三(H3C)

在华为设备上,可以使用以下命令查看OSPF邻居表:

display ospf peer

输出示例:

<H3C> display ospf peer
​OSPF Process 1 with Router ID 192.168.1.1Neighbor Brief Information
​Area 0.0.0.0 interface 10.1.1.1 (GigabitEthernet0/1)'s neighbors
-------------------------------------------------------------------------------
Router ID       Address         Pri    State         Dead Time   Neighbor Area
192.168.1.2     10.1.1.2        1      Full/BDR      00:00:36    0.0.0.0
192.168.1.3     10.1.1.3        1      Full/DR       00:00:39    0.0.0.0
​

通过这些命令,可以方便地查看设备上所有OSPF邻居的详细信息,帮助网络管理员了解OSPF的工作状态和邻居关系。

2.LSDB表

LSDB会保存自己产生的及从邻居收到的LSA信息;LSDB(Link-State Database,链路状态数据库)是OSPF(Open Shortest Path First)协议中存储网络拓扑信息的核心组件。每个OSPF路由器都维护一个LSDB,用于存储从其他路由器接收到的所有链路状态通告(LSA)。这些LSA共同描述了整个网络的拓扑结构,使得路由器能够计算出最优路径。在不同厂商的网络设备上,可以使用相应的命令来查看LSDB的内容。以下是思科(Cisco)、华为(Huawei)和华三(H3C)网络设备上的具体命令:

思科(Cisco)
show ip ospf database
华为(Huawei)
display ospf lsdb
华三(H3C)
display ospf lsdb

3.OSPF路由表

OSPF(Open Shortest Path First)路由表(Routing Table)是OSPF路由器根据其链路状态数据库(LSDB)和最短路径优先(SPF)算法计算出的最优路径的集合。这些路由条目用于决定数据包的转发路径。在不同厂商的网络设备上,可以使用相应的命令来查看OSPF路由表的内容。

思科(Cisco)设备
show ip route ospf
华为(Huawei)
display ospf routing
华三(H3C)
display ospf routing

OSPF工作流程
  1. 邻居发现:

    OSPF路由器通过定期发送Hello包来发现和维护邻居关系。Hello包包含以下信息:

    路由器ID
    Hello间隔时间
    死亡间隔时间
    网络掩码
    路由器优先级
    邻居列表

    路由器在收到Hello包后,会检查各项参数是否匹配,如果匹配,则在自己的邻居列表中添加该路由器。

  2. 建立邻接关系:

    当邻居关系建立后,OSPF路由器之间会进一步建立邻接关系。这个过程包括:

    ①Database Description (DBD) 包交换:DBD包包含链路状态数据库(LSDB)的摘要信息;LSDB(Link-State Database,链路状态数据库)是OSPF(Open Shortest Path First)路由协议中存储网络拓扑信息的数据库。邻居路由器交换DBD包,以确认彼此的LSDB的状态和内容。
    ②Link State Acknowledgment (LSAck) 包交换:每当一个路由器收到新的LSA时,它会发送LSAck包来确认已收到这些信息。
    ③Link State Request (LSR) 包交换:如果一个路由器发现自己的LSDB中缺少某些LSA(Link State Advertisement),它会发送LSR包请求这些特定的LSA。
    ④Link State Update (LSU) 包交换:路由器收到LSR包后,会回应LSU包,其中包含请求的LSA信息。
    ⑤Link State Acknowledgment (LSAck) 包交换:每当一个路由器收到新的LSA时,它会发送LSAck包来确认已收到这些信息。

    OSPF邻接关系

    OSPF完成邻接关系的建立有四个步骤,建立邻居关系、协商主/从、交互LSDB信息,同步LSDB

    这些步骤我们主要说一下协商主/从,在OSPF(Open Shortest Path First)协议中,建立邻接关系时协商主/从关系的主要目的是确保数据库描述(DBD)包的有序交换。如果没有主/从关系的协商,两个路由器可能会同时发送DBD包,导致包的冲突和乱序。这会引起邻接关系的不稳定,甚至中断;主/从关系确保了只有一个路由器(主)负责启动DBD包的发送,另一个路由器(从)按照顺序进行回应,从而避免了冲突和混乱。

    主/从关系的选举过程
    主从关系的选举基于路由器的Router ID。Router ID较大的路由器被选为主(Master),Router ID较小的被选为从(Slave)。
    主路由器(Master)首先发送一个DBD包,包含其LSDB的摘要信息。
    从路由器(Slave)接收到这个DBD包后,确认并回应一个包含自己LSDB摘要信息的DBD包。

    示例说明

    R1和R2进入Exstart状态,开始协商主从关系。
    比较Router ID,2.2.2.2大于1.1.1.1,因此R2被选为主(Master),R1被选为从(Slave)。
    R2(主)首先发送一个DBD包。
    R1(从)接收到这个DBD包后,确认并回应一个DBD包。
    完成初始DBD包交换后,R2和R1状态从Exstart转移到Exchange,继续交换DBD包,最终同步LSDB。
  3. LSA 交换:

    一旦邻接关系建立,路由器会开始交换LSA来更新彼此的LSDB,确保LSDB同步;LSA是OSPF中的基本信息单位,包含网络拓扑信息。主要的LSA类型有:

    Router-LSA (类型1):描述路由器的链路。
    Network-LSA (类型2):由DR生成,描述广播网络。
    Summary-LSA (类型3):由ABR生成,描述区域间的网络。
    ASBR-Summary-LSA (类型4):描述ASBR的可达性。
    AS-External-LSA (类型5):由ASBR生成,描述外部自治系统的路由。
  4. 运行SPF算法

    当路由器的LSDB更新后,它会运行Dijkstra的最短路径优先(SPF)算法来计算最短路径树(SPT)。通过SPF算法,路由器可以生成从自己到所有目的地的最优路径。

  5. 路由表更新

    SPF算法计算完成后,路由器会根据SPT更新自己的路由表,选择最优路径转发数据包。

  6. 维护和更新

    OSPF路由器需要定期发送Hello包来维持邻居关系,确保链路状态数据库的同步。当网络拓扑发生变化时(如链路断开、新增路由器),路由器会生成新的LSA并传播这些变化,确保所有路由器能够快速收敛到最新的拓扑状态。(每10s发送一次Hello包,若40s都没有收到邻居的Hello包就自动认为邻居Down掉了)

在OSPF的工作流程中,第二步的LSA交换主要是为了同步邻居之间的链路状态数据库(LSDB),确保它们拥有一致的网络拓扑视图,而第三步的LSA交换则是一个持续的过程,用于维护和更新整个网络的拓扑信息。

DR和BDR选举

在OSPF(Open Shortest Path First)协议中,DR(Designated Router,指定路由器)和BDR(Backup Designated Router,备用指定路由器)在多访问网络(如以太网和非广播多访问网络)中扮演着重要角色。它们的主要目的是减少OSPF路由器之间的LSA(链路状态通告)泛洪次数,提高网络效率。

以正常方式建立邻接关系:

以DR/BDR方式建立邻接关系:

以下是关于DR和BDR的详细解释:

指定路由器(DR):DR负责在多访问网络中作为中央点来进行LSA的泛洪。所有其他路由器(非DR和非BDR)只需与DR交换LSA,而不需要与所有其他路由器直接交换。这减少了网络中的LSA泛洪量。DR从所有路由器收集LSA,并向所有路由器泛洪这些信息,确保所有路由器都能获得最新的链路状态信息。

备用指定路由器(BDR):BDR是DR的备份。当DR失效时,BDR会自动成为新的DR,确保网络拓扑信息的持续传播。BDR在DR正常工作时,也会接收所有路由器的LSA,但它不会主动泛洪这些信息,除非DR失效。

我们可以通过ospf邻居表来查看当前ospf网络中的DR和BDR分别是哪些设备。

DR和BDR的选举过程

  1. Hello包交换

    • 在多访问网络中,所有OSPF路由器通过Hello包来发现彼此并进行DR/BDR的选举。

    • Hello包中包含了路由器的优先级(Priority)和Router ID等信息。

  2. 路由器优先级

    • 每个路由器在Hello包中宣布自己的优先级。优先级值可以在0到255之间。

    • 优先级最高的路由器被选为DR。如果优先级相同,则Router ID较大的路由器被选为DR。

  3. 选举过程

    • 初始选举时,所有路由器都会发送Hello包,包含自己认为的当前DR和BDR。

    • 经过多次Hello包交换后,所有路由器会达成一致,选举出优先级最高的路由器作为DR,次高优先级的路由器作为BDR。

    • 如果路由器的优先级为0,则它不会参与DR/BDR选举,只能作为普通路由器。

示例说明

假设在一个以太网网络中有四个OSPF路由器,R1, R2, R3和R4,它们的优先级和Router ID如下:

R1:优先级1,Router ID 1.1.1.1
R2:优先级2,Router ID 2.2.2.2
R3:优先级1,Router ID 3.3.3.3
R4:优先级0,Router ID 4.4.4.4

1.确定优先级最高的路由器:优先级最高的是R2(优先级2),因此R2被选为DR。其次是R1和R3(优先级1),Router ID较大的R3被选为BDR。选举完成,其他路由器则都是普通路由器。

选举后DR和BDR的位置是不可抢占的;若是抢占DR则需要重置DR中的OSPF进程。

OSPF区域结构

OSPF(Open Shortest Path First)的区域结构是为了优化路由信息的管理和传播,通过将大型网络划分为多个区域来减少路由开销、提高稳定性和可扩展性。以下是关于OSPF区域结构的详细介绍:

区域(Area):区域是OSPF网络的一个逻辑分段,每个区域都有一个唯一的32位标识符,通常以IP地址格式表示(例如0.0.0.0);每个区域内部的路由器都共享同一个链路状态数据库(LSDB),但不同区域之间的LSDB是独立的。

骨干区域(Area 0):OSPF网络的核心部分,所有其他区域都必须直接或间接地连接到骨干区域;骨干区域负责汇总和分发来自不同区域的路由信息,确保整个OSPF域的连通性。

非骨干区域:除了骨干区域之外的其他区域,用于进一步划分网络,减少单个区域内的路由器数量。非骨干区域必须通过骨干区域进行通信,不能直接与其他非骨干区域通信。

ospf配置

在OSPF配置过程中,涉及到多个步骤,包括定义OSPF进程、配置区域、指定接口以及调整相关参数。以下是OSPF配置的详细步骤和示例,分别以思科(Cisco)、华为(Huawei)和华三(H3C)设备为例。

思科(Cisco)
  1. 启用OSPF进程

    router ospf 1

  2. 配置路由器ID(可选)

    router-id 1.1.1.1

  3. 将接口划分到区域

    network 192.168.1.0 0.0.0.255 area 0
    network 192.168.2.0 0.0.0.255 area 1

  4. 配置接口OSPF参数(可选)

    interface GigabitEthernet0/1ip ospf cost 10ip ospf hello-interval 10

华为(Huawei)
  1. 启用OSPF进程(并配置route-id)

    ospf 1 route-id 3.3.3.3

  2. 将接口划分到区域

    area 0network 192.168.1.0 0.0.0.255
    area 1network 192.168.2.0 0.0.0.255

  3. 配置接口OSPF参数(可选)

    interface GigabitEthernet0/0/1ospf cost 10ospf hello-interval 10

华三(H3C)
  1. 启用OSPF进程(并配置route-id)

    ospf 1 router-id 1.1.1.1
  2. 将接口划分到区域

    area 0network 192.168.1.0 0.0.0.255
    area 1network 192.168.2.0 0.0.0.255
  3. 配置接口OSPF参数(可选)

    interface GigabitEthernet1/0/1ospf cost 10ospf hello-interval 10

通用配置步骤
  1. 定义OSPF进程:启动OSPF进程,并分配进程ID。

  2. 配置路由器ID:每个OSPF路由器需要一个唯一的路由器ID。

  3. 划分区域:将接口分配到指定的OSPF区域。

  4. 配置接口参数(可选):可以根据需要配置接口的OSPF特定参数,如开销(cost)、Hello间隔等。

验证配置

在配置完成后,可以使用以下命令来验证OSPF配置和邻居状态。

思科
show ip ospf            //显示与OSPF相关的各种信息
show ip ospf neighbor  //显示邻居表
show ip route ospf    //显示ospf路由表
华为
display ospf             //显示与OSPF相关的各种信息
display ospf peer       //显示邻居表
display ospf routing   //显示ospf路由表
华三
display ospf            //显示与OSPF相关的各种信息
display ospf peer       //显示邻居表
display ospf routing    //显示ospf路由表
ospf相关的两个组播地址

OSPF(Open Shortest Path First)使用两个特定的组播地址来发送和接收OSPF协议消息。这两个组播地址是224.0.0.5和224.0.0.6。

1.组播地址224.0.0.5(AllSPFRouters)

该组播地址用于发送OSPF Hello消息、Link State Request消息、Link State Update消息和Link State Acknowledgment消息到所有运行OSPF的路由器;任何运行OSPF的路由器接口都会监听这个组播地址,以便接收OSPF邻居的各种消息。这是用来建立和维护邻居关系的关键通信方式。

2.组播地址224.0.0.6(AllDRouters)

该组播地址用于发送OSPF Link State Update消息和Link State Acknowledgment消息到指定的DR(Designated Router)和BDR(Backup Designated Router);仅DR和BDR会监听这个组播地址。非DR和非BDR的OSPF路由器会将Link State Update消息发送到224.0.0.6地址,以便DR和BDR可以接收并传播这些消息,从而减少组播的冗余。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化页面加载时间

注&#xff1a;机翻&#xff0c;未校对。 本文年代久远&#xff0c;除了少部分不合时宜的&#xff0c;其他仍有借鉴意义。 Optimizing Page Load Time 优化页面加载时间 It is widely accepted that fast-loading pages improve the user experience. In recent years, many …

【Elasticsearch】Elasticsearch动态映射与静态映射详解

文章目录 &#x1f4d1;前言一、Elasticsearch 映射概述1.1 什么是映射&#xff1f;1.2 映射的分类 二、动态映射2.1 动态映射的定义2.2 动态映射的优点2.3 动态映射的缺点2.4 动态映射的应用场景2.5 动态映射的配置示例 三、静态映射3.1 静态映射的定义3.2 静态映射的优点3.3 …

Zookeeper:Zookeeper集群角色

文章目录 一、Leader选举二、Zookeeper集群角色 一、Leader选举 Serverid&#xff1a;服务器ID&#xff1b;比如有三台服务器&#xff0c;编号越大在选择算法中的权重越大。Zxid&#xff1a;数据ID&#xff1b;服务器中存放的最大数据ID&#xff0c;值越大说明数据越新&#x…

JS(JavaScript) 数据校验 正则表达式

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

摸鱼大数据——Spark Core——RDD的基本介绍和如何构建RDD

1、什么是RDD RDD&#xff1a;英文全称Resilient Distributed Dataset&#xff0c;叫做弹性分布式数据集&#xff0c;代表一个不可变、可分区、里面的元素可并行计算的分布式的抽象的数据集合。 Resilient弹性&#xff1a;RDD的数据可以存储在内存或者磁盘当中&#xff0c;RDD…

java常用类(3)

目录 一. 正则表达式 二. Math类 三. Random类 四. Date类 五. Calendar类 六. SimpDateFormate类 七. BigInteger类 八. BigDecimal类 一. 正则表达式 正则表达式(Regular Expression)就是用一些特殊的符号去匹配一个字符串是否符合规则,利用String类中的matches()方…

[Leetcode 136][Easy]-只出现一次的数字

目录 题目描述 具体思路 题目描述 原题链接 具体思路 ①首先看到数组中重复的数字&#xff0c;想到快慢指针&#xff0c;但是数组的元素是乱序的不好求。因此先对数组排序。使用了STL库的sort函数&#xff0c;时间复杂度O(nlogn)不符合题目要求&#xff0c;空间复杂度O(1)。…

KEYSIGHT是德科技 E5063A ENA 系列网络分析仪

E5063A ENA 矢量网络分析仪 18GHz 2端口 降低无源射频元器件的测试成本 Keysight E5063A ENA 是一款经济适用的台式矢量网络分析仪&#xff0c;可用于测试简单的无源元器件&#xff0c;例如频率最高达到 18 GHz 的天线、滤波器、电缆或连接器。 作为业界闻名的 ENA 系列…

打卡第一天

今天是参加算法训练营的第一天&#xff0c;希望我能把这个训练营坚持下来&#xff0c;希望我的算法编程题的能力有所提升&#xff0c;不再面试挂了&#xff0c;面试总是挂编程题&#xff0c;记录我leetcode刷题数量&#xff1a; 希望我通过这个训练营能够实现两份工作的无缝衔接…

用720云搭建数字孪生VR智慧安防系统,赋能安防升级!

“安全防范"一直是我国城镇化发展进程中重点关注的工作板块&#xff0c;随着时代发展需求与科技的日新月异&#xff0c;安防行业正在积极融合VR3D数字孪生技术&#xff0c;升级安防数字基础设施和安防产品服务创新。 今年2月&#xff0c;《数字中国建设整体布局规划》的出…

docker容器间网络仿真工具-pumba

docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预&#xff0c;包括延迟&#xff0c;丢包&#xff0c;带宽限制等。 但是我在实际使用时&#xff0c;发现docker-tc这个工具在进行网络进行模…

如何使用python网络爬虫批量获取公共资源数据教程?

原文链接&#xff1a;如何使用python网络爬虫批量获取公共资源数据教程&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx4&snef281f66727afabfaae2066c6e92f792&chksmfa826657cdf5ef41571115328a09b9d34367d8b11415d5a5781dc4c…

84 柱状图中最大的矩形

题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最大的矩…

从全连接到卷积

一、全连接到卷积 1、卷积具有两个原则&#xff1a; 平移不变性&#xff1a;无论作用在哪个部分&#xff0c;它都要有相同的作用&#xff0c;而不会随着位置的改变而改变 局部性&#xff1a;卷积核作用处&#xff0c;作用域应该是核作用点的周围一小部分而不作用于更大的部分 …

【无需公网IP】在树莓派上搭建Web站点

目录 1.概述 2.使用 Raspberry Pi Imager 安装 Raspberry Pi OS 3.设置 Apache Web 服务器 3.1测试 web 站点 3.2安装静态样例站点 3.3将web站点发布到公网 3.4安装 Cpolar 3.5cpolar进行token认证 3.6生成cpolar随机域名网址 3.7生成cpolar二级子域名 3.8将参数保存…

linux 下,Java由Java8升级到Java11,Java不更新版本号

在ES对接过程&#xff0c;springboot3进行对接&#xff0c;需要将Java升级到11版本。首先下载安装选好的11版本Java&#xff0c;在linux下解压后&#xff0c;配置/etc/profile export JAVA_HOME/root/SJL/jdk-11.0.22 然后保存&#xff0c;执行文件source /etc/profile&#…

Linux多进程和多线程(一)-进程的概念和创建

进程 进程的概念进程的特点如下进程和程序的区别LINUX进程管理 getpid()getppid() 进程的地址空间虚拟地址和物理地址进程状态管理进程相关命令 ps toppstreekill 进程的创建 并发和并行fork() 父子进程执行不同的任务创建多个进程 进程的退出 exit()和_exit() exit()函数让当…

【机器学习】机器学习与电商推荐系统的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在电商推荐系统中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 特征工程 1.2 模型选择1.2.1 协同过滤1.2.2 矩阵分解1.2.3 基于内容的推荐1.2.4 混合推荐 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 …

根据后端返回的省市区重新封装树结构(省市区通过children表示)

对比图&#xff08;截取部分&#xff09;&#xff1a; 注&#xff1a;先看分步&#xff0c;最后会附上完整代码&#xff08;如果有用&#xff0c;可以给小编点个赞吗&#xff1f;十分感谢&#xff09; 1.首先将前端返回相同的省份只展示一次 const obj {}; let keyList []r…

最新简约美观的网址网站引导页HTML源码

最新简约美观的网址网站引导页HTML源码 带一言 随机大图 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89487135 更多资源下载&#xff1a;关注我。