关于 OSPF LSA 序列号范围 0x80000001-0x7FFFFFFF 释疑正本清源

news2024/9/21 2:37:51

注:机翻,未校对。


正本:RFC 2328 OSPF Version 2 中相关解释

April 1998

12.1.6. LS sequence number

12.1.6. 序列号

The sequence number field is a signed 32-bit integer. It is used to detect old and duplicate LSAs. The space of sequence numbers is linearly ordered. The larger the sequence number (when compared as signed 32-bit integers) the more recent the LSA. To describe to sequence number space more precisely, let N refer in the discussion below to the constant 2**31.

序列号字段是有符号 32 位整数。它用于检测旧的和重复的 LSA。序列号的空间是线性有序的。序列号越大(与有符号 32 位整数相比),LSA 越近。为了更精确地描述序列号空间,让 N 在下面的讨论中参考常数 2 31 2^{31} 231

The sequence number -N (0x80000000) is reserved (and unused). This leaves -N + 1 (0x80000001) as the smallest (and therefore oldest) sequence number; this sequence number is referred to as the constant InitialSequenceNumber. A router uses InitialSequenceNumber the first time it originates any LSA. Afterwards, the LSA’s sequence number is incremented each time the router originates a new instance of the LSA. When an attempt is made to increment the sequence number past the maximum value of N - 1 (0x7fffffff; also referred to as MaxSequenceNumber), the current instance of the LSA must first be flushed from the routing domain. This is done by prematurely aging the LSA (see Section 14.1) and reflooding it. As soon as this flood has been acknowledged by all adjacent neighbors, a new instance can be originated with sequence number of InitialSequenceNumber.

序列号 - N(0x8000000)为保留(未使用)。这使得 − N + 1 - N + 1 N+1(0x8000001)成为最小的(因此也是最早的)序列号;此序列号称为常量 InitialSequenceNumber。路由器在第一次发起任何 LSA 时使用 InitialSequenceNumber。之后,每次路由器启动 LSA 的新实例时,LSA 的序列号都会增加。当试图将序列号增加到超过最大值 N − 1 N -1 N1(0x7fffffff;也称为 MaxSequenceNumber)时,必须首先从路由域刷新 LSA 的当前实例。这是通过提前老化 LSA(见第 14.1 节)并对其进行再泛洪来实现的。一旦所有相邻邻居都确认了该泛洪,就可以使用 InitialSequenceNumber 的序列号创建一个新实例。

The router may be forced to promote the sequence number of one of its LSAs when a more recent instance of the LSA is unexpectedly received during the flooding process. This should be a rare event. This may indicate that an out-of-date LSA, originated by the router itself before its last restart/reload, still exists in the Autonomous System. For more information see Section 13.4.

路由器可能会被迫提升其某个 LSA 的序列号,当在泛洪过程中意外接收到 LSA 的较新实例时。这应该是一个罕见的事件。这可能表明,在路由器最后一次重启 / 重新加载之前,由该路由器自己发起的过时 LSA 仍然存在于自治系统中。有关更多信息,请参见第 13.4 节。

InitialSequenceNumber The value used for LS Sequence Number when originating the first instance of any LSA. Its value is the signed 32-bit integer 0x80000001.

InitialSequenceNumber 在初始化任何 LSA 的第一个实例时用于 LS 序列号的值。其值为有符号 32 位整数 0x8000001。

13.4. Receiving self-originated LSAs

13.4. 接收自创 LSA

It is a common occurrence for a router to receive self-originated LSAs via the flooding procedure. A self-originated LSA is detected when either 1) the LSA’s Advertising Router is equal to the router’s own Router ID or 2) the LSA is a network-LSA and its Link State ID is equal to one of the router’s own IP interface addresses.

路由器通常通过泛洪过程接收自创 LSA。当 1)LSA 的广告路由器等于路由器自己的路由器 ID 或 2)LSA 是网络 LSA 且其链路状态 ID 等于路由器自己的 IP 接口地址之一时,检测到自创 LSA。

However, if the received self-originated LSA is newer than the last instance that the router actually originated, the router must take special action. The reception of such an LSA indicates that there are LSAs in the routing domain that were originated by the router before the last time it was restarted. In most cases, the router must then advance the LSA’s LS sequence number one past the received LS sequence number, and originate a new instance of the LSA.

