当前位置: 首页 > news >正文

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

文章目录

      • 键入网址到网页显示,期间发生了什么?
        • 1. HTTP
        • 2. 真实地址查询 —— DNS
        • 3. 指南好帮手 —— 协议栈
        • 4. 可靠传输 —— TCP
        • 5. 远程定位 —— IP
        • 6. 两点传输 —— MAC
        • 7. 出口 —— 网卡
        • 8. 送别者 —— 交换机
        • 9. 出境大门 —— 路由器
        • 10. 互相扒皮 —— 服务器与客户端

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

总结:
浏览器解析URL地址,根据解析得到的Web服务器和请求文件路径创建HTTP请求消息 
=> 委托操作系统将该消息发送给Web服务器,故需要Web服务器的IP地址 
=> 根据Web服务器的域名通过DNS查询Web服务器的IP地址
=> 查询到IP地址后,浏览器调用socket库委托协议栈 
=> TCP报文(三报文握手,与服务器建立连接) 
=> IP报文 => MAC报文 => 网卡(将数字信号转换为电信号在网线上传输)
=> 交换机 => (离开子网)路由器...... 
=> 路由器 => 交换机 
=> 服务器 => 服务器进行扒皮 => 将请求的网页封装在HTTP响应报文
=> 加TCP、IP、MAC头部
=> 网卡 => 交换机 => 路由器....
=> 路由器 => 交换机 
=> 客户端 => 客户端扒皮 => 给浏览器渲染页面 
=> 客户端四报文挥手 => 连接断开
1. HTTP

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

在这里插入图片描述

当蓝色部分URL元素省略,请求的是根目录下事先设置的默认文件

第二步:生产HTTP请求信息

根据web服务器和文件名生成HTTP请求

请添加图片描述

2. 真实地址查询 —— DNS

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

发送前,查询服务器域名对应的IP地址,委托OS发送消息必须提供IP地址

DNS服务器: 保存Web服务器域名与IP的对应关系

域名的层级关系

由.分割,www.server.com 越靠右层级越高(其实com后还有一个.,代表根域名)

类似于树状结构

DNS 树状结构

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

因此,客户端只要找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,再一路找到位于下层的某台目标DNS服务器

域名解析的工作流程

在①中,若本地DNS服务器在缓存里找到www.server.com则直接返回其IP地址,否则②

在这里插入图片描述

(指路不带路)

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

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

3. 指南好帮手 —— 协议栈

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

在这里插入图片描述

上面的部分向下面的部分委托工作

应用程序(浏览器)通过调用socket库,来委托协议栈工作。

协议栈:

  • 上部分:负责收发数据的TCP协议和UDP协议,接收应用层的委托执行收发数据的操作
  • 下部分:IP协议,控制网络包收发操作,将网络包发送给对方
    • IP中还包括 ICMP 协议 和 ARP协议
      • ICMP:告知网络包传送过程中产生的错误以及各种控制信息
      • ARP:根据IP地址查询相应的以太网MAC地址

IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作

数据包看了这份指南表示:“原来我需要那么多大佬的协助啊,那我先去找找 TCP 大佬!”

4. 可靠传输 —— TCP

HTTP基于TCP协议传输

TCP报文头部格式

在这里插入图片描述

  • 源端口号、目的端口号:必不可少,如果没有,数据不知道发送给哪个应用

  • 序号:解决包乱序的问题

  • 确认号:目的是确认发出去对方是否收到,如果没有收到就应该重新发送,直到送达。解决丢包的问题

  • 状态位:

    • SYN:发起一个连接
    • ACK:回复
    • RST:重新连接
    • FIN:结束连接

    TCP是面向连接的,因此双方要维护连接状态,这些带状态位的包的发送,会引起双方状态变更

  • 窗口大小:

    • 流量控制
    • 拥塞控制:控制发送的速度

TCP三次握手连接

在这里插入图片描述

  • 客户端、服务端都处于CLOSE状态,先是服务端主动监听某个端口,处于LISTEN状态。 [ 收听状态 ]
  • 客户端向服务端发起连接 SYN=1,seq=x,之后处于SYN-SENT状态 [ 同步已发送状态 ](SYN报文段不携带数据,但消耗一个序号)
  • 服务端收到SYN后,发送SYN=1,ACK=1(ACK客户端的SYN),ack=x+1,seq=y,之后服务端处于SYN-RCVD状态 [ 同步收到状态 ]
  • 客户端收到服务端的SYN和ACK后,发送对SYN的确认ACK = 1,seq=x+1,ack=y+1,之后客户端处于ESTABLISHED状态 [ 连接已建立 ],一发一收
  • 服务端收到ACK的ACK后,处于ESTABLISHED状态,一发一收

