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

【Linux】网络层

目录

IP协议

协议头格式

网段划分

2中网段划分的方式

为什么要进行网段划分

特殊的IP地址

IP地址的数量限制

私有IP地址和公有IP地址

路由


IP协议

在通信时,主机B要把数据要给主机C,一定要经过一条路径选择,为什么经过路由器G后,不去E而是去H,因为目的IP是主机C。

IP地址的意义:IP地址提供了一种“能力”,将数据从B主机跨网络可靠地送至C主机的能力。能力是什么?是具有很大的概率做成一件事情。举一个例子,有一个教授父亲和学霸儿子,目的是让儿子考100分,如果没考到,教授父亲就要求老师重新考一次,直到考到100分。其中,学霸儿子提供执行、能力和具体的操作,教授父亲提供策略。

我们要求IP地址可靠地将数据发到目标主机(比如要求学霸儿子一定要考100)。实际上,网络层提供能力,传输层提供策略。IP协议提供不了可靠性,丢包问题由传输层来解决。


可以通过ifconfig命令查本主机的IP。

IP=网络号+主机号。如何理解?IP地址的设定是有规则的,我们这一台主机一定是隶属于某一个子网的,凡是在同一个子网里的所有的主机的IP地址都是很类似的,前面的是一样的,前面的是网络号。在路由时,先根据网络号路由,然后才是主机号。比如,唐僧在去取经的时候,唐僧永远说的是我要去西天大雷音寺面见佛祖,所以唐僧的目的地址是西天+大雷音寺,如来佛祖相当于一个进程,唐僧在路上别人告诉的都是西天怎么走,而不是大雷音寺怎么走。所以,在路上路由的都是要去的网络号,到了西天之后,才说大雷音寺怎么走,也就是主机号。再比如,学生的学号,很有规律,学院号+班级号+...,先根据学院号,再根据班级号,等等去找到这个学生。在网络世界里同样如此。

主机:配有IP地址的设备。

路由器:即配有IP地址,又能进行路由控制。

节点:主机和路由器的统称。

协议头格式

报头和有效载荷如何分离

IP报文的标准长度是20字节,4位首部长度(0-15,但是基本单位是4字节,所以首部长度范围是0-60),所以如果没有选项字段,那4位首部长度的值应该是20/4=5(0101),最多[20,60]的选项字段。所以,在提取IP报文时,先提取20个字节的报头,再提取4位首部长度,再乘以4,减去20字节,就是选项,然后就是数据正文。

如何分用

8位协议是TCP或UDP,到达目标主机之后,可以根据8位协议字段向上交付。


我们再来看看IP中的4位版本,通常是ipv4。IP版本有两种,ipv4和ipv6。ipv4用4字节来表示一个IP地址,用一对源IP地址、目的IP地址来表示从哪发的,到哪去。 这就是说ipv4最多能表示2^32台主机吗?是的,但是这个数量是远不够的,后来又想办法解决这个问题。

ipv6用16个字节表示一个IP地址,能表示的主机台数多很多了,但是ipv4和ipv6不兼容。ipv6无法被广泛推广(需要短时间把所有支持ipv4的都换成ipv6)。

8位服务类型:3位优先权字段(已弃用),4位TOS字段,和1位保留字段。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,看自己的需求更大就选哪一个。对于ssh和telnet这样的应用程序,最小延迟比较重要。

16位总长度:可以计算出自身报文长度是多少。

8位生存时间(TTL):网络世界非常复杂,没有人能够把网络的拓扑结构搞清楚。网络是人设计的,肯定会有bug,报文在经过路由传输时,可能会出现环路问题,在一个环路中循环起来,导致该报文在网络中一直存在,时间一久这个环形网络就会积攒大量报文。所以,我们要给报文设置生存时间,每经过一个路由器,这个生存时间计数器就-1,当识别到该报文的生存时间减到0时,这个报文就被丢弃掉了。


综合来看,网络中任何一个报文会包含:源IP,源端口、目的IP、目的端口,协议号。源IP和目的IP在网络层,源端口和目的端口在传输层中。在网络通信时,客户端和服务器都要有自己的套接字信息,把源IP,源端口、目的IP、目的端口都打包发过去,并且要把IP地址和端口号转换为网络序列,因为要作为报文的一部分。另外,双方在进行通信时,通过IP报头中的8位协议来判断传输层是通过TCP协议还是UDP协议传输,这就是协议号。把这样一个五元组标识一个网络通信。这就是我们为什么把网络编程称为套接字编程,因为是通过IP和端口号的标识来进行通信的。

网段划分

2中网段划分的方式

已ipv4为例,一共有2^32中排列组合,IP地址是一个有用且有限的资源,和石油天然气一样有限,所以在国际中会存在竞争关系,所以,IP地址要通过合理划分来给不同的区域,国家,组织,学校等。所以,我们的网络世界,是被精心设计过的,从硬件到软件。