但是,如果收到的自发端 LSA 比路由器实际发端的最后一个实例要新,路由器必须采取特殊措施。接收到这样的 LSA 表示路由域中存在在路由器上次重新启动之前由路由器发起的 LSA。在大多数情况下,路由器必须将 LSA 的 LS 序列号提前 1,超过接收到的 LS 序列号,并发起 LSA 的新实例。

It may be the case the router no longer wishes to originate the received LSA. Possible examples include: 1) the LSA is a summary-LSA or AS-external-LSA and the router no longer has an (advertisable) route to the destination, 2) the LSA is a network-LSA but the router is no longer Designated Router for the network or 3) the LSA is a network-LSA whose Link State ID is one of the router’s own IP interface addresses but whose Advertising Router is not equal to the router’s own Router ID (this latter case should be rare, and it indicates that the router’s Router ID has changed since originating the LSA). In all these cases, instead of updating the LSA, the LSA should be flushed from the routing domain by incrementing the received LSA’s LS age to MaxAge and reflooding (see Section 14.1).

路由器可能不再希望发起接收到的 LSA。可能的示例包括:1)LSA 是摘要 LSA 或作为外部 LSA,并且路由器不再具有到目的地的(可通告的)路由,2)LSA 是网络 LSA,但路由器不再是网络的指定路由器;或 3)LSA 是网络 LSA,其链路状态 ID 是路由器自己的 IP 接口地址之一,但其广告路由器不等于路由器自己的路由器 ID(后一种情况应该是罕见的,它表明路由器的路由器 ID 在发起 LSA 后发生了变化)。在所有这些情况下,不更新 LSA,而应该通过将接收到的 LSA 的 LS age 增加到 MaxAge 并重新加载来从路由域刷新 LSA(见第 14.1 节)。

14.1. Premature aging of LSAs

14.1. LSA 的过早老化

An LSA can be flushed from the routing domain by setting its LS age to MaxAge, while leaving its LS sequence number alone, and then reflooding the LSA. This procedure follows the same course as flushing an LSA whose LS age has naturally reached the value MaxAge (see Section 14). In particular, the MaxAge LSA is removed from the router’s link state database as soon as a) it is no longer contained on any neighbor Link state retransmission lists and b) none of the router’s neighbors are in states Exchange or Loading. We call the setting of an LSA’s LS age to MaxAge “premature aging”.

通过将 LSA 的 LS age 设置为 MaxAge,而不使用其 LS 序列号,然后重新加载 LSA,可以从路由域刷新 LSA。该程序遵循与刷新 LS age 自然达到最大值的 LSA 相同的过程(见第 14 节)。特别是,只要 a)MaxAge LSA 不再包含在任何邻居链路状态重传列表中,并且 b)路由器的邻居没有处于交换或加载状态,MaxAge LSA 就会从路由器的链路状态数据库中删除。我们将 LSA 的 LS age 设置为 MaxAge 称为 “过早老化”。

Premature aging is used when it is time for a self-originated LSA’s sequence number field to wrap. At this point, the current LSA instance (having LS sequence number MaxSequenceNumber) must be prematurely aged and flushed from the routing domain before a new instance with sequence number equal to InitialSequenceNumber can be originated. See Section 12.1.6 for more information.

当自创 LSA 的序列号字段需要换行时,使用过早老化。此时,当前 LSA 实例(具有 LS 序列号 MaxSequenceNumber)必须提前老化并从路由域刷新,然后才能生成序列号等于 InitialSequenceNumber 的新实例。详见第 12.1.6 节。

Premature aging can also be used when, for example, one of the router’s previously advertised external routes is no longer reachable. In this circumstance, the router can flush its AS-external-LSA from the routing domain via premature aging. This procedure is preferable to the alternative, which is to originate a new LSA for the destination specifying a metric of LSInfinity. Premature aging is also be used when unexpectedly receiving self-originated LSAs during the flooding procedure (see Section 13.4).

例如,当路由器先前公布的外部路由之一不再可到达时,也可使用过早老化。在这种情况下,路由器可以通过提前老化将其作为外部 LSA 从路由域刷新。此过程比另一种方法更可取,即为指定 LSInfinity 度量的目的地创建新的 LSA。在泛洪过程中意外接收自产 LSA 时,也可使用过早老化(见第 13.4 节)。

A router may only prematurely age its own self-originated LSAs. The router may not prematurely age LSAs that have been originated by other routers. An LSA is considered self-originated when either 1) the LSA’s Advertising Router is equal to the router’s own Router ID or 2) the LSA is a network-LSA and its Link State ID is equal to one of the router’s own IP interface addresses.

