键入网址到网页显示,期间发生了什么


 HTTP

浏览器做的第一步工作是解析URL

首先浏览器做的第一步工作就是要对URL进行解析,从而生成发送给 web 服务器的请求信息。

 所以图中长长的URL实际上是请求服务器里的文件资源。

如果图中的蓝色部分URL元素省略了,那应该请求哪个文件呢?

当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者  /default.html ,这样就不会发生混乱了。

生成HTTP请求信息

对URL进行解析后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息生成HTTP请求消息。


DNS-真实地址查询

通过浏览器解析URL并生成HTTP消息后,需要委托操作系统将消息发送给Web服务器。

但是在发送前,还有一项工作需要完成,那就是查询服务器域名对应的IP地址,因为委托操作系统发送消息时,必须提供通信对象的IP地址。

比如我们在打电话的时候,必须要直到对方的电话号码,但由于电话号码难以记忆,所以通常我们会将电话号+姓名保存在通讯录里。

所以,有一种服务器就专门保存了Web服务器域名与IP的对应关系,即DNS服务器。

域名的层级关系

DNS中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表不同层次之间的界限

在域名汇总,越靠右的位置表示其层级越高(外国的使用习惯)

实际上域名最后还有一个点,比如 www.server.com.,这个最后的点代表根域名。也就是 . 根域是在最顶层,它的下一层就是 .com 顶级域,在下面是 server.com

所以域名的层级关系类似一个树状结构:

  • 根 DNS 服务器 . 
  • 顶级域 DNS 服务器 .com
  • 权威 DNS 服务器 server.com

根域的DNS服务器信息保存在互联网中所有的DNS服务器中。

这样一来,任何DNS服务器就都可以找到并访问根域DNS服务器了。

因此客户端主要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再顺藤摸瓜找到位于下层的某台目标DNS服务器。

域名解析的工作流程

  1. 客户端首先会发出一个DNS请求,问www.server.com的 IP 是什么,并发给本地 DNS 服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)。
  2. 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com,则它直接返回IP地址。如果没有,本地DNS会去问它的根域名服务器。根域名服务器是最高层次的,它不会直接用于域名解析,但能指明一条路。
  3. 根DNS收到来自本地DNS的请求后,发现后置的是.com,说:“www.server.com这个域名归.com区域管理,我给你.com顶级域名的地址,你去问问他吧”。
  4. 本地DNS收到顶级域名服务器的地址后,发起请求问顶级域名服务器:“你能告诉我www.server.com的IP地址吗?”。
  5. 顶级域名服务器说:“我给你负责www.server.com区域的权威DNS服务器的地址,你去问问它吧”。
  6. 本地DNS于是转向问权威DNS服务器:“www.server.com对应的IP盘地址是什么?”server.com的权威DNS服务器,它是域名解析结果的原出处。
  7. 权威DNS服务器查询后将对应的IP地址 x.x.x.x告诉本地DNS。
  8. 本地DNS再将IP地址返回客户端,客户端和目标建立连接。

 DNS 域名解析的整个过程就和我们日常生活中找人问路的过程类似,只指路不带路

那是不是每次解析域名都要经过那么多的步骤呢?

当然不是了,还有缓存这个东西。

浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。


协议栈-指南帮手

通过DNS获取到IP后,就可以把HTTP的传输工作交给操作系统中的协议栈。

协议栈的内部分为几个部分,分别承担着不同的工作。上下关系是有一定的规则的,上面的部分会向下面的部分委托工作,下面的部分收到委托的工作并执行。

应用程序(浏览器)通过调用socket库,来委托协议栈工作。协议栈的上部分有两块,分别是负责收发数据的TCP和UDP协议,这两个传输协议会接受应用层的委托执行收发数据的操作。

协议栈的下面一半是用IP协议控制网络包收发操作,在互联网上传数据时,数据会被切分为一块块的网络包,而将网络包发送给对方的操作就是由IP负责的。

此外IP中还包括ICMP协议和ARP协议

  • ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息
  • ARP 用于根据IP地址查询相应的以太网MAC地址。

IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。


TCP-可靠传输

TCP报文头部格式:

首先、源端口号目标端口号是不可少的,如果没有这两个端口号,数据就不知道应该发送给哪个应用。

接下来有包的序号,这个是用来解决包乱序的问题。

确认序列的目的是确认发出去对方是否收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包问题。

接下来还有一些状态位。例如 SYN 是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等。TCP是面向连接的,因而双方要维护连接的状态,这些带状态的包的发送会引起双方的状态变化。

 还有一个重要的就是窗口大小。TCP要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够处理的能力,别发送太快,也别太慢。

除了做流量控制外,TCP还会做拥塞控制

TCP传输数据之前,需要三次握手建立连接

