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

小林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 两个单词都可以翻译为“弹性的”,但是它们在软件架构中代表的含义却完全不同&#xff0c…...

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...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...