IP地址地址分为两个部分:网络号+主机号。

同一个网段的主机网络号是一样的,主机号不一样。路由器横跨两个子网,在两个子网看来,路由器都是自己的设备,注定了路由器要配两张网卡,两种不同IP。路由器是整个子网的第一台主机,所以它的IP地址一般是子网号+1,所以IP地址被分为网络标识和主机标识。当某一个网络中新插入一个主机时,其网络标识必须一样,主机标识必须不一样,IP地址是被动态分配的。

路由器:具有路由的功能,但是现在的路由器不单单只有路由的功能,还可以构建子网。

在路由器的背面,提供了IP地址,可以在浏览器直接访问这个IP,更改路由器的属性。看到路由器有web功能。

手动管理子网内的IP非常麻烦,现在有一种技术叫DHCP,能够自动给子网内的新增主机节点分配IP地址,避免手动管理IP。一般的路由器都带有DHCP功能。

过去曾经提出一种划分网络号和主机号的方案,把IP地址划分为五类:

随着互联网的飞速发展,这种划分方法的局限性就显现出来。大多数组织都申请B类网络地址,导致B类地址很快就分配完了。比如,申请了一个B类网址,理论上一个子网内能允许6万5千多个主机,但是在实际中,一个子网内不会存在这么多情况,因此大量的IP地址被浪费了。

针对这种情况提出了新的划分方案,称为CIDR。

  • 引入一个额外的子网掩码来区分网络号和主机号;
  • 子网掩码也是一个32位的正整数,通常用一串“0”来结尾,以一串“1”开头;
  • 将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类、还是C类无关。

下面举几个例子,

1.IP地址是140.252.20.68,子网掩码是255.255.255.0,将这两者按位与,得到该IP地址的网络号140.252.20.0,所以子网地址的范围是140.252.20.0~140.252.20.255,主机地址全0(140.252.20.0)是网络号,主机地址全1(140.252.20.255)代表广播地址,所以能够真实作为主机IP的子网地址个数是256-2=254。这些子网掩码会在路由器中配置好。

2.每一个IP报文里会携带目的IP,子网掩码一般会配给路由器,同时还会给路由器配网络号,未来报文中的目的IP地址和路由器配置的子网掩码按位与,得到的结果如果和给路由器配置的网络号相等,说明该报文要去的网络和这个路由器是直连的,所以这个IP报文已经送到了目标网络的入口路由器处。比如IP地址是140.252.20.68,子网掩码是255.255.255.240,相与得到网络号140.252.20.64,其子网地址范围是140.252.20.64~140.252.20.79,计算过程如下:

但是40.252.20.64和140.252.20.79不用,所以这个子网可以接入一共有14台主机。可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围;

IP地址和子网掩码还可以更简洁的方法,我们在书写的时候,子网掩码写在IP地址的后面,如140.252.20.68/28,表示子网掩码的前28个bit全为1,之后后4个bit位为0。

为什么要进行网段划分

经过精心的设计,对网段合理的划分,可以高效支持未来的报文路径查找,大大提高查找目标主机的效率

特殊的IP地址

  • 将IP地址中的主机地址全部设成0,就成了网络号,代表这个局域网;
  • 将IP地址中的主机地址全部设成1,就成了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
  • 127.*的IP地址用于本机环回测试,通常是127.0.0.1。

IP地址的数量限制

我们知道,IP地址(IPv4)是一个4字节32位的正整数。那么一共只有2的32次方个IP地址,大概是43亿个。而TCP/IP协议规定,每个主机都要有一个IP地址,这意味着最多有43亿台主机能接入网络吗?实际上,由于一些特殊IP地址的存在,可以IP地址数量远不够43亿个;此外,每一张网卡也需要配置一个或多个IP地址。

上面第二种网段划分方式在一定程度上缓解了IP地址不够用的问题,提高了利用率,减少了浪费,但是IP地址的绝对上限没有增加,还是不够用。可以通过以下3种方式来解决:

  1. 动态分配IP地址:只给接入网络的设备分配IP地址。因此,同一个MAC地址的设备,每次接入互联网的IP地址不一定是相同的。
  2. NAT技术。
  3. IPv6。IPv6并不是IPv4的简单升级,这两个协议互不相干,彼此互不兼容。IPv6用16字节128位来表示一个IP地址,目前并未普及。

私有IP地址和公有IP地址

如果一个组织内部组建局域网,IP地址只能用于局域网内的通信,而不能直接连到internet上,理论上,任意的IP地址都可以,但是RFC1918规定了用于组建局域网的私有IP地址:

  • 10.*前8位是网络号,共16777216哥地址;
  • 172.16.*到172.31.*,前12位是网络号,共1048576哥地址;
  • 192.168.*,前16位是网络号,共65536哥地址。