路由器可能只会过早地老化自己的源于自身的 LSA。路由器不得过早老化由其他路由器发起的 LSA。当 1)LSA 的广告路由器等于路由器自己的路由器 ID 或 2)LSA 是网络 LSA 且其链路状态 ID 等于路由器自己的 IP 接口地址之一时,LSA 被认为是自始的。


via:

  • RFC 2328: OSPF Version 2

    https://www.rfc-editor.org/rfc/rfc2328


清源:CCIE v5 中 key topic

在这里插入图片描述
注意:

在 OSPF 中,LSA 序列号形成一个线性有序的符号 32 位整数空间,其范围从
− 2 31 + 1 -2^{31} + 1 231+1 2 31 − 1 2^{31} - 1 2311,即从 − 2 , 147 , 483 , 647 -2,147,483,647 2,147,483,647 2 , 147 , 483 , 647 2,147,483,647 2,147,483,647

2 31 2^{31} 231 保留用于检测 LSA 序列号是否回绕,并不作为有效的序列号。

由于在大多数计算机系统中,负整数以二进制补码形式存储,因此打印出负数的二进制补码值的十六进制形式会得到如下值: 0 x 80000001 0x80000001 0x80000001 (对应于 − 2 31 + 1 -2^{31} + 1 231+1 )到 0 x F F F F F F F F 0xFFFFFFFF 0xFFFFFFFF (对应于 − 1 -1 1)。

