小林coding

news2025/2/25 3:41:06

一、图解网络

 

问大家,为什么要有TCP/Ip网络模型?

对于同一台设备上的进程通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,对于不同设备上的进程通信,就需要有网络通信,而设备是多样性的,所以要兼容多种多样的设备,就写上出了一套通用的网络协议。

这个网络协议是分层的,每一层都有各自的作用和指责。

应用层

最上层的,也是我们能直接接触到的就是应用层,我们电脑或手机使用的应用软件都是在应用层实现。那么当两个不同设备的应用需要通信的时候,应用就把应用数据传给下一层,也就是传输层。

所以,应用层只需要专注于为用户提供应用功能,比如HTTP、FTP、Telnet、DNS、SMTP等。应用测过是不用去关心数据是如何传输的,就类似于,我们寄快递的时候,只需要把包裹交给快递员,由他负责运输快递,我们不需要关心快递是如何被运输的。

而且应用层是工作在操作系统的用户态,传输层及以下则工作在内核态。

传输层

应用层的数据包会传给传输层,传输层是为应用层提供网络支持的。

在传输层会有两个传输协议,分别是TCP和UDP。

TCP的全称叫传输控制协议(Transmission Control Protocol),大部分应用使用的正式TCP传输层协议,比如HTTP应用层协议。TCP相比UDP多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠的传输给对方。

UDP相对来说就很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP也可以实现可靠传输,把TCP的特性在应用层上实现就可以,不过要实现一个商用的可靠UDP传输协议,也不是一件简单的事情。

应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过MSS(TCP最大报文长度),就要将数据包分快,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一分块,而不用重新发送整个数据包。在TCP协议中,我们把每个粉快成为一个TCP段(TCP Segment)。

当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。

比如80端口通常时web服务器用的,22端口通常是远程登录服务器用的。而对于浏览器(客户端)中的每个标签栏都是一个独立的进程,操作系统会为这些进程分配临时的端口号。

由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。

网络层

传输层可能大家刚接触的时候,会认为它负责将数据从一个设备传输到另一个设备,事实上它并不负责。

实际场景中的网络环节是错综复杂的,中间有各种各样的分叉路口,如果一个设备的数据的数据要传输给另一个设备,就需要在各种各样的路径和节点进行选择,而传输层的设计理念是简单、高效、专注,如果传输层还负责这一块功能就有点违背设计原则了。

也就是说,我们不希望传输层协议处理太多的事情,只需要服务好应用即可,让其作为应用见数据传输的媒介,帮助实现到应用的通信,二十几的传输功能就交给下一层,网络层(internet layer).

网络层最常使用的是IP协议(internet Protocol),IP 协议将会将传输层的报文作为数据部分,再加上IP报头组装成IP报文,如果IP报文大小超过MTU(以太网中一般为1500字节)就会再次进行分片,得到一个即将发送到网络的IP报文。

网络层负责将数据从一个设备传输到另一个设备,世界上那么设备,又该如何找到对方呢?因此网络层需要有区分设备的编号。

我们一般用IP地址给设备进行编号,对于IPv4协议,IP地址共32位,分成了四段(比如:192.168.100.1),每段是8位。只有一个单纯的IP地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不科学。

因此,需要将IP地址分成两种意义:

一个是网络号,负责标识该IP地址是属于哪个子网的;

一个主机号,负责标识同一子网下的不同主机;

怎么分的呢?这需要配合子网掩码才能算出IP地址的网络号和主机号。

举个例子,比如10.100.122.0/24后面的/24表示就是255.255.255.0子网掩码,255.255.255.0二进制是「11111111-11111111-11111111-00000000」

那么,在寻址的过程中,先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机。

除了寻址能力,IP协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多网络的路径,因此当数据包到达一个网络节点,就需要通过路由算法决定下一步走那条路径。

路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。

所以,IP协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径。寻址更想在导航,路由更像在操作方向盘。