包含在这个范围中的,都称为私有IP,其余的则称为全局IP(或公网IP)。私网IP不能出现在公网中私有IP地址可以在不同的私网中重复。虽然存在公网,但是我们在上网时,都必须先接入指定一个内网中,我们所有人都在各自的内网中,没有人能接到公网里,只有运营商自己能接到公网里。


我们家里的路由器,一旦被组装好,就会形成一个内网环境,路由器能够构建子网。路由器也需要IP地址,就会去上面的私有IP地址中挑一个。然后家里的手机电脑就可以连上网络了,连上路由器后分配的IP地址是私有IP。路由器至少要级联两个网络,路由器连接的另一侧是运营商的子网环境,所以家用路由器要配两个IP地址,一个叫做LAN口IP(路由器自己构建的子网,子网IP),另一个叫做WAN口IP(对外连接到运营商的子网)。而运营商也有自己的LAN口IP和WAN口IP,在运营商看来,所有的路由器都构成了子网。从运营商自己的路由器之后,就开始接入到公网了,这个进入连接公网和内网的路由器叫做出入口路由器。抖音的服务器和运营商的服务器都在公网中,就可以通信了。网络世界=内网+公网构成网络是被各个国家的运营商精心设计过的


如上图所示,那如何把我们的报文通过网络发给抖音服务器,抖音服务器如何转发回来的呢?src:192.168.1.201,dst:122.77.241.3,我们自己的主机有自己的网络层,我们自己子网下的所有主机都知道自己的网络号是多少(主机IP地址&子网掩码),我要去的目标网络的网络号是122.77.241.0(目的IP地址&子网掩码),很显然,我要去的网络和我直连的网络不在同一个网段,就把报文交给家用路由器,家用路由器的WAN口号是10.1.1.0,也就是整个运营商构建的子网是10.1.1.0,而你要去的网络122.77.241.3,很显然也不是我们自己这个内网转发的,怎么办?只能把报文交给运营商的出入口路由器,这个路由器WAN口IP接的就是公网了,然后就把报文经过公网转到了抖音的服务器。任何主机都有能力知道和自己直连的网络号是多少

那抖音服务器应答回来的时候,不就傻眼了吗?192.168.1.201是一个内网IP,内网中的IP地址可能会出现重复的,所以这种通信模式并不能正确地完成我们的通信

那该怎么通信呢?src:192.168.1.201,dst:122.77.241.3,这个报文还是和上面一样,先交给家用路由器,因为私网IP地址不能出现在公网中,每经过家用路由器,都要将报文中的srcIP,替换为自己的WAN口IP,报文的IP就变成了src:10.1.1.2,dst:122.77.241.3,然后再交给出入口路由器,出入口路由器转发的时候,将srcIP转为该路由器的WAN口IP,src:122.77.241.4,dst:122.77.241.3,然后交给抖音服务器,抖音服务器以为在公网中的某一个设备在通信,然后把响应就可以把报文发回来给出入口路由器,接下来就是把报文内网转发。把这种在报文经过路由器转发的过程中不断进行源IP地址替换的工作,称之为NAT技术。只是进出内网的时候做替换,一旦进入公网后,就不需要替换了,因为公网之中所有主机是可以互相通信的。


路由

路由,就是在复杂的网络中,找出一条通往终点的路线。

路由的过程,就是这样一跳一跳“问路”的过程。

举个例子,比如你第一次去上海,要去复旦大学,也没有导航,只能问路。遇到一个大爷,就问复旦大学在哪(排除被拒绝的情况),可能会得到以下几种回答:

1.大爷说,小伙子,你去坐206公交,到xxx下车,再坐36公交,就可以到了。

2.大爷说,小伙子,我也不太清楚啊,你去问一下火车站那个保洁大妈,她对方圆几十里比较熟。

3.大爷说,小伙子,你不用找了,我是复旦大学的保安,你现在到了。此时你立马问这个大爷,18号楼怎么走,大爷说,沿着路直走500m左手边(大爷帮你内网转发)。

IP数据包的传输过程也和问路一样。

  • 当IP数据包到达路由器时,路由器会先查看目的IP地址;
  • 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器;
  • 依次反复,一直到达目标IP;、

每一个工作在网络中的设备,都会存在一个路由表(route指令查看),假设某主机上的网络接口配置和路由表如下:

这台主机有两个网络接口,一个网络接口连到192.168.10.0/24,另一个网络连到192.168.56.0,。Destination表示当前主机能找到哪些网络,目的网络地址;Gateway表示如果想去Destination,应该把报文交给哪一个IP的主机,下一跳地址,如果是*,表示要去的目标网络和我直连;Genmask是子网掩码,可以看到子网掩码不一样,这表明这台主机可以直接间接帮我们找到不同网段下的子网;Iface是收发数据的接口;Flag中的U标志表示此条目有效,G标志表示此条目的下一条是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,Destination是default,表明这是缺省路由。