服务器端的资源在完成第二次握手时分配,客户端的资源在完成第三次握手 时分配

查看TCP的连接状态

Linux: netstat -napt

TCP分割数据

HTTP请求消息较长,超过MSS长度,需要把HTTP的数据拆解成一块块的数据发送

在这里插入图片描述

MTU:网络包的最大长度,以太网中一般为1500字节

MSS:除去IP和TCP头部后,一个网络包所能容纳的TCP数据的最大长度

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

在这里插入图片描述

TCP报文生成

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

双方建立连接后,TCP报文中数据部分存放HTTP头部+数据,TCP报文需交给网络层处理

TCP报文 = TCP头部+HTTP报文

5. 远程定位 —— IP

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

IP报文头部格式

在这里插入图片描述

  • 源地址IP:客户端输出的IP地址
  • 目标地址IP:通过DNS域名解析得到的Web服务器IP
  • 协议号:HTTP是经过TCP传输,IP包头的协议号填写06(十六进制),表示协议为TCP

假设客户端有多个网卡,就会有多个IP地址,IP头部的源地址选择哪个IP?

在多块网卡中判断应该选择哪块网卡发送包

根据路由表 规则,判断哪一个网卡作为源地址IP

Linux中使用 route -n 查看当前系统的路由表

在这里插入图片描述

假设Web服务器的目标地址是

192.168.10.200

将该目标地址与每条条目的子网掩码进行与运算,一致则匹配成功

注:第三条条目的目标地址和子网掩码都是0.0.0.0,表示默认网关 ,如果其他所有条目都无法匹配,就会自动匹配这一行。并且后续就把包发给路由器,Gateway 即是路由器的 IP 地址。

IP报文 = IP头部+TCP头部+HTTP报文

6. 两点传输 —— MAC

网络包还需要在IP头部前面加上MAC头部

MAC包头格式

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

MAC包头:发送方MAC地址、接收方目标MAC地址、协议类型

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

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

确认发送方和接收方的MAC地址

  • 发送方:网卡生产时写入到ROM,只要将该值读取即可
  • 接收方:只要告诉以太网对方的MAC地址,以太网就会帮我们把包发送过去
    • 搞清楚应该把包发给谁,这个只要查一下路由表就知道了。在路由表中找到相匹配的条目,然后把包发给 Gateway 列中的 IP 地址就可以了。

已知接收方的IP地址,获取MAC地址

ARP协议: 广播形式

在这里插入图片描述

OS会把本次查询结果放到 ARP缓存 的内存空间留着以后用

发包时:先查询ARP缓存,如果其中已经保存了对方的MAC地址,就不需要发送ARP查询;若不存在,则发送ARP广播查询

查看ARP缓存内容

Linux: arp -a

MAC报文 = MAC头部 + IP头部 + TCP头部 + HTTP报文

7. 出口 —— 网卡

网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方

数字信息转换为电信号 ,才能在网线上传输,这才是真正的数据发送过程

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

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

  • 起始帧分界符:表示包起始位置的标记
  • FCS:检查包传输过程是否有损坏

网卡将包转为电信号,通过网线发送出去

8. 送别者 —— 交换机

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

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

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

计算机网卡 vs. 交换机计算机网卡本身具有MAC地址,并通过核对收到的包的接收方MAC地址判断是不是发给自己,如果不是则丢弃交换机端口不具有MAC地址,不会核对接收方MAC地址,直接接收所有包到缓冲区。将包存入缓冲区后,查询这个包的接收方MAC地址是否已经在MAC地址表有记录

交换机的MAC地址表

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

在这里插入图片描述

根据MAC地址找到对应端口,将信号发送到相应端口

MAC地址表找不到指定MAC地址?

原因:

  • 具有该地址的设备还没有向交换机发送过包
  • 这个设备一段时间没有工作导致地址被从地址表删除

解决:

交换机将包发送到除了源端口之外的所有端口。相应的接收者才会接收包,其他设备则忽略这个包。发送包后,目标设备返回响应包,交换机就可以将该MAC地址下入MAC地址表,下次可以直接查询

如果接收方MAC地址是一个广播地址,交换机会将包发送到除源端口之外的所有端口

(MAC:FF:FF:FF:FF:FF:FF IP:255.255.255.255)

数据包通过交换机转发抵达了路由器,准备要离开土生土长的子网了。

9. 出境大门 —— 路由器

网络包经过交换机后,到达路由器,并在此被转发到下一个路由器或目标设备(也是通过查表判断包转发的目标)

路由器与交换机的区别

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

路由器基本原理

路由器端口具有MAC地址:能成为以太网的发送方和接收方

路由器端口具有IP地址:和计算机网卡一样

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

路由器的包接收

电信号到达网线接口部分,路由器的模块将电信号转换为数字信号,通过包末尾的FCS进行错误校验。

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

查询路由表确定输出端口

  1. 完成包接收后,路由器去掉包开头的MAC头部

    MAC头部的作用就是将包送达路由器,接收方MAC地址就是路由器端口的MAC地址,包到达路由器后,MAC头部的作用完成,丢弃MAC头部

  2. 接下来,路由器根据MAC头部后的IP头部进行包转发操作

    查询路由表做转发操作(同子网掩码与,看是否与对应条目的目标地址相同),若无匹配条目,则转发给默认路由

在这里插入图片描述

路由器的发送

根据 路由表的网关列 判断对方的地址

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

知道IP地址后,根据ARP协议,查询到接收方MAC地址(路由器中也有ARP缓存)

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

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

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

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

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

数据包通过多个路由器道友的帮助,在网络世界途经了很多路程,最终抵达了目的地的城门!城门值守的路由器,发现了这个小兄弟数据包原来是找城内的人,于是它就将数据包送进了城内,再经由城内的交换机帮助下,最终转发到了目的地了。

10. 互相扒皮 —— 服务器与客户端

在这里插入图片描述

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

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

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

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

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

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

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

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

客户端收到了服务器的响应数据包后,同样也非常的高兴,客户能拆快递了!

于是,客户端开始扒皮,把收到的数据包的皮扒剩 HTTP 响应报文后,交给浏览器去渲染页面,一份特别的数据包快递,就这样显示出来了!

最后,客户端要离开了,向服务器发起了 TCP 四次挥手,至此双方的连接就断开了。

相关文章:

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

文章目录 键入网址到网页显示,期间发生了什么?1. HTTP2. 真实地址查询 —— DNS3. 指南好帮手 —— 协议栈4. 可靠传输 —— TCP5. 远程定位 —— IP6. 两点传输 —— MAC7. 出口 —— 网卡8. 送别者 —— 交换机9. 出境大门 —— 路由器10. 互相扒皮 —…...

深度学习基于Python+TensorFlow+Django的水果识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介简介技术组合系统功能使用流程 二、功能三、系统四. 总结 一项目简介 # 深度学习基于PythonTensorFlowDjango的水果识别系统介绍 简介 该水果识别系统基于…...

vs动态库生成过程中还存在静态库

为什么VS生成动态库dll同时还会生成lib静态库 动态库与静态库(Windows环境下) ​ 动态库和静态库都是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 ​ 静态库实际上是在链接时被链接到exe的,编译后,静态…...

P13 C++ 类 | 结构体内部的静态static

目录 01 前言 02 类内部创建静态变量的例子 03 在类的内部创建静态变量的作用 04 最后的话 01 前言 本期我们讨论 static 在一个类或一个结构体中的具体情况。 在几乎所有面向对象的语言中,静态在一个类中意味着特定的东西。这意味着在类的所有实例中&#xff…...

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试

为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库? 亮点:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的负担(搭建一个生产环境的模型实在耗费精力和体力)。 腾讯云向量数据库是什么? 腾…...

git clone -mirror 和 git clone 的区别

目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统,通过Git可以方便地管理代码的版本和协作开发。在使用Git时,常见的操作之一就是通过git clone命令将远程仓库克隆…...

基于51单片机的公交自动报站系统

**单片机设计介绍, 基于51单片机的公交自动报站系统 文章目录 一 概要公交自动报站系统概述工作原理应用与优势 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 很高兴为您介绍基于51单片机的公交自动报站系统: 公交自动报…...