网络接口层

生成了IP头部后,接下来要交给网络接口层(Link Layer)在IP头部的前面加上MAC头部,并封装成数据帧(Data frame)发送到网络上。

应用层                应用层       ---                          应用数据 

     |                       |

传输层               传输层        ---             TCP头|应用数据

     |                      |

网络层               网络层        --- IP头|TCP头|应用数据

     |                      |

网络接口层    网络接口层   ----帧头|IP头|TCP头|应用数据|帧尾

     |                      |

              以太网

IP头部中的接收方IP地址表示网络包的目的地,通过这个地址我们就可以判断要将包发到哪里,但在以太网的世界中,这个思路是行不通的。

什么是以太网呢?电脑上的以太网接口,Wi-Fi接口,以太网交换机、路由器上的千兆,万兆以太网接口,还有网线,他们都是以太网的组成部分。以太网就是一种在局域网内,把附近的设备连接起来,是他们之间可以进行通讯的技术。

以太网在判断网络包目的地址时和Ip的方式不同,因此必须采用相匹配的方式才能在以太网中将包发往目的地,而MAC头部就是干这个用的,所以,在以太网进行通讯要用到MAC地址。

MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息,我们可以通过ARP协议获取对方的MAC地址。

所以说,网络接口层主要为网络层提供链路级别传输的服务,负责在以太网、Wi-Fi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标识网络上的设备。

总结

综上所述,TCP/IP网络通常是由上到下分成4层,分别是应用层,传输层,网络层和网络接口层。

网络接口层的传输单位是帧(Frame),IP层的传输单位是包(packet),TCP层的传输单位是段(segment),HTTP的传输单位则是消息或报文(message)。但这些名词并没有什么本质区分,可以统称为数据包。

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

孤单小弟——HTTP

浏览器第一步要做的就是解析URL(网址)

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

URL元素组成:

http:+//+Web服务器+/+目录名+/+.....+文件名

URL开头表示访问数据的协议、//后面的字符串表示服务器的名称、/后面表示数据文件的路径名(可省略)

长长的URL网址实际上是请求服务器里的文件资源,Web服务器后面是数据的路径名。

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

生产HTTP请求信息

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

a .请求报文

b.响应报文

一个孤单单的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服务器中。

这样一来,任何DANS服务器就可以找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器。

域名解析的工作流程:

  • 客户端首先会发出一个DNS请求,问www.server.com的IP是啥,并发给本地DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址。
  • 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com的,则它直接返回IP地址。如果没有,本地DNS会去问它的根域名服务器:“老大,能告诉我www.server.com的I的IP地址吗?”根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
    • 根DNS收到来自本地NDS的请求后,发现后置是.com,说:“www.server.com的I这个域名归.com区域管理,“我给你.com顶级域名服务器地址给你,你去问他吧。“
    • 本地DNS收到顶级域名服务器的地址后,发起请求问”老二,你能告诉我www.server.com的I的IP地址吗?”
    • 顶级域名服务器说:“我给你负责www.server.com的I区域的权威DNS服务器的地址,你去问他应该能闻到”。
    • 本地DNS于是转向问权威DNS服务器:“老三,www.server.com的I对应的IP是啥呀?”server.com的权威DNS服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
    • 权威DNS服务器查询后将对应的Ip地址X.X.X.X告诉本地DNS。
    • 本地DNS再将IP地址返回客户端,客户端和目标建立连接。

URL解析->生成发送给web服务器的http请求信息->web服务器响应报文->Http消息发送给web服务器->客户端发出DNS请求->本地DNS服务器->根DNS服务器->顶级域名服务器->权威DNS服务器查询服务器域名对应的IP地址并告诉本地DNS->本地DNS将IP返回客户端->客户端和目标建立连接->把http的传输工作交给系统的协议栈-->网络应用程序(浏览器、web服务器)socket库-->操作系统--协议栈:TCP(需要连接)、UDP(不需要连接)-->操作系统--协议栈:IP(传送网络包、确定路由,ICMP、ARP协议)-->驱动程序--网卡驱动程序(控制网卡)-->硬件--物理硬件网卡