因此,当以十六进制打印时,LSA 序列号的范围如下:

  • 开始于 0 x 80000001 0x80000001 0x80000001(即 − 2 31 + 1 -2^{31} + 1 231+1
  • 增加至 0 x F F F F F F F F 0xFFFFFFFF 0xFFFFFFFF(即 − 1 -1 1),
  • 然后是 0 x 00000000 0x00000000 0x00000000(即 0 0 0),
  • 接着是 0 x 00000001 0x00000001 0x00000001(即 1 1 1),
  • 最后为 0 x 7 F F F F F F F 0x7FFFFFFF 0x7FFFFFFF(即 2 31 − 1 2^{31} - 1 2311)。

如果某个 LSA 的序列号增加到 0 x 80000000 0x80000000 0x80000000,则需要将该 LSA 从 LSDB 中刷新,然后重新生成,使其序列号再次从 0 x 80000001 0x80000001 0x80000001 开始。序列号 0 x 80000000 0x80000000 0x80000000 从未出现在网络中。


讨论一:OSPF Sequence Number Question!

Iluvnetwork
11-22-2017 02:02 AM - edited
‎03-08-2019 12:50 PM

When does the sequence number of LSA change?
LSA 的序列号何时更改?

How does the router first make sequence number for the advertising LSA?
路由器如何为先通告的 LSA 生成序列号?

P.S. LSA sequence number has nothing to do with the sequence number during the LSDB Synchronization. Right?
P.S. LSA 序列号与 LSDB 同步期间的序列号无关。是吗?

damasiel

03-27-2020 08:31 AM

Hello,

Every route in the OSPF database has a sequence number. A initial sequence number is assigned when the OSPF process is started on the router and interfaces or networks are entered into the OSPF process. This process is done by either the network statement under the OSPF process or at the interface subcommand
OSPF 数据库中的每条路由都有一个序列号。 在路由器上启动 OSPF 进程并将接口或网络输入到 OSPF 进程中时,将分配初始序列号。 此过程由 OSPF 进程下的 network 语句或 interface 子命令完成

Initially, every route in an OSPF database is assigned the beginning sequence in Hex of 0x80000001
最初,OSPF 数据库中的每条路由都被分配了十六进制的开始序列 0x80000001

This sequence number will increase when:
在以下情况下,此序列号将增加:

There is an update to the specific network entry in the database, such as the best path has changed.
数据库中的特定网络条目有更新,例如最佳路径已更改。

I would say, in a stable environment the sequence number changes when the OSPF timers for each route reach a certain age. By default the age is 30 mins. The OSPF database also keeps track of this age value within the database. When the route gets “old” enough, its time for OSPF to increase the sequence number and then flood the update out to all the routers within in the area.
我想说的是,在稳定的环境中,当每条路由的 OSPF 计时器达到一定年龄时,序列号会发生变化。 默认情况下,年龄为 30 分钟。 OSPF 数据库还会在数据库中跟踪此年龄值。 当路由变得足够 “旧” 时,OSPF 就需要增加序列号,然后将更新大量传输到区域内的所有路由器。

So once the entry of 192.168.1.128 /25 reaches a LS age of something like 1800 seconds the local router determines it’s time to increase the sequence number by 1, 0x80000002 and flood this new LSA out to everyone as an OSPF packet type of LSA Update. Other routers see the 0x80000002 and replaces their entry for that route with the “newer” one.
因此,一旦条目 192.168.1.128 /25 达到大约 1800 秒的 LS 年龄,本地路由器就会确定是时候将序列号增加 1、0x80000002 并将此新 LSA 作为 LSA 更新的 OSPF 数据包类型提供给所有人。 其他路由器会看到 0x80000002,并用 “较新” 的路由替换其该路由的条目。

The sequence number is a signed value. Meaning it does have a positive /negative value. Sounds crazy but yes I had to do more digging on this. Think of the sequence number of 0x80000001 as a negative value, it can keep increasing getting greater in value, until it reaches 0x8FFFFFFF (which would be -1) we add one to this value, -1+1 = 0, 0x8FFFFFFF + 1 is (We’ve run out of bits so we go to Zero) 0x00000000 allowing the number to keep incrementing.
序列号是一个有符号值。 这意味着它确实具有正 / 负值。 听起来很疯狂,但是的,我不得不对此进行更多的挖掘。 将 0x80000001 的序列号视为负值,它可以不断增加,直到达到 0x8FFFFFFF(即 -1),我们向该值加 1,-1+1 = 0,0x8FFFFFFF + 1 是(我们已经用完了比特,所以我们去零)0x00000000 允许数字继续增加。

So 0x0000000A is larger /newer than 0x852425A2
所以 0x0000000A 比 0x852425A2 更大 / 更新。


via:

  • OSPF Sequence Number Question! - Cisco Community

    https://community.cisco.com/t5/switching/ospf-sequence-number-question/td-p/3220777


讨论二:OSPF LSA Sequence Numbers

When the OSPF protocol populates the Link State Database (LSDB), it uses a sequence number to determine which LSA is newer.
当 OSPF 协议填充链路状态数据库 (LSDB) 时,它使用序列号来确定哪个 LSA 较新。

What do the sequence numbers look like for OSPF LSAs?
OSPF LSA 的序列号是什么样子的?

  • There are 4 bytes or 32-bits.
    有 4 个字节或 32 位。
  • Begins with 0x80000001 and ends at 0x7FFFFFFF.
    以 0x80000001 开始,到 0x7FFFFFFF 结束。
  • Every 30 minutes each LSA will age out and will be flooded:
  • The sequence number will increment by one.
    序列号将递增 1。

If you put these numbers into a Hex to Decimal converter, you’ll see that you end up with
0x80000001 = 2147483649
0x7FFFFFFF = 2147483647
如果你把这些数字放入十六进制到十进制的转换器中,你会看到你最终得到 0x80000001 = 2147483649 0x7FFFFFFF = 2147483647

This looks strange. Actually, it looks completely incorrect!! The reason these numbers are used is because the LSA sequence numbers are signed. That is, they include a negative or positive sign which is indicated by the very first of the 32 bits. The LSA sequence numbers will start with 0x80000001 which is compared to binary below:
这看起来很奇怪。实际上,它看起来完全不正确!!使用这些编号的原因是 LSA 序列号已签名。也就是说,它们包括一个负号或正号,由 32 位中的第一位表示。LSA 序列号将以 0x80000001 开头,下面将其与二进制文件进行比较:

Hex       0x8  0    0    0    0    0    0    1
Binary    1000 0000 0000 0000 0000 0000 0000 0001

Note the 1 in the leftmost position. This indicates a negative sign, and that digit is not used to denote the number. So 0x80000001 is equal to -1 in decimal. Now as the numbers increment, they actually decrement. What I mean is you start with -1, then -2, -3 etc. until you get to -2147483648. Then it goes to 0 and then the numbers increment up to +2147483648 which is 0x7FFFFFFF. Here is this number compared to its binary representation as well:
请注意最左侧位置的 1。这表示负号,该数字不用于表示数字。所以 0x80000001 在十进制中等于 -1。现在,随着数字的增加,它们实际上在减少。我的意思是你从 -1 开始,然后是 -2、-3 等,直到你得到 -2147483648。然后它变为 0,然后数字增加到 +2147483648,即 0x7FFFFFFF。以下是这个数字与其二进制表示的比较:

Hex       0x7  F    F    F    F    F    F    F
Binary    0111 1111 1111 1111 1111 1111 1111 1111

Note the 0 on the left most bit. This indicates a positive ‘+’ number. Once this number is reached, then it goes back to -1 or 0x80000001 and the process continues.
请注意最左边位的 0。这表示一个正数 “+”。一旦达到这个数字,它就会回到 -1 或 0x80000001,这个过程继续。

Now all of this is really academic, because increments occur every 30 minutes in a stable network. Never in all the history of networking have these increments wrapped around to the initial sequence number because it will take over 600 years to do so, and OSPF has been around only several decades!
现在所有这些都是纯学术的,因为在稳定的网络中,增量每 30 分钟发生一次。在整个网络历史中,这些增量从未回到初始序列号,因为这需要超过 600 年的时间,而 OSPF 仅存在几十年!

Links: 链接:

https://forum.networklessons.com/t/ospf-lsas-and-lsdb-flooding-tutorial/915/51?u=lagapides

https://networklessons.com/ospf/ospf-lsas-and-lsdb-flooding-tutorial


via:

  • OSPF LSA Sequence Numbers

    https://notes.networklessons.com/ospf-lsa-sequence-numbers


其他参考

  • OSPF 中的 LSA 序列号 - CSDN 博客 iteye_13558 于 2010-03-10 15:49:57 发布

    https://blog.csdn.net/iteye_13558/article/details/81829985

  • OSPF LSA Sequence Number 的起始值是 0x80000001_思科技术安全的技术博客_51CTO 博客 Cisco1841sw 2013-03-05 10:19:03

    https://blog.51cto.com/1841cisco/1147372

  • OSPF 序列号问题_ospf 序号 - CSDN 博客 马立杰 于 2024-05-06 10:04:15 发布

    https://blog.csdn.net/i12344/article/details/138460612

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

set,map(java)

前言:要了解set和map,首先需要对搜索树和哈希有一定的了解,才能进一步深入的了解set和map。 1.搜索树 (1)性质: 若它的左子树不为空,则左子树上所有节点值都小于根节点的值。 若它的右子树不…

事件如何驱动图表运行

状态流图如何响应事件 Stateflow图表仅在以循环方式响应事件时执行。 由于图表在单个线程上运行,因此基于事件发生的操作对该事件是原子性的。图表中由事件引起的所有活动都在执行返回到接收事件之前发生的活动之前完成。一旦事件启动了一个操作,除非被…

全网最全程序员接单网站

程序员客栈-领先的程序员自由工作平台-程序员兼职 (proginn.com) 闲鱼 - 闲不住,上闲鱼! (goofish.com) 猪八戒网-品质企业服务 就找猪八戒 (zbj.com) 电鸭社区-专注远程工作招聘交流-远程工作,从电鸭开始 (eleduck.com) 开源众包-百万开发者…

Java台球厅助教教练预约上门到店系统源码

🎱一杆在手,天下我有!台球助教教练预约系统,让球技飙升不是梦🚀 🎯【开篇:台球爱好者的福音来啦!】🎯 还在为找不到合适的台球教练而烦恼吗?或是想要在家就…

代码实践思考:C++和Python

起因 在人工智能工具日益强大的今天 如何更高效的进行代码学习 如何借助智能工具实现代码转换? 是否直接可以使用?为何? 如何实现不同的编程语言之间代码的无损转换? x86与arm C 云课五分钟-02第一个代码复现-终端甜甜圈C-CS…

GEE错误——文件导出的时候出现Error: User memory limit exceeded. (Error code: 3)

错误简介 在试图将我的表导出到资产文件夹,但出现了内存错误。我不知道我做错了什么。相同的脚本适用于其他年份。文件导出的时候出现Error: User memory limit exceeded. (Error code: 3) 函数 reduceToVectors(reducer, geometry, scale, geometryType, eightConnected,…

雪花算法的一些问题解析

前言 最近做项目,有些老旧项目,需要生成分布式唯一ID,不允许重复,此时如果要对其他中间件和数据库依赖小,那么就需要一套固定的ID生成规则,雪花算法就正当合适,当时Twitter就是用来存储数据库I…

服务器主机安全有多重要

一、什么是主机安全 主机安全,作为维护计算机系统核心安全的基石,旨在全面捍卫硬件与软件免受任何未经授权的侵扰、篡改、数据泄露等安全挑战。这一过程不仅聚焦于数据存储与处理的保密性、完整性及可用性,还深入至硬件构造、固件层、以及系…

利用C++11的异步操作实现一个线程池

利用C11的异步操作实现一个线程池 利用C11的异步操作实现一个线程池 介绍关于一些代码细节的解释测试 介绍 基于线程池执行任务的时候,入口函数内部执行逻辑是固定的,因此选择std::packaged_task加上std::future的组合来实现。 具体使用可以见我上一…

2025年第7届图像处理和机器视觉国际会议 (IPMV 2025)即将召开!

2025年第7届图像处理和机器视觉国际会议 (IPMV 2025)将于2025年1月10日-12日在中国香港举行。图像处理和机器视觉作为当代信息技术领域的重要分支,不仅推动了人工智能技术的飞速发展,也为各行各业带来了革命性的变革。本次会议旨在汇聚全球图像处理和机器…

极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

目录 极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图 一、环境要求 二、初识Vue Flow 2.1、安装Vue Flow 2.2、Vue Flow构成 2.3、一个小坑 2.4、入门案例 三、Vue Flow优秀的自定义功能 3.1、引入 3.2、节点与连线的自定义 ①打样(…

MySQL - 通过SQL语句导出数据到CSV文件

在 MySQL 中,可以使用 SELECT ... INTO OUTFILE 语句将查询结果导出为 CSV 文件,然后再将 CSV 文件转换为 Excel 格式。以下是一个示例: SELECT column1, column2, column3 INTO OUTFILE /path/to/file.csv FIELDS TERMINATED BY , ENCLO…

git 迁移仓库的方法

git Git是一个开源的分布式版本控制系统,由Linus Torvalds在2005年创建,用于有效、高速地处理从小到大的项目管理。它最初是为Linux内核开发而设计的,但很快被广泛用于各种项目。 以下是Git的一些主要特性: 分布式架构&#xff…

接近传感器 - 从零开始认识各种传感器【第十七期】

1、什么是接近传感器 接近传感器常被用于检测物体的距离或者是否有物体靠近。它通常发射电磁场或电磁波(例如红外线)来探测物体的位置。当有物体靠近时,传感器会接收到反射的电磁波信号,从而触发相应的电路或者控制系统。它广泛应…

Helm(二)

一、Chart模板流程控制if_with_range 1.if 修改values.yaml cat > values.yaml <<EOF myname: yeunyi service: type: ClusterIP port: 80 myport: 8080 EOF 修改service.yaml cat > templates/service.yaml <<EOF apiVersion: v1 kind: Service met…

TC8:SOMEIP_ETS_007-008

SOMEIP_ETS_007: echoBitfields 目的 检查位字段是否能够被顺利地发送和接收。 测试步骤 Tester:创建SOME/IP消息Tester:使用method echoBitfields发送SOME/IP消息DUT:返回method响应消息,其中位字段的顺序与请求相比是反向的期望结果 3、DUT:返回method响应消息,其中位…

微软蓝屏”事件暴露了网络安全哪些问题?

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

探秘数字孪生技术在智慧校园的应用

在当今教育信息化的浪潮中&#xff0c;数字孪生技术逐渐成为智慧校园建设的重要助推器。这一技术通过构建真实世界的数字化映像&#xff0c;不仅提升了校园管理的效率&#xff0c;更为师生的日常学习生活提供了全新的体验。首先&#xff0c;数字孪生可以将校园内的各类设施、环…

七夕告白攻略:天使智能体教你如何设计完美表白卡片!独属程序员地浪漫!

文章目录 &#x1f495;七夕浪漫告白天使&#x1f495;&#x1f495;浪漫风格的表白卡片设计&#x1f495;&#x1f495;甜蜜风格的表白卡片设计&#x1f495;&#x1f495;温馨风格的表白卡片设计&#x1f495;&#x1f495;幽默风格的表白卡片设计&#x1f495;&#x1f495;…

使用java读取本地文件内容并输出,java读取文件内容,节省内存开销

java使用FileInputStream读取本地文件内容 java使用Stream流读取本地文件内容 1.先在自己笔记本选一个目录创建文件&#xff0c;这里就选择在D盘创建一个 word.txt文件 随意输入内容例如 2.直接来直接复制代码运行 import java.io.*; import java.nio.file.Files; import ja…