小林coding
一、图解网络
问大家,为什么要有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.
别担心,这只是每个人都会有的想法而已,以一种平和的心态去看待,你不能理解的事情,根本改变不了什么。原来我真的故意的话键盘也会敲的很响,所以那些人都是没良心的,你不必去理会他。
相关文章:

小林coding
一、图解网络 问大家,为什么要有TCP/Ip网络模型? 对于同一台设备上的进程通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,对于不同设备上的进程通信,就需要有网络通信,而设备是…...

操作系统真相还原_第6章:完善内核
文章目录6.1 函数调用约定简介6.2 汇编语言和C语言混合编程汇编调用CC调用汇编6.3 实现打印函数流程程序编译并写入硬盘执行6.4 内联汇编简介汇编语言AT&T语法基本内联汇编扩展内联汇编6.1 函数调用约定简介 调用约定: calling conventions 调用函数时的一套约…...

SmoothNLP新词发现算法的改进实现
SmoothNLP新词发现算法的改进实现 背景介绍 新词发现也叫未登录词提取,依据 《统计自然语言处理》(宗成庆),中文分词有98%的错误来自"未登录词"。即便早就火遍大江南北的Bert也不能解决"未登录词"的Encoding问题,便索性…...

实时渲染为什么快,能不能局域网部署点量云
提到渲染很多有相关从业经验的人员可能会想起,自己曾经在电脑上渲染一个模型半天或者更长的 时间才能完成的经历。尤其是在项目比较着急的时候,这种煎熬更是难受。但现在随着实时渲染和云渲染行业的发展,通过很多方式可以提升渲染的时间和效率…...
网络游戏该如何防护ddos/cc攻击
现在做网络游戏的企业都知道服务器的安全对于我们来说很重要!互联网上面的 DDoS 攻击和 CC 攻击等等无处不在,而游戏服务器对服务器的防御能力和处理能力要求更高,普通的服务器则是比较注重各方面能力的均衡。随着游戏行业的壮大,…...
项目管理体系1-4练习题1-10答案
题目1 每周一次的项目会议上,一位团队成员表示在修订一项可交付成果时,一名销售经理对客户服务过程想出一项变更讨论,影响到整个项目,项目经理对销售参与到项目可交付成果感到吃惊,经理事先应该怎么做去阻止这些情况&…...

sHMIctrl智能屏幕使用记录
手上有个案子,“按压机器人”,功能是恒定一个力按下一定时间。 屏幕选型使用“sHMIctrl”,一下记录使用过程中遇到的问题以及解决方法。 目录 问题1:按键控件做定时触发,模拟运行时触发不了。 问题2:厂家…...

2.20 crm day01 配置路由router less使用 axios二次封装
需求: 目录 1.配置路由 2.less使用 vue2使用以下版本 3.axios二次封装 1.配置路由 1.1.1 官方链接:安装 | Vue Router npm i vue-router3.6.5 注意:vue2项目不能用vue-router四版本以上 1.2.1.创建router/index.js 在该文件中 //1.引…...

【LeetCode】剑指 Offer 10- I. 斐波那契数列 p74 -- Java Version
题目链接: 1. 题目介绍() 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) 0, F(1) 1F(N) F(N - 1) F…...

论文笔记:DropMessage: Unifying Random Dropping for Graph Neural Networks
(AAAI 23 优秀论文) 1 intro GNN的一个普遍思路是,每一层卷积层中,从邻居处聚合信息 尽管GNN有显著的进步,但是在大规模图中训练GNN会遇到各种问题: 过拟合 过拟合之后,GNN的泛化能力就被限制…...

木鱼cms系统审计小结
MuYuCMS基于Thinkphp开发的一套轻量级开源内容管理系统,专注为公司企业、个人站长提供快速建站提供解决方案。 环境搭建 我们利用 phpstudy 来搭建环境,选择 Apache2.4.39 MySQL5.7.26 php5.6.9 ,同时利用 PhpStorm 来实现对项目的调试 …...

软件测试面试-一线大厂必问的测试思维面试题
五、测试思维5.1 打电话功能怎么去测?我们会从几个方面去测试:界面、功能、兼容性、易用性、安全、性能、异常。1)界面我们会测试下是否跟界面原型图一致,考虑浏览器不同显示比例,屏幕分辨率。2)功能&#…...

企业级分布式应用服务 EDAS
什么是企业级分布式应用服务EDAS企业级分布式应用服务EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的云原生PaaS平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持Spring Cloud和Ap…...

弄懂 Websocket 你得知道的这 3 点
1. WebSocket原理 WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简…...
Appium构架及工作原理
一、appium结构简单来说appium充当一个中间服务器的功能,接收来自我们代码的请求,然后发送到手机上进行执行。二、初步认识appium工作过程1.appium是c/s模式的2.appium是基于webdriver协议添加对移动设备自动化api扩展而成的,所以具有和webdr…...
软件架构中“弹性”的多种含义
在软件架构领域的中文文档、书籍中,经常可以看到“弹性”这个专业术语,但在不同的语境下含义可能会不同。 在英语中,elastic 和 resilient 两个单词都可以翻译为“弹性的”,但是它们在软件架构中代表的含义却完全不同,…...
JAVA练习57- 罗马数字转整数、位1的个数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目1-罗马数字转整数 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 二、题目2-位1的个数 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 …...

C#把图片放到picturebox上的指定位置,PointToClient与PointToScreen解读
1、C#中如何把图片放到picturebox上的指定位置 构造一个跟picturebox1一样大小的Bitmap, 设置给picturebox1, 然后在上面画图 Bitmap image new Bitmap(picturebox1.Size.Width, picturebox1.Size.Height); Graphics device Graphics.FromImage(imag…...

【论文笔记】Manhattan-SDF==ZJU==CVPR‘2022 Oral
Neural 3D Scene Reconstruction with the Manhattan-world Assumption 本文工作:基于曼哈顿世界假设,重建室内场景三维模型。 1.1 曼哈顿世界假设 参考阅读文献:Structure-SLAM: Low-Drift Monocular SLAM in Indoor EnvironmentsIEEE IR…...
环翠区中小学生编程挑战赛题解中学组T4:免费超市
题目描述 OITV电视台最近开设了名为“免费超市”的真人电视节目,在节目中,抽奖选拔的民间志愿者们将随机匹配进行两两对抗赛。每场比赛上,节目组设置 n n n件商品排成一排供选手挑选,两名选手将交替出手选中并拿走商品,每件商品有着不同的价值 a i a_i a...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...