在HTTP传输数据之前,首先需要TCP建立连接,TCP连接的建立,通常称为三次握手

这个所谓的 连接 ,只是双方计算机里维护的一个状态机,在建立连接的过程中,双方的状态变化时序图如下:

  • 一开始,客户端和服务端都处于 CLOSED 状态,先是服务端主动监听某个窗口,处于 LISTEN 状态。
  • 然后客户端主动发起连接 SYN ,之后处于 SYN-SENT 状态。
  • 服务端收到发起的连接,返回 SYN ,并且 ACK 客户端的 SYN ,之后处于 SYN-RCVD 状态。
  • 客户端收到服务端发送的SYNACK后,发送对SYN确认的ACK,之后处于 ESTABLISHED 状态,因为它一发一收成功了。
  • 服务端收到 ACK ACK 后,处于 ESTABLISHED 状态,因为它也一发一收成功了。

 三次握手的目的是确保双方都有发送和接收的能力

TCP分割数据

如果HTTP请求消息比较长,超过了MSS的长度,这时 TCP 就需要把 HTTP 的数据拆解成一块块的数据发送,而不是一次性发送所有数据。

  • MTU:一个网络包的最大长度,以太网中一般为 1500 字节
  • MSS:除去 IP 和 TCP 头部后,一个网络包所能容纳的TCP数据的最大长度。

数据会被以MSS的长度为单位进行划分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上TCP头部信息,然后交给IP模块来发送数据。

 TCP报文生成

TCP协议里有两个端口,一个是浏览器监听的窗口(通常是随机生成的),一个是 Web服务器监听的端口 (HTTP默认端口号是 80 ,HTTPS默认端口号是 433 )

双方建立了连接后,TCP报文中的数据部分就是存放HTTP头部 + 数据,组装好 TCP 报文后,就需要交给下面的网络层处理。


IP-远程定位

TCP模块在执行连接、收发、断开等各阶段操作时,就需要委托IP模块将数据封装成网络包发送给通信对象。

IP包头格式

在IP协议里面需要有源地址IP和目标地址IP:

  • 源地址IP,客户端输出的IP地址
  • 目标地址,通过DNS域名解析到的Web服务器IP。

因为HTTP是经过TCP传输的,所以在IP包头的协议号,要填写为06 (十六进制),表示协议为TCP。

 

IP报文生成

至此,网络包的报文如下图:


 

MAC-两点传输

生成IP头部之后,接下来网络包还需要在IP头部的前面加上MAC头部

MAC包头格式

MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息。

 在MAC包头里需要发送方MAC地址和接收方目标MAC地址,用于两点之间的传输。

一般在TCP/IP通信里,MAC包头的协议类型只使用:

  • 0800:IP协议
  • 0806:ARP协议

MAC发送方和接收方如何确认?

发送方的MAC地址获取比较简单,MAC地址是在网卡生产时写入到ROM里的,只要把这个值读取出来写入到MAC头部就可以了。

接收方的MAC地址就有点复杂,只要告诉以太网对方的MAC地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的MAC地址。

所以得先搞清楚应该把包发给谁,这个只需要查一下路由表就知道了。在路由表中找到匹配的条目,然后把包发给Gateway列中的IP地址就行了

既然知道发给谁,该如何获取对方的MAC地址呢?

此时就需要ARP协议帮我们找到路由器的MAC地址

ARP协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个IP地址是谁的?请把MAC地址告诉我”

 然后子网中的设备如果确认是自己的IP就是回复MAC地址。然后将这个MAC地址写入到MAC头部,MAC头部就完成了。

后续操作系统会把本次查询的结果放到一块叫做ARP缓存的内存空间留着以后用,不过缓存的时间只有几分钟。

也就是说,在发包时:

  • 先查询ARP缓存,如果其中已经保存了对方的MAC地址,就不需要发送ARP查询,直接使用ARP缓存中的地址。
  • 而当ARP缓存中不存在对方MAC地址时,则发送ARP广播查询。

查看ARP缓存内容

在Linux系统中,我们可以使用 arp -a 命令来查看ARP缓存的内容。

MAC报文生成


网卡-出口

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。

负责执行这一块操作的是网卡,要控制网卡还需要网卡驱动程序

网卡驱动获取网络包后,会将其复制到网卡内的缓冲区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列

  • 起始分界符是一个用来表示包起始位置的标记
  • 末尾的 FCS (帧校验序列)用来检查包传输过程是否有损坏

 最后网卡会将包转换为电信号,通过网线发送出去。


交换机-送别

交换机的设计是将网络包原样转发到目的地。交换机工作在MAC层,也称为二级网络设备

交换机的包接收操作

首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。

然后通过包末尾的FCS校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。