可靠传输——TCP

http是基于TCP协议传输的。

源端口号、目的端口号;序号;确认号;状态为:SYN、ACK、RST、FIN;窗口大小。

tcp是面向连接的,因而双方要维护连接的状态,这些带状态为的包的发送,回应起双方的状态变更

TC P要做流量控制;拥塞控制;

TCP传输数据前,要进行三次握手建立连接:

  • 一开始,客户端和服务器都处于close状态,先是服务器主动监听某个端口,处于listen状态
  • 然后客户端主动发起SYN发起一个连接,然后处于syn-sent状态;
  • 服务器收到发起的连接,返回SYN,并且ACK确认客户端的SYN,之后处于SYN- RCVD状态;
  • 客户端收到服务器发送的SYN和AC K之后,发送对SYN确认的ACK,之后处于ESTABLISHE D状态,因为它已发一收成功了。
  • 服务端收到ACK的ACK后,处于ESTABLISHED状态,因为它也一发一收成功了。

所以三次握手的目的是保证双方都有发送和接收的能力。

TCP分割数据:

MTU:

MSS:

Linux系统是如何发网络包的?

网络模型

为了似的多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联网中兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(open system interconnection reference model),也就是OSI网络模型,该模型主要有7层,分别是应用测过、表示测过、会话层、出啊数层、网络层、数据链路层以及物理层。

每一层负责的职能都不同,如下:

  • 应用层:负责给应用程序提供统一的接口
  • 表示层:负责把数据转换成兼容另一个系统能识别的格式
  • 会话层:负责建立、管理和终止表示层实体之间的通信会话。
  • 传输层:负责端到端的数据传输
  • 网络层:负责数据的路由、转发、分片
  • 数据链路层:负责数据的封帧和差错检测
  • 物理层:负责在物理网络中传输数据帧

常见、实用的是四层模型、即TCP/IP网络模型,Linux系统正式按照这套网络模型来实现网络协议栈的。

应用层:负责向用户提供一组应用程序,比如HTTP、DNS|FTP等。

传输层:负责端到端的通信,比如TCP、UDP等

网络层:负责网络包的封装、分片、路由、转发,比如IP、ICMP等

网络接口层:负责网络包在物理网络中的传输,比如网络包的封帧、MAC寻址、差错检测,以及通过网卡传输网络帧等。

OSI参考模式的应用层、表示层、会话层相当于TCP/IP模型的应用层,OSI参考模式的数据链路层、物理层相当于TCP/IP模型的网络接口层。

Linux网络协议栈

物理链路并不能传输任意大小的数据包,所以在以太网中,规定了最大传输单元(MTU)是1500字节,也就是规定了单次传输的最大IP包大小。

当网络包超过MTU大小,就会在网络层分片,以确保分片后的IP不会超过MTU大小,如果MTU越小,需要的分包就越多,那么网络吞吐能力就越差,如果MTU越大,需要的分包就越好,那么网络吞吐能力就越好。

Linux网络协议帧,类似于TCP/IP的四层结构:

应用程序

内核:

系统调用

LVS

Socket

TCP        UDP

IP         ICMP

                ARP

MAC

网卡驱动个程序        网卡驱动程序

网卡  (硬件)                      网卡

Linux接收网络包的流程

网卡是计算机里的一个硬件,专门负责接收和发送网络包,当网卡接收到一个网络包后,会通过DMA技术,将网络包写入到指定的内存地址,也就是写入到Ring Buffer,这是一个环形缓冲区,接着就会告诉操作系统这个网络包已经到达。

那应该怎么告诉操作系统这个网络包已经到达了呢?