当该路由器拿到报文后,拿目的IP地址和子网掩码相与,去看Destination里有没有匹配的,如果没有匹配的,只能去缺省路由了。然后把报文通过eth0接口把报文发出去。

转发过程例1:如果要发送的数据包的目的地址是192.168.56.3

  • 跟第一行的子网掩码做与运算得到192.168.56.0,和第二行的目的网络地址一样,所以从eth1接口发送出去;
  • 由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

转发过程例2:如果要发送的数据包的目的地址是202.10.1.2

  • 依次和路由表前几项进行对比,发现都不匹配;
  • 按缺省路由条目,从eth0接口发出去,发往192.168.10.1路由器;
  • 由192.168.10.1路由器根据她的路由表决定下一跳地址。

最后再来谈一下IP报头中16位标识、3位标志、13位片偏移。

上层交给数据链路层的报文,数据链路层也要添加自己的报头,数据链层层规定其有效载荷的长度是有上限的,一般不能超过1500字节,称为MTU(最大传输单元),如果超过了MTU,数据链路层就不提供链路转发。网络层一看数据链路层的态度那么强硬,网络层又颤颤巍巍看了传输层,就渴望地对传输层说你给我的报文能不能小一点,因为报文是否超过1500字节是由你传输层决定,但如果传输层的态度也很强硬,传输层就给网络层传输2000字节,网络层也很无语,上下两层都很强硬,只能自己想办法了。网络层只能分片转发了,把传输层传来的2000字节分成两个1000字节,分批传给数据链路层。网络层即使虽然分片了,但是传输层和数据链路层都不知道也不关心,但是接收方收的时候,不能收到两个1000字节的,而必须是完整2000字节的,所以对方网络层必须要做组装,将两个1000字节组装好再向上交付。

经过这一点理解,我们要知道这几点:

  1. 在网络世界里,只有IP报文!只有双方主机才能知道这是TCP/UDP报文。
  2. 假设要发1个IP报文,后来分片成10个IP报文发出去,但是有1个报文丢了,所以对方网络层就不能把9个报文交给上层传输层。分片中,有一片报文丢失,表示整个报文丢失!不给传输层交付,传输层也就收不到,收不到也就不会有应答,发送方就会自动超时,就只能进行重传了。

如果过多分片,就会增加丢包概率。分片组装这不是也不应该是网络转发的主流!丢包对于上层的影响是相同的,只不过对于TCP由丢包重传机制,UDP没有。

由于丢包后传输层就要重传,所以,为了尽可能避免丢包,就尽量避免分片,所以网络层最多能接受传输层1480个字节,传输层的报头是20个自己,那传输层从发送缓冲区一次读取的字节最多是1460字节,这也就是TCP滑动窗口中的内容不能一次打包全部发送,而是要分段发送的原因,最本质的就是因为数据链路层底层有MTU的要求!

接收方收到的报文有分片的,也有没分片的。我们先来看一下如何组装:

1.如何区分我收到的报文是分片了呢?

对于16位标识,不同报文的标识是不一样的,而一个报文的不同分片,标识必须相同。

对于3位标志字段,第一位是保留的,第二位为1表示禁止分片,如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示“更多分片”,如果分片了,最后一个分片置为0,其它为1,类似于一个结束标记。

对于13位片偏移,是分片相对于原始IP报文(报文数据)开始处的偏移,其实就是表示当前分片在原报文中处于哪个位置。实际偏移的字节数是这个值的8倍(实际偏移的字节数右移3位得到13位片偏移)。因此,除最后一个报文之外,其他报文的长度必须是8的整数倍。

那如何区分收到的报文是不是分片了呢?首先,我收到的报文要么是第一片,要么是中间片,要么是最后一片。如果是第一片,“更多分片”就是1,且片偏移是0;如果是中间片,“更多分片”就是1,且片偏移>0;如果是“最后一片”,那更多分片一定是0,且片偏移一定大于0。

因此,if(更多分片 == 1 || 片偏移>0){分片了}。

那如果没有分片呢怎么识别,更多分片一定是0&&片偏移是0,就是没分片。

那如何保证我们把分片收全了呢?那就先想想如果没有收全,会发生什么。如果没有收到第一片,那就是没有偏移为0的。如果没有收到最后一片,那就会没有收到更多分片为0的。然后,为了判断是否没收到中间片,可以将所有分片按照片偏移进行升序排序!拿着第一个分片的偏移量+自己长度,就应该是下一个分片偏移量的值,如果发现不是,就甄别出来中间是哪一个分片丢了。如果遍历完到最后一个分片,发现所有的都符合当前分片的偏移量+自己长度,就应该是下一个分片偏移量的值,这就是收全了。