计算机的网卡本身具有MAC地址,并通过核对收到的包的接收方MAC地址判断是不是发给自己的,如果不是发给自己的,则丢弃;相对的,交换机的端口不核对接收方MAC地址,而是直接接受所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有MAC地址

将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录。

交换机的MAC地址表主要包含两个信息:

  • 一个是设备的MAC地址
  • 另一个是该设备连接在交换机的哪个端口上

如果收到的包的接收方的MAC地址为 00-02-B3-1C-9C-F9则与图中表中的第 3 行匹配,根据端口列的信息,可知这个地址位于 3 号端口上,然后就可以通过交换电路将包发送到相应的端口了。

 所以,交换机根据MAC地址表查询MAC地址,然后将信号发送到相应的端口

当MAC地址表找不到指定的MAC地址会怎么样?

地址表中找不到指定的MAC地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。

这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。

这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包

那么这样做会发送多余的包,会不会造成网络阻塞呢?

其实完全不用担心,因为发送了包之后目标设备会做出响应,只要返回了响应包,交换机就可以将它的地址写入到MAC地址表,下次也就不需要把包发到所有的端口了。

此外,如果接收方MAC地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口,以下两个属于广播地址:

  • MAC地址中的 FF:FF:FF:FF:FF:FF
  • IP地址中的255.255.255.255

路由器-出境大门

路由器与交换机的区别

网络包经过交换机后,到达了路由器,并且在此被转发到了下一个路由器或目标设备。

这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。

不过在具体操作过程上,交换机和路由器是有区别的。

  • 因为路由器是基于IP设计的,俗称三级网络设备,路由器的各个端口都具有MAC地址和IP地址
  • 而交换机是基于以太网设计的,俗称二级网络设备,交换机的端口不具有MAC地址。

路由器的基本原理

路由器的端口具有MAC地址,因为它就能够成为以太网的发送方和接收方;同时还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。

当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发出去。

路由器的包接收操作

首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。

如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

总的来说,路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

查询路由表确定输出端口

完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。

转发操作分为几个阶段,首先是查询路由表判断转发目标。

 具体的工作流程根据上图,举个例子。

假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.100 的服务器发送一个包,这个包先到达图中的路由器。

判断转发目标的第一步,就是根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。

路由匹配和前面讲的一样,每个条目的子网掩码和 192.168.1.100 IP 做 & 与运算后,得到的结果与对应条目的目标地址进行匹配,如果匹配就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。

如第二条目的子网掩码 255.255.255.0 与 192.168.1.100 IP 做 & 与运算后,得到结果是 192.168.1.0 ,这与第二条目的目标地址 192.168.1.0 匹配,该第二条目记录就会被作为转发目标。

实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。

路由器的发送操作

接下来就会进入包的发送操作

首先,我们需要根据路由表的网关列判断对方的地址。

  • 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
  • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点

知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。

路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。

接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。

网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。

发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

PS:在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。


服务器与客户端-互相扒皮

数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。

接着继续扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。

 于是,扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP 头部里面还有端口号, HTTP 的服务器正在监听这个端口号。

于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。

服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。

HTTP 响应报文也需要穿上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。

穿好头部衣服后,从网卡出去,交由交换机转发到出城的路由器,路由器就把响应数据包发到了下一个路由器,就这样跳啊跳。

最后跳到了客户端的城门把守的路由器,路由器扒开 IP 头部发现是要找城内的人,于是又把包发给了城内的交换机,再由交换机转发到客户端。

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

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

相关文章

ARM裸机-12(GPIO和LED)

1、点亮LED 1.1、硬件工作原理及原理图查阅 1.1.1、LED物理特性 LED本身有2个接线点,一个是LED的正极,一个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗…

智能化RFID耳机装配系统:提升效率、精准追踪与优化管理

智能化RFID耳机装配系统:提升效率、精准追踪与优化管理 在当今的智能化时代,无线射频识别技术(RFID)被广泛应用于各个行业。本文将介绍一种基于RFID技术的智能耳机装配案例,通过RFID技术实现耳机装配过程的自动化控制…

vue 新学习 04 css样式绑定,渲染,key的重要意义

之前的html文件如何去绑定css样式&#xff1f; 01.首先在html文件中&#xff0c;在<head>标签中&#xff0c;用<style>中去写样式&#xff0c;通过html标签(每一个标签都有这样子的属性)中的class或者是id属性来完成<style>中的描绘的样式的用。 例子&#x…

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循…

操作系统启动后网络还需要比较慢的时间才启动(差不多二分钟)

环境 linux 4.14.61 systemd version 247.3 问题 启动时发现网络其实很快就起来了&#xff0c;但是mqtt和docker启动的很慢&#xff0c;导致相关依赖启动很慢。 问题分析 实际通过systemctl list-units发现systemd-networkd-wait-online启动失败 而且从字面上看也有延时…