最简单的一种方式就是处罚中断,也就是没当网卡收到一个网络包,就出发一个中断告诉操作系统。

但是网络包很多,频繁的触发中断,会影响其他任务进程,从而影响系统的整体效率。

所以为了解决频繁中断带来的性能开销,Linux内核在2.6版本中引入了NAPI机制,它是混合中断轮询的方式来接受网络包,它的核心概念是,采用中断唤醒数据接收服务陈故乡,然后poll的方法来轮训数据。

因此,当有网络包到达时,会通过DMA技术,将网络包写入指定的内存地址,接着网卡向CPU发起硬件中断,当CPU收到硬件中断请求后,根据中断表,调用已经注册的中断处理函数。

硬件中断处理函数会做如下的事情:

需要先暂时屏蔽中断,表示已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,不要再通知CPU了,这样可以提高效率,避免CPU不停的被中断。

接着,发起软中断,然后回复刚才屏蔽的中断。

硬件中断处理函数做的事情很少,主要耗时的工作都交给软中断处理了。

软中断的处理

内核中的ksoftirqd线程专门负责软中断的处理,当ksoftirqd内核线程收到软中断后,就会来轮训处理数据。

ksofitirqd线程会从ring buffer 中获取一个数据帧,用sk_buff表示,从而可以作为一个网络包交给网络协议栈进行逐个层处理。

网络协议栈

首先会进入到网络接口层,在这一层灰检查报文的合法性,如果不合法则丢弃,合法则会找出该网络包的上层协议的类型,比如是IPv4,还是IPv6,接着再去掉帧头帧尾,然后交给网络层。

到了网络层,则取出IP包,判断网络包下一步的走向,比如是交给上层处理还是转发出去。当确认这个网络包要发送给本机后,就会从IP头里看上一层协议的类型是TCP还是UDP,接着去掉IP头,然后交给传输层。

传输层去处TCP头或UDP头,根据四元组“源IP、源端口、目的IP、目的端口”作为标识,找到对应的Socket,并把数据放到Socket接口的缓冲区。最后,应用层程序调用Socket接口,将内核的Socket接收缓冲区的数据拷贝到应用层的缓冲区,然后唤醒用户进程。

Linux发送网络包的流程

发送网络包正好和上面接收网络包的流程相反。

  • 首先,应用程序会带哦用socket发送数据包的接口,由于这个是系统调用,所以会从用户态陷入内核态的socket层,内核会申请一个内核态的sk_buff内存,将用户发发送的数据拷贝到sk_buff内存,并将其加入到发送缓冲区。
  • 接下来,网络协议栈从socket发送欢送曲中取出sk_buff,并按照TCP/IP协议从上到下逐层处理。
  • 如果使用的是TCP传输协议发送数据,那么先拷贝一个新的sk_buff副本,这是因为sk_buff后续在调用网络层,最后被到达网卡发送网卡发送完成后,这个sk_buff会被释放掉。而TCP协议是支持丢失重传的,在收到对方的ACK前,这个sk_buff不能删除。所以内核的做法就是每次调用网卡发送的时候,实际上传出去的是sk_buff的一个拷贝,等收到AC看在真正删除。
  • 你可能会好奇,为什么全部数据包只用一个结构体来描述呢?协议栈采用的是分层结构,上层向下层传递数据时需要增加包头,下层向上层传输数据时又需要去掉包头,如果每一层都用一个结构体,那在层之间传递数据的时候,就要多次拷贝,这将大大降低CPU效率。
  • 于是,为了在层级之间传递数据时,不发生拷贝,只用sk_buff一个结构体来描述所有的网络包,那他是如何做到的呢?是通过调整sk_buffa中的data指针,比如:

当接首报文时,从过协议栈层层往上传送数据包,通过增加skb->data的值,来住不剥离协议首部。