如何组装?对收到的分片,边收边排序,按照偏移量头插,只要收全了,自然就组装好了。

相关文章:

【Linux】网络层

目录 IP协议 协议头格式 网段划分 2中网段划分的方式 为什么要进行网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公有IP地址 路由 IP协议 在通信时,主机B要把数据要给主机C,一定要经过一条路径选择,为什么经过路由器G后&…...

单片机Day1

目录 一.什么是单片机? 二.单片机的组成 三.封装形式 四.优势 五.分类 通用型: 专用型: 按处理的二进制位可以分为: 六.应用: 七.发展趋势 1.增加CPU的数据总线宽度。 2.存储器的发展。 3.片内1/0的改进 …...

django基于 Python 的考研学习系统的设计与实现

以下是对Django基于Python的考研学习系统的设计与实现: 一、系统概述 Django基于Python的考研学习系统是一个为考研学子提供一站式学习辅助的平台。它整合了丰富的学习资源、学习计划制定、学习进度跟踪以及交流互动等功能,旨在满足考生在备考过程中的…...

openCvSharp 计算机视觉图片找茬

一、安装包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、准备两张图片 三、编写代码 using OpenCv…...

深入学习 Python 爬虫:从基础到实战

深入学习 Python 爬虫&#xff1a;从基础到实战 前言 Python 爬虫是一个强大的工具&#xff0c;可以帮助你从互联网上抓取各种数据。无论你是数据分析师、机器学习工程师&#xff0c;还是对网络数据感兴趣的开发者&#xff0c;爬虫都是一个非常实用的技能。在本文中&#xff…...

【Web安全】SQL 注入攻击技巧详解:UNION 注入(UNION SQL Injection)

【Web安全】SQL 注入攻击技巧详解&#xff1a;UNION 注入&#xff08;UNION SQL Injection&#xff09; 引言 UNION注入是一种利用SQL的UNION操作符进行注入攻击的技术。攻击者通过合并两个或多个SELECT语句的结果集&#xff0c;可以获取数据库中未授权的数据。这种注入技术要…...

【DAPM杂谈之一】DAPM作用与内核文档解读

本文主要分析DAPM的设计与实现 内核的版本是&#xff1a;linux-5.15.164&#xff0c;下载链接&#xff1a; Linux内核下载 主要讲解有关于DAPM相关的知识&#xff0c;会给出一些例程并分析内核如何去实现的 /****************************************************************…...

计算机网络之---防火墙与入侵检测系统(IDS)

防火墙与入侵检测系统(IDS) 防火墙&#xff08;Firewall&#xff09; 和 入侵检测系统&#xff08;IDS, Intrusion Detection System&#xff09; 都是网络安全的关键组件&#xff0c;但它们的作用、功能和工作方式有所不同。 防火墙 防火墙是网络安全的一种设备或软件&#…...

HTML中meta的用法

学习网络空间安全专业&#xff0c;每个人有每个人的学法和选择。不论他选择什么&#xff0c;哪都是他自己的选择&#xff0c;这就是大多数视频教学的博主教学的步骤都不同原因之一。有人选择丢掉大部分理论直接学习网安&#xff0c;而我&#xff0c;选择了捡起大部分理论学习网…...

前端学习-事件流,事件捕获,事件冒泡以及阻止冒泡以及相应案例(二十八)

目录 前言 事件流与两个阶段说明 说明 事件捕获 目标 说明 事件冒泡 目标 事件冒泡概念 简单理解 阻止冒泡 目标 语法 注意 综合示例代码 总结 前言 梳洗罢&#xff0c;独倚望江楼。过尽千帆皆不是&#xff0c;斜晖脉脉水悠悠。肠断白蘋洲 事件流与两个阶段说明…...

国产OS移植工业物联网OPC-UA协议

国家对于工业互联网、基础软件等关键领域的重视程度不断提升&#xff0c;为工业领域的硬件与软件国产化提供了坚实的政策保障。国产操作系统对工业物联网的一些重要领域的适配支持一直在推进。本次通过国产UOS系统移植测试OPC-UA协议。 1、OPC UA通信协议 OPC UA 协议&#xf…...

第25章 汇编语言--- 信号量与互斥锁

信号量&#xff08;Semaphore&#xff09;和互斥锁&#xff08;Mutex&#xff0c;全称Mutual Exclusion Object&#xff09;是两种用于管理对共享资源的访问的同步机制。它们在多线程或多进程编程中非常重要&#xff0c;可以确保同一时间只有一个线程或进程能够访问特定的资源&…...

写个自己的vue-cli