图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

大家好&#xff0c;最近重新整理了一版 TCP 三次握手和四次挥手的面试题&#xff08;2023最新版&#xff09;。 ----- 任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 巨巨巨巨长的提纲&#xff0c;发车&#xff01;发车&#xff01; img TCP 基本认识 TCP 头格式有哪些…

【Selenimu+AutoIT】非input标签上传文件(带参数)

工具下载 非input标签上传文件&#xff0c;就需要借助第三方工具&#xff0c;如AutoIT。 AutoIT下载 安装步骤略 使用 1.打开Auto Window Info 找到这个打开 拖住红框里面的标到需要定位的地方记录下来 2.打开SciTE Script Editor 打开后&#xff0c;修改为UTF-8&am…

统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)

统信UOS离线全套安装教程&#xff08;手把手教程&#xff09; 银河麒麟的各种离线全套安装教程&#xff1a; https://blog.csdn.net/ACCPluzhiqi/article/details/131988147 1.统信UOS桌面系统安装mysql&#xff08;mariadb&#xff09; 2.统信UOS桌面系统安装JDK 3.统信UOS桌…

【iOS】App仿写--天气预报

文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报&#xff0c;特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页&#xff0c;搜索界面&#xff0c;添加界面&#xff0c;浏…

【NLP概念源和流】 04-过度到RNN(第 4/20 部分)

接上文 【NLP概念源和流】 03-基于计数的嵌入,GloVe(第 3/20 部分) 一、说明 词嵌入使许多NLP任务有了显著的改进。它对单词原理图的理解以及将不同长度的文本表示为固定向量的能力使其在许多复杂的NLP任务中非常受欢迎。大多数机器学习算法可以直接应用于分类和回归任务的…

【vue】 vue2 监听滚动条滚动事件

代码 直接上代码&#xff0c;vue单文件 index.vue <template><div class"content" scroll"onScroll"><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/&#xff0c;下载对应CUDA版本的PyTorch【不能直接pip install&#xff0c;否则安装上的是CPU版本的】 2. 查看GPU信息 &#xff08;1&#xff09;重要信息 !nvidia-smi我的GPU版本很垃圾&#xff0c;本blog仅…

COMSOL三维多孔介质3D多相材料颗粒夹杂复合材料达西渗流模拟

在实际工程中渗流路径往往不是单一材料&#xff0c;如渗流发生在夹杂碎石的土体中&#xff0c;这就造成渗流的复杂性。这里采用两项材料通过COMSOL达西定律模块对渗流进行模拟。 模型采用CAD随机球体颗粒&过渡区插件建立后导入到COMSOL软件内。 模型包括渗流发生的外侧基…

SOP/详解*和**/python数据结构(iter,list,tuple,dict)/ 解包

一、错误解决合集 1. > combined_seq.named_children() 2. isinstance 2th parameter : must be a type or tuple of types > 改为tuple&#xff0c;不要用列表。改为 LLLayer (nn.Conv2d,nn.Linear) 3. File “test.py”, line 90, in calculate_fin_fout print(“hi”…

非线性弹簧摆的仿真(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

<van-empty description=““ /> 滚动条bug

使用 <van-empty description"" /> 时&#xff0c;图片出现了个滚动条&#xff0c;图片可以上下滑动。 代码如下&#xff1a; <block wx:if"{{courseList.length < 0}}"><van-empty description"" /> </block> <…

教你使用Pyinstaller将Python源码打包成可执行程序exe的方法

pyinstaller是一个常用的Python打包工具&#xff0c;可以将Python程序打包成独立的可执行文件&#xff0c;支持Windows、Linux和macOS等平台。 ★★★Pyinstaller有许多参数&#xff0c;以下是其中一些主要参数的含义&#xff1a; -F, --onefile&#xff1a;打包一个单个文件…

项目管理困扰?这里有个6W3H解决方案

引言 在项目管理的过程中&#xff0c;我们经常面临各种各样的挑战和问题。例如&#xff0c;如何确定项目的目标&#xff1f;如何分配资源&#xff1f;何时开始执行项目&#xff1f;在哪里进行项目&#xff1f;这些问题如果没有得到正确的解答&#xff0c;将会严重影响项目的进…

【C++】初阶 --- 引用(超级详细版!!!)

文章目录 &#x1f36a;一、引用的概念&#x1f36a;二、引用的特性&#x1f37f;1、引用在定义时必须初始化&#x1f37f;2、一个变量可以有多个引用&#x1f37f;3、引用一旦引用一个实体&#xff0c;再不能引用其他实体 &#x1f36a;三、常引用(被const 修饰的引用)&#x…