当要发送报文时,创建sk_buff结构体,数据缓存区的头部预留足够的空间,用来填充个层首部,在经过下层协议时,通过减少skb->data的值来增加协议首部。

  • 至此,传输层的工作也就都玩好吃呢过了。
  • 然后交给网络层,在网络层里会做这些工作:选取路由(确认下一跳IP)、填充IP头、netfiter过滤,对超过MTU大小的数据包进行分片。处理完这些工作后会交给网络接口层处理。
  • 网络接口层会通过ARP协议获得下一跳的MAC地址,然后对sk_buff填充帧头和帧尾,接着讲sk_buff放到网卡的发送队列中。
  • 这一些工作准备好后,会触发软中断,告诉网卡驱动程序,这里有新的网络包需要发送,驱动程序会从发送队列中读取sk_buff,将这个sk_buff挂到ring buffer中,接着讲sk_buff数据映射到网卡可访问的内存DMA区域,最后触发真实的发送。

当数据发送完成以后,其实工作并没有结束,因为内存还没有清理。当返送玩好吃呢过的时候,网卡设备会触发一个硬中断来释放内存,主要是释放sk_buff内存和清理ringbuffer内存。

最后,当收到这个TCP报文的ACK应答时,传输层就会释放原始的sk_buff.

别担心,这只是每个人都会有的想法而已,以一种平和的心态去看待,你不能理解的事情,根本改变不了什么。原来我真的故意的话键盘也会敲的很响,所以那些人都是没良心的,你不必去理会他。

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

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

相关文章

约束优化:PHR-ALM 增广拉格朗日函数法

文章目录约束优化:PHR-ALM 增广拉格朗日函数法等式约束非凸优化问题的PHR-ALM不等式约束非凸优化问题的PHR-ALM对于一般非凸优化问题的PHR-ALM参考文献约束优化:PHR-ALM 增广拉格朗日函数法 基础预备: 约束优化:约束优化的三种序…

【MyBatis】逆向工程与分页插件

11、MyBatis的逆向工程 11.1、创建逆向工程的步骤 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源…

公司技术团队为什么选择使用 YApi 作为 Api 管理平台?

在 2021 年 12 月份的时候我就推荐过一款软件程序员软件推荐:Apifox,当时体验了一下里面的功能确实很实用,但是当时公司有一套自己的 API 管理方案,所有 Apifox 暂时就没在内部使用。 直到最近要使用其他的 API 管理方案的时候才…

SAP ERP系统PP模块MRP运行参数说明

SAP/PP模块运行MRP(MD01/MD02)的界面有很多参数,这些参数的设置上线前由PP业务顾问根据实际业务需求定义好的,上线后一般不会轻易去调整,对于一般操作用户,按手册操作就行,不需要深入了解这些参数,但作为负…

收藏这几个开源管理系统做项目,领导看了直呼牛X!

项目SCUI Admin 中后台前端解决方案Vue .NetCore 前后端分离的快速发开框架next-admin 适配移动端、pc的后台模板django-vue-admin-pro 快速开发平台Admin.NET 通用管理平台RuoYi 若依权限管理系统Vue3.2 Element-Plus 后台管理框架Pig RABC权限管理系统zheng 分布式敏捷开发…

Redis的下载与安装

为便于大多数读者学习本套教程,教程中采用 Windows 系统对 Redis 数据库进行讲解。虽然 Redis 官方网站没有提供 Windows 版的安装包,但可以通过 GitHub 来下载 Windows 版 Redis 安装包,下载地址:点击前往。 注意:Win…

企业级解决方案Redis

缓存预热“宕机”服务器启动后迅速宕机1. 请求数量较高2. 主从之间数据吞吐量较大,数据同步操作频度较高解决方案前置准备工作:1. 日常例行统计数据访问记录,统计访问频度较高的热点数据2. 利用LRU数据删除策略,构建数据留存队列例…

全链路压力测试