写个自己的vue-cli 1.插件代码2. 发布流程3. 模板代码讲解3.1 vue2模板的运行流程:3.2 vue3模板的运行流程: 1.插件代码 写一个自己的vue-cli插件 插件地址&#xff1a;插件地址 流程&#xff1a; 实现简单版 vue-cli 步骤文档1. 项目初始化 - 创建项目文件夹 qsl-vue-cli - …...

使用new Vue创建Vue 实例并使用$mount挂载到元素上(包括el选项和$mount区别)

new Vue({...}) 是创建一个新的 Vue 实例的方式。你可以通过传递一个选项对象来配置这个实例。常见的选项包括&#xff1a; •data&#xff1a;定义组件的数据属性。 •el&#xff1a;指定 Vue 实例应该挂载到哪个 DOM 元素上&#xff08;通常是一个选择器字符串&#xff0c;如…...

【理论】测试框架体系TDD、BDD、ATDD、MBT、DDT介绍

一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…...

机器学习全流程解析:数据导入到服务上线全阶段介绍

目录 1. 数据导入 2. 数据预处理 3. 超参数搜索与优化 4. 模型训练 5. 模型评估 6. 模型压缩与优化 7. 模型注册与版本管理 8. 服务上线与部署 总结 1. 数据导入 数据源&#xff1a;数据库、文件系统、API等。数据格式&#xff1a;CSV、JSON、SQL 数据库表、Parquet …...

shell脚本练习

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 if [ -f /tmp/size.log ];thencat /tmp/size.logelsestat exist.sh | awk -F: "NR5" > /tmp/size.logfi ​ 2、写一个 shel1 脚本,实现批量添加…...

金山WPS Android面试题及参考答案

说说你所知道的所有集合?并阐述其内部实现。 在 Android 开发(Java 语言基础上)中有多种集合。 首先是 List 集合,主要包括 ArrayList 和 LinkedList。 ArrayList 是基于数组实现的动态数组。它的内部有一个数组来存储元素,当添加元素时,如果数组容量不够,会进行扩容操作…...

分类模型为什么使用交叉熵作为损失函数

推导过程 让推理更有体感&#xff0c;进行下面假设&#xff1a; 假设要对猫、狗进行图片识别分类假设模型输出 y y y&#xff0c;是一个几率&#xff0c;表示是猫的概率 训练资料如下&#xff1a; x n x^n xn类别 y ^ n \widehat{y}^n y ​n x 1 x^1 x1猫1 x 2 x^2 x2猫1 x …...

高等数学学习笔记 ☞ 单调性、凸凹性、极值、最值、曲率

1. 单调性 1. 单调性定义&#xff1a;设函数在区间上有定义&#xff0c;对于区间上任意两点&#xff0c;若&#xff1a; ①&#xff1a;当时&#xff0c;恒有&#xff0c;则称函数在区间上单调递增。 ②&#xff1a;当时&#xff0c;恒有&#xff0c;则称函数在区间上单调递减…...

【操作系统】详解操作系统及其结构

考察频率难度40%--60%⭐⭐ 这又是一类面试考察题&#xff0c;是关于操作系统的一些概念问题&#xff0c;很少会单独拎出来作为一个问题进行提问&#xff0c;但却是必须要掌握的。因为如果这个你不会&#xff0c;其他的问题就已经没有回答的必要了。 什么是操作系统&#xff1…...

primitive 的 Appearance编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…...

自动化测试框架搭建-接口数据结构设计

目的 确认数据库如何保存接口数据&#xff0c;既有扩展性&#xff0c;数据又全又好用 根据用途设计数据库字段 区分环境&#xff1a;可以明确当前接口自动化用例&#xff0c;是在哪个环境需要执行的 模块&#xff1a;微服务架构&#xff0c;不同测试同学负责不同的模块&…...

Python自学 - 使用自定义异常

<< 返回目录 1 Python自学 - 使用自定义异常 在Python中&#xff0c; 不仅可以使用内置异常&#xff0c;用户还可以创建自己的异常。自定义异常需要继承自Exception类或其子类&#xff0c;如下是一个自定义异常示例&#xff1a; 示例1&#xff1a;一个简单的自定义异常…...

微信小程序-Docker+Nginx环境配置业务域名验证文件

在实际开发或运维工作中&#xff0c;我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件&#xff0c;用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx&#xff0c;就需要将该验证文件正确地映射&#xff08;挂载&#xff09;到容器中&#xff0c;并…...

“AI智能服务平台系统,让生活更便捷、更智能

大家好&#xff0c;我是资深产品经理老王&#xff0c;今天咱们来聊聊一个让生活变得越来越方便的高科技产品——AI智能服务平台系统。这个系统可是现代服务业的一颗璀璨明珠&#xff0c;它究竟有哪些魅力呢&#xff1f;下面我就跟大家伙儿闲聊一下。 一、什么是AI智能服务平台系…...