NextJS开发:Image组件的使用及缺陷

Next.js 中的 Image 组件相比于传统的 img 标签有以下几个优点: 懒加载:Image 组件自带懒加载,当页面滚动到 Image 组件所在位置时才会加载图片,从而加快页面的渲染速度。自动优化:Image 组件会自动将图片压缩、转换格…...

网络安全面试经历

2023-11-22 X亭安全服务实习生面试 一面: 工作方向:偏蓝队 总结:实习蓝队面试没有什么难度,没有什么技术上的细节问题,之前准备的细节问题没有考 最后和面试官聊了聊对网安的认识,聊了聊二进制的知识…...

Rust语言入门教程(四) - 数据类型

标量类型(Scalar Types) 在Rust中,一共有4中标量类型, 也就是基本数据类型,分别是: 整型(Integers)浮点型(Floats)布尔型(Boolean)字符型(Chara…...

华为云人工智能入门级开发者认证学习笔记

人工智能入门级开发者认证 人工智能定义 定义 人工智能 (Artificial Intelligence) 是研究、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 强人工智能 vs 弱人工智能 强人工智能:强人工智能观点认为有可能制造出真正能推理&#xff08…...

腾讯云发布新一代基于AMD处理器的星星海云服务器实例SA5

基础设施的硬实力,愈发成为云厂商的核心竞争力。 11月24日,腾讯云发布了全新一代星星海服务器。基于自研服务器的高密设计与硬件升级,对应云服务器SA5是全球首家搭载第四代AMD EPYC处理器(Bergamo)的公有云实例&#…...

算法通关村-----数论问题解析

最大公约数和最小公倍数 概念描述 最大公约数(GCD)是指两个或多个整数共有约数中的最大值。 最小公倍数(LCM)是指两个或多个整数共有的倍数中的最小值 方法介绍 碾转相除法 一种用于计算两个整数的最大公约数(GCD…...

wpf prism当中 发布订阅 IEventAggregator

先订阅后发布 private readonly IEventAggregator _eventAggregator; public LoginViewModel(ILoginService iloginService, IEventAggregator eventAggregator) {_iloginService iloginService;_eventAggregator eventAggregator;_eventAggregator.GetEvent<MessageEven…...

Angular中的getter函数

Angular 中的 getter 函数每次被调用时会返回一个新对象时&#xff0c;这些新对象并不使用同一个堆内存。详细解释一下&#xff1a; Getter 函数的作用是获取某个属性的值。在 Angular 中&#xff0c;getter 函数通常用于获取响应式数据&#xff08;例如 Observables 或 Signal…...

Python----函数的数据 拆包(元组和字典)

Python拆包&#xff1a; 就是把元组或字典中的数据单独的拆分出来&#xff0c;然后赋予给其他的变量。 拆包: 对于函数中的多个返回数据, 去掉 元组, 列表 或者字典 直接获取里面数据的过程。 元组的拆包过程 def func():# 经过一系列操作返回一个元组return 100, 200 …...

vim翻页快捷键

Vim翻页 整页 Ctrlf向下翻页&#xff0c;下一页&#xff0c;相当于Page DownCtrlb向上翻页&#xff0c;上一页&#xff0c;相当于Page Up 半页 Ctrld向下半页&#xff0c;下一半页&#xff0c;光标下移Ctrlu向上半页&#xff0c;上衣半页&#xff0c;光标上移 按行 Ctrle…...

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…...

给虚拟机配置静态id地址

1.令人头大的原因 当连接虚拟机的时候 地址不一会就改变&#xff0c;每次都要重新输入 2.配置虚拟机静态id地址 打开命令窗口执行 : vim /etc/sysconfig/network-scripts/ifcfg-ens33 按下面操作修改 查看自己子网掩码 3.重启网络 命令行输入 systemctl restart netwo…...

Mybatis-Plus 租户使用

Mybatis-Plus 租户使用 文章目录 Mybatis-Plus 租户使用一. 前言1.1 租户存在的意义1.2 租户框架 二. Mybatis-plus 租户2.1 租户处理器2.2 前置准备1. 依赖2. 表及数据准备3. 代码生成器 2.3 使用 三. 深入使用3.1 前言3.2 租户主体设值&#xff0c;取值3.3 部分表全量db操作3…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...