压力测试的目标: 探索线上系统流量承载极限,保障线上系统具备抗压能力 复制代码 如何做全链路压力测试: 全链路压力测试:整体步骤 容量洪峰 -》 容量评估 -》 问题发现 -》 容量规划 全链路压力测试:细化过程 整体目…

Apache Shiro与Spring Security对比

Apache Shiro VS Spring Security 1.Spring Security 官方文档:https://spring.io/projects/spring-security#overview介绍: Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spr…

Java 基础(3)—synchornized 关键字简单理解

一、synchronized 修饰同步代码块 用 synchronized 修饰代码段作为同步锁,代码如下: public class LockDemo {public Object object new Object();public void show(){synchronized (object) {System.out.println(">>>>>>hell…

java Spring aop多个增强类作用于同一个方法时,设置优先级

我们先来模拟这种情况 我们先创建一个java项目 然后 引入Spring aop需要的基本依赖 然后 在src下创建一个包 我这里叫 Aop 在Aop包下创建一个类 叫 User 参考代码如下 package Aop;import org.springframework.stereotype.Component;Component public class User {public vo…

Java-形参与返回值

Java学习之道-1 一、形参与返回值 平时在进行代码编写的时候大多都是以变量作为形参或者以某种数据类型比如int、String或者Boolean等等作为返回值,本次主要介绍以下三种作为形参与返回值的情况 1、类名作为形参与返回值 类名,顾名思义是定义的class类&a…

国家级高新区企业主要经济指标(2012-2021年)

数据来源:国家统计局 时间跨度:2012-2021 区域范围:全国(及各分类统计指标) 指标说明:手工提取最新的中国统计年鉴数据中各个excel指标表,形成各个指标文件的多年度数据,便于多年…

物联网发展的重要通信技术Wi-Fi

Wi-Fi 可以适应各种场景的联网需求 Wi-Fi 在实现物联网创新方面发挥了基础性作用,提供了广泛的连接性,将各种“事物”相互连接、连接到互联网,以及连接到全球使用的 180 亿台 Wi-Fi 设备。物联网的经济潜力是无限的,Wi-Fi 为智能…

Spring aop之针对注解

前言 接触过Spring的都知道,aop是其中重要的特性之一。笔者在开发做项目中,aop更多地是要和注解搭配:在某些方法上加上自定义注解,然后要对这些方法进行增强(很少用execution指定,哪些包下的哪些方法要增强)。那这时就…

每日一题——L1-069 胎压监测(15)

L1-069 胎压监测 分数 15 小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#…

Windows 10/11如何恢复已删除的照片?

如果你想在Windows 11或Windows 10上恢复已删除的照片,你可以参考这篇文章,使用2种方法轻松恢复Windows上永久删除的照片。 可以恢复电脑上已删除的照片吗? 随着科技的发展,越来越多的用户习惯于在电子设备上存储照片。如果这些…

实时渲染为什么快,能不能局域网部署点量云

提到渲染很多有相关从业经验的人员可能会想起,自己曾经在电脑上渲染一个模型半天或者更长的 时间才能完成的经历。尤其是在项目比较着急的时候,这种煎熬更是难受。但现在随着实时渲染和云渲染行业的发展,通过很多方式可以提升渲染的时间和效率…

管理数据就这样轻松:TablePlus 5.3.1Crack

数据库管理变得简单 适用于关系数据库的现代、原生且友好的 GUI 工具:MySQL、PostgreSQL、SQLite 等 支持一整套关系数据库(和一些 NoSQL) 数据库MySQL红移数据库服务器SQLite数据库雷迪斯卡桑德拉蟑螂数据库数据库垂直 我们的客户来自世界上…

数据结构(四):树、二叉树、二叉搜索树

数据结构(四)一、树1.树结构2.树的常用术语二、二叉树1.什么是二叉树2.二叉树的数据存储(1)使用数组存储(2)使用链表存储三、二叉搜索树1.这是什么东西2.封装二叉搜索树:结构搭建3. insert插入节…