【PPTist】插入形状、插入图片、插入图表

一、插入形状 插入形状有两种情况&#xff0c;一种是插入固定的形状&#xff0c; 一种是插入自定义的形状。 插入固定的形状时&#xff0c;跟上一篇文章 绘制文本框 是一样一样的&#xff0c;都是调用的 mainStore.setCreatingElement() 方法&#xff0c;只不多传的类型不一…...

云集电商:数据库的分布式升级实践|OceanBase案例

电商行业对数据库有哪些需求 云集电商作为一家传统电商企业&#xff0c;业务涵盖了美妆个护、服饰、水果生鲜、健康保健等多个领域&#xff0c;在创立四年后在纳斯达克上市&#xff08;股票代码&#xff1a;YJ&#xff09;。与京东、淘宝、拼多多等电商平台不同&#xff0c;云…...

OOM排查思路

K8S 容器的云原生生态&#xff0c;改变了服务的交付方式&#xff0c;自愈能力和自动扩缩等功能简直不要太好用。 有好的地方咱要夸&#xff0c;不好的地方咱也要说&#xff0c;真正的业务是部署于容器内部&#xff0c;而容器之外&#xff0c;又有一逻辑层 Pod 。 对于容器和…...

Q_OBJECT宏报错的问题

在Qt中继承QObject&#xff0c;并且加上Q_OBJECT宏&#xff0c;有时候会报错&#xff0c;比如我的错误&#xff1a; error: debug/httpmgr.o:httpmgr.cpp:(.rdata$.refptr._ZTV7HttpMgr[.refptr._ZTV7HttpMgr]0x0): undefined reference to vtable for HttpMgr 意思是没有虚…...

iOS - 关联对象

详细总结 Objective-C 的关联对象功能&#xff1a; 1. 基本使用 // 1. 设置关联对象 objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);// 2. 获取关联对象 id objc_getAssociatedObject(id object, const void *key);// 3. …...

Linux之进程

Linux之进程 一.进程进程之形ps命令进程状态特殊进程孤儿进程守护进程 进程创建之创建子进程进程特性优先级进程切换&#xff08;分时操作系统&#xff09; 二.环境变量三.进程地址空间四.进程终止&进程等待五.进程替换六.自定义shell 本篇博客希望简略的介绍进程&#xff…...

数据库事务

一 事务的概念 为什么要有事务&#xff0c;我们先前没学事务&#xff0c;也能写sql语句&#xff0c;事务的意义是什么? 由来: 是为了服务应用层开发&#xff0c;降低开发难度。假如没有事务&#xff0c;那我们身为开发人员&#xff0c;要处理转账需求&#xff0c;此时一定是有…...

Python statistics 模块

在数据分析和科学计算中&#xff0c;统计学是一个非常重要的工具。 Python 提供了一个内置的 statistics 模块&#xff0c;专门用于处理基本的统计计算。本文将详细介绍 statistics 模块的功能和使用方法&#xff0c;帮助初学者快速掌握如何使用这个模块进行基本的统计分析。 …...

AI知识-TF-IDF技术(Term Frequency-Inverse Document Frequency)

摘要 TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种常见的统计方法&#xff0c;用于评估一个词对于一个文档集或一个语料库中的其中一份文档的重要性。本文将全面阐述TF-IDF的通俗理解、技术原理、应用场景&#xff0c;并做以总结。 通俗理…...

spring cloud的核心模块有哪些

Spring Cloud 的核心模块就像一套精心设计的工具箱&#xff0c;每个模块都扮演着特定的角色&#xff0c;共同构建起微服务架构的坚实基础。 1. Spring Cloud Netflix&#xff08;部分组件已迁移或弃用&#xff0c;但仍是理解 Spring Cloud 的重要参考&#xff09;&#xff1a; …...

java_将数据存入elasticsearch进行高效搜索

使用技术简介&#xff1a; (1) 使用Nginx实现反向代理&#xff0c;使前端可以调用多个微服务 (2) 使用nacos将多个服务管理关联起来 (3) 将数据存入elasticsearch进行高效搜索 (4) 使用消息队列rabbitmq进行消息的传递 (5) 使用 openfeign 进行多个服务之间的api调用 参…...

RAG中的文本切分策略详解

RAG中的文本切分策略详解 1. 选择RAG中的文本切分策略 1.1 不同的文本切分策略 1. CharacterTextSplitter - 这是最简单的方法。它默认基于字符(默认为"")来切割,并且通过字符的数量来衡量块的长度 2. RecursiveCharacterTextSplitter - 基于字符列表拆分文本。 …...

1-1 电场基本概念

目录&#xff1a; 目录 目录&#xff1a; 1.0 电荷守恒定律 2.0 互斥与相吸 3.0 电场的概念 4.0 库伦定律 5.0 矢量的概念 1.0 电荷守恒定律 电荷守恒定律是物理学中的一个基本原理&#xff0c;它指出在一个封闭系统内&#xff0c;电荷的总量是保持不变的。这意味着电荷既…...

SpringBoot初始化执行自定义接口

SpringBoot初始化执行自定义接口 直接加载接口的方法上即可 PostConstructpublic void init() {//加载初始化数据}PostConstruct‌是一个在Java EE 5规范中引入的注解&#xff0c;用于标记在依赖注入完成后需要执行的方法。这个注解定义在javax.annotation包中&#xff0c;而不…...

【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】

第1章 Ubuntu安装与基本使用 1.1 Linux与Ubuntu Linux是一种开源、类Unix操作系统内核&#xff0c;拥有高稳定性和强大的网络功能。由于其开源性和灵活性&#xff0c;Linux被广泛应用于服务器、嵌入式设备以及桌面环境中。 Ubuntu是基于Debian的一个流行Linux发行版&#xf…...

C++大端小端判断方法

文章目录 大端小端定义判断方法方法一&#xff1a;利用联合体&#xff08;Union&#xff09;特性判断方法二&#xff1a;通过指针类型转换判断方法三&#xff1a;利用位运算与移位操作判断方法四&#xff1a;使用系统提供的字节序相关宏&#xff08;特定平台支持&#xff09; 联…...

【IO编程】标准IO和文件IO的对比

标准 I/O 和 文件 I/O 是两种常见的输入输出操作方式。它们的核心功能都是处理数据流&#xff0c;但使用场景和实现方式有所不同&#xff0c;适用于不同的需求。 标准 I/O 标准 I/O 是指与标准输入、标准输出和标准错误流&#xff08;分别为 stdin、stdout 和 stderr&#xf…...

C#范围表达式,模式匹配,逆变和协变--11

目录 一.范围表达式 1.概述 2.语法 3.代码示例 4.实现原理 5.应用场景 二.模式匹配 1.概述 2.核心概念 3.常用模式类型 4.Switch表达式 5.使用示例 6.优势 三.逆变和协变 1.概述 2.泛型类型参数的变性 3.协变示例 4.逆变示例 5.注意事项 6.应用场景 总结 一…...

矩阵求逆的几种方式

矩阵求逆的几种方式&#xff08;以二阶为例&#xff09; 矩阵求逆的方法有多种&#xff0c;以下是常用的几种方式总结&#xff1a; 1. 行列式公式法 这是最常见的方法&#xff0c;适用于 2 2 2 \times 2 22矩阵。 对于矩阵&#xff1a; Φ [ a b c d ] , \Phi \begin{bma…...

全新市场阶段, Plume 生态不断壮大的 RWAfi 版图

加密市场在 2024 年迎来了新的里程碑。BTC 不仅成功推出 ETF&#xff0c;以 BTC 为代表的主流加密货币还在一系列传统金融机构的推动下逐步与主流金融市场接轨。与此同时&#xff0c;随着特朗普成功当选下一任美国总统&#xff0c;他承诺推出一系列友好的加密政策&#xff0c;并…...

HTTPS SSL/TLS 工作流程

目录 一、HTTP/HTTPS 简介1、HTTP协议相关内容2、HTTPS协议3、HTTP版本差异&#xff1a; 二、HTTPS 协议工作流程解析1. 客户端请求 SSL 握手2. 服务端接收 SSL 握手连接3. TLS 握手中的密钥协商4. HTTP 数据的加密与解密5. 安全性保障 三、HTTPS 协议的相关知识拓展1. TLS 与 …...

基于异步IO的io_uring

基于异步IO的io_uring 1. io_uring的实现原理 io_uring使用了一种异步IO机制&#xff0c;它通过一对环形缓冲区(ring buffer)实现用户态于内核态之间的高效通信&#xff0c;用户只需将IO请求放入提交队列&#xff0c;当内核完成IO请求时&#xff0c;会将结果放入完成队列&…...

【redis】centos7下安装redis7

在CentOS 7下安装Redis7可以通过以下两种方法实现&#xff1a;手动编译安装和使用YUM进行安装。 CentOS 7系统的环境和版本&#xff1a; $ cat /etc/centos-release CentOS Linux release 7.9.2009 (Core)手动编译安装 参考官方文档&#xff1a;https://redis.io/docs/lates…...

信息系统项目管理-采购管理-采购清单示例

序号类别产品/服务名称规格/功能描述数量备注1硬件服务器高性能处理器&#xff0c;大容量存储10HP、DELL2网络设备高速路由器和交换机10华为3工作站多核处理器&#xff0c;高分辨率显示器25国产设备4移动检查设备手持式移动检查仪&#xff0c;可连接云平台30国产设备5打印机和扫…...