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

网络层之IP协议

在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的?

如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?

IP协议 

IP协议是网络层最重要的协议, 它具备一种能力: 在复杂的网络环境确定一个合适的路径将数据从主机发送给主机. 而TCP协议提供的一种策略: 将数据可靠传输的策略. 而这些策略要落地和执行, 都是要由IP协议执行的.

一. 基本概念

主机: 配有IP地址, 但是不进行路由控制的设备(其实也可以进行路由控制);

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

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

 IP地址: 目标网络(网络号) + 目标主机(主机号)

任何一台主机一定都是存在于某一个子网之中的, 数据包经过转发到了不同的子网, 最后到达了目标网络中的目标主机.    

在学习网络时要时刻意识到, 网络不是凭空产生的, 而是有人为我们专心精心设计过的, 如同OS一样. 

二. IPV4协议头格式

提到协议格式, 就要提到两个问题: 

4位头部长度 和 16位总长度

1. 如何进行报文和有效载荷的分离? 这里4位头部长度16位总长度就解决了这个问题.

类似TCP, IP报头也有4位首部长度, 且单位也是 4 字节. 因此IP报头的大小为 [0, 15] * 4 = [0, 60], 标准的报文长度是 20 (不加选项) .

16位总长度 = 报头长度 + 有效载荷长度, 由于报头长度已知, 所以有效载荷长度也知道了, 分离问题解决.

8位协议号

8位协议表示上层协议的类型, 如TCP/UDP等

第二个问题是: 报文如何向上交付(分用)? 这就很容易解释了, 发送方如果是基于TCP通信那就会在协议字段填TCP, 接收方在IP层解包向上分用时, 根据发送方填入的协议号分用给特定的传输层协议即可.

4位版本号

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4; 而IPv6是 6.

IPv4地址为4字节, IPv6地址为16字节. 由于全球 IP 地址增长迅速, IPv4 地址已趋于 耗尽, 因此后来引入了 IPv6. IPv6在中国的发展最好, 但是由于与IPv4的兼容性不好没有被广泛使用.

8位服务类型

这个字段了解, 知道TOS字段的四个选项即可.

3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0).

4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要

8位生存时间

TTL表示报文在路径转发的过程中, 经历的路由器的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么报文就会被丢弃了.

当网络中存在路由环路时, 数据包可能会一直在网络中循环转发, 造成资源浪费甚至网络拥塞. 这个字段主要是用来防止数据包在路由环路中无限转发的.

16位首部校验和

16位头部校验和 使用CRC循环冗余码进行校验, 来鉴别头部是否损坏, 因为:

1. IP 是无连接, 尽力而为的协议, 只负责将数据包从源 IP 传输到目标 IP,

2. 数据完整性检查由上层协议(如 TCP/UDP)负责, 避免重复校验.

32位源地址 和 32位目标地址

这两个地址用于标识通信的两端主机. 不用多说

16位标识, 3位标志 和 13位分片偏移

 这三个字段专门用于进行 IP报文分片 操作. 先来说说分片是什么? 为什么要分片?

1. 报文有可能需要分片是因为数据链路层协议限定的单帧有效载荷不能超过最大传送单元(MTU), 大部分是1500字节. 通过 ifconfig 可以查看到:

2. 而网络层的数据是传输层提供的, 因此这就可以解释为什么TCP的滑动窗口中的报文不能一次性全部发出去, 而是需要以 MSS (MSS = MTU - IP 头部 - TCP 头部) 为单位分批发出去. 这样做的好处是 避免 IP 层的分片, 提高网络效率. 

3. IP分片是不好的, 而且应该成为网络通信的小概率事件, 因为如果报文的一个分片丢失, 接受方就会丢弃整个报文, 即使其它分片被成功接收也没用, 所以分片就相当于增加了报文重传的概率, 潜在地降低网络效率. 于是传输层的 MSS 也可以解释为TCP为了可靠传输进行的一个隐性策略. 

4. 上面只是为了避免分片的策略, 但还是要有策略去应对分片的, 如果TCP就给了IP一个超过MTU的报文, MAC桢协议又没法处理, IP就需要分片.

5. 既然有分片那就有重组分片只能由当前主机的IP协议来做, 重组只能由对等层实体来做.

那么如何进行分片呢? 这就需要这三个字段了.

(1) 16位标识: 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的. 用于重组的时候去识别该报文分片.

(2) 3位标志

  • 第一位为保留位, 不使用且为0。
  • 第二位为 1 表示禁止分片, 若此时报文长度超过MTU, 则IP会丢弃报文. 若为 0 表示允许分片, IP正常分片即可
  • 第三位表示更多分片, 对于一个TCP报文的分片, 最后一个分片该位为0, 其他均为1. 主要用来识别该分片是否是最后一个分片

(3) 13位片偏移

  • 如果分片, 那么表示分片的有效数据部分相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 由于单位是8字节, 所以是由实际数据大小/8得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍 (否则报文就不连续了)
  • 若不分片, 对应报文在原始报文的偏移量为0

举个例子:

假设TCP向IP传输了一个 2980 字节的报文, 报头为标准报头(20字节)

IP给TCP报文加上自己的标准报头(20字节), 发现IP报文总长为3000字节, 超过了MTU的1500字节, 需要分片.

每个分片都是需要一个IP报头的, 因此:

第一片:IP报头20字节, 有效载荷1480字节, 1480字节中还包括TCP的报头, 总长度1500字节. 
第二片:IP报头20字节, 提取后面的有效载荷1480字节, 总长度1500字节.
第三片:最后剩下有效载荷20 字节,再加上IP报头20字节,总长度40字节.

 了解了分片之后, 关于重组也有几个问题:

1. 接收方怎么知道一个报文被分片了?

  • a. 如果分片标志位为1, 表示该报文被分片过
  • b. 如果分片标志位为0, 若片偏移大于0, 表明该报文是分片的最后一个, 否则没有分片

2.同一个报文的分片怎么全部识别出来的?

每一组分片的报文的16为标志(ID)都相同, 对比ID即可

3.报文如何排序,如何得知报文有没有收全

  • a. 第一个报文的偏移量为0, 更多分片为 1
  • b. 最后一个报文的偏移量大于0, 更多分片为 0
  • c. 对于中间报文, 前一个报文的偏移量 + 其自身长度 = 后一个报文中偏移量, 然后按 片偏移 进行升序排列即可

IP分组就介绍到这.

总结

综上, 我们可以看到TCP和IP在格式上有点像, 都采用了 固定格式的头部(20字节) + 可选选项 +数据部分. 此外, 

  • 都有"源和目的"字段
  • 都包含“首部长度”和“校验”字段

都属于 TCP/IP 协议族, 宗旨都是为了保证网络的核心能力, 把数据可靠地从A主机发送到B主机.


理解IP报文在系统中向下交付

当报文从传输层向下交付给网络层时, 发送了两步关键操作:

1. 移动data指针添加ip报头,

2. 将报文从TCP 发送队列 -> IP 发送队列:

三. 网段划分

举个例子, 通俗解释为什么要网段划分? 假如小明在学校捡到一张学生证, 上面只有他的学号信息, 如果想要归还给失主, 遍历学校的每个人(单个排除法)查找效率太低下,  而学号是唯一的, 其一般的格式为: 学院专业信息+个人标识, 因此就要想办法提高查找效率, 而查找的本质是排除, 所以就可以利用学号的格式制定高效的排除策略.

 学校(网络)中有很多学院(子网), 假设每个学院都有各自的负责人(路由器), 负责人存储了学院每个学生的信息(路由表), 且他们之间也有彼此的联系方式, 于是小明把学生证先交给自己学院的负责人, 负责人通过比对发现不是自己学院的学生, 于是就一次性排除了此学院的一群人, 而负责人通过学号去定位目标学院(目的网络), 又排除了好几群人, 目的学院的负责人再进行排除, 最终找到了失主(目的主机).

放到IP协议中也是一样, 学号可以看作IP地址. 各学院可以看作子网, 每个院的负责人可以看作路由器, 负责人的群可以看作公网, 丢失钱包的人可以看作目标主机. 为了跨网络高效的数据传输, 所以要进行子网划分, 以群为单位进行高效定位.

IP地址分为两个部分, 网络号和主机号:

  • 网络号: 保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

不同的子网其实就是把网络号相同的主机放到一起. 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复, 其中路由器的主机号通常是 1, 综上还可以看出路由器的主要功能之一是进行路由选择和路由转发.

那么子网的构建是谁来作的呢? 是路由器.

谁来管理子网中的IP地址呢? 也是路由器, 因为手动管理子网内的IP, 是一个相当麻烦的事情, 所以路由器一般都带有DHCP功能, 自动的给子网内新增的主机节点分配IP地址, 因此路由器也可以看做一个DHCP服务器.

管理肯定是涉及到程序的, DHCP是一种应用层协议, 所以路由器也具有应用层的功能.

此外, 路由器还支持其它的应用层协议比如http, 路由器背面一般有 IP 和 账号密码, 浏览器输入IP即可进入管理界面, 进行一些设置.

因此路由器虽然主要工作在网络层, 但是其功能不仅限于网络层, 还有应用层.

介绍完IP格式和路由器功能后, 现在正式介绍网段划分:

1.早期分类模式

最早, IP地址分为五类, 因为IP是有限的, 也是一种需要竞争的资源, 所以IP的划分是有多种划分依据的, 比如特定的组织机构, 或根据当地人口密度和基建情况, 因此这是要把IP进行分类的一种理由.

  • A类:IP的第一个比特位为0, 后面7个比特位为网络号, 剩余24位为主机号. 最多能构建2的7次方个网络, 每个网络最多可容纳2的24次方个主机(0.0.0.0到127.255.255.255)
  • B类:IP的前两位固定位10, 后面14个比特位为网络号, 剩余16位为主机号. 最多能构建2的14次方个网络, 每个网络最多可容纳2的16次方个主机.(128.0.0.0到191.255.255.255)
  • C类:IP的前三位固定110, 后面21个比特位为网络号, 剩余8位为主机号. 最多能构建2的21次方个网络, 每个网络最多可容纳2的8次方个主机.(192.0.0.0到223.255.255.255)
  • D类和E类只需知道前三个和前四个比特位为1, 后一个为0, 能够构建的网络更多, 每个网络能容纳的主机数更少.(D类224.0.0.0到239.255.255.255,E类240.0.0.0到247.255.255.255)

随着Internet的飞速发展, 这种划分方案的局限性很快显现出来, 大多数组织都申请B类网络地址,  因为C类容纳的主机比较少, 而A类网络号又太少, 所以B类更适合被一般的组织申请. 这导致B类地址很快就分配完了, 而A类却浪费了大量地址(因为一个网络通常容不下这么多主机)

补充: 申请ABC类IP地址的角色并不是个人组织, 而是运营商, 他们在进行网络基础建设时需要使用.

2. CIDR

针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):

这里引入子网掩码(subnet mask)来区分网络号和主机号:

  • 子网掩码也是一个32位的正整数.
  • 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关


 以一个C类网的IP格式为例, 它正常来说子网掩码是255.255.255.0, 假如将子网掩码设置为 255.255.255.192, 则相当于抽出了一部分主机号去充当网络号, 这样在一个子网中又划分出四个子网, 但是每个子网的主机更少了, 且实际的IP总量没变.

经过这样的划分之后, 可以通过子网掩码去控制子网数量和主机数量的需求平衡, 提高了IP地址的利用率, 减少浪费.

3.IP地址数量不足的现状

CIDR正式能提高了IP地址利用率, 但是IP地址的绝对数量并没有增加, 仍然处于严重不足的状态

这时候人们又提出了三种新的技术解决这个问题:

  • 动态分配IP地址: 只给接入网络的设备分配IP地址, 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的. 也就是说IP地址可以被复用, 但这种方案也只是杯水车薪.
  • NAT技术: 后面会重点介绍
  • IPv6: IPv6用16字节128位来表示一个IP地址, 这样就大大增加了IP地址的数目, 从根本上解决了问题. 它由中国发明并完善, 而且在国内我们很多计算机都已经使用了IPv6. 但IPv4还是国际主流, 再加上IPv4早已被编入主流操作系统中, 所以目前IPv6的推行还有很大困难.

4.特殊的IP地址

  • 主机号全零: 主机号为全0的IP代表网络号, 如192.168.128.0, 这个IP地址代表这个局域网, 
    不能绑定主机.         
  • 主机号为1:  如192.168.128.1代表当前子网的默认路由器(入口路由器), 所以这个IP地址也不能绑定主机.
  • 主机号为全1: 如192.168.128.255表示广播地址, 表示把数据发到本网络中的所有的主机上, 同样不可绑定主机
  • 127.0.0.1: 表示本地环回,数据不会发送到网络上,而是经过网络的分层处理再被本主机接收,以前用过很多次了。

5. 运营商 

 我们已经知道, 通过家用路由器可以管理一个局域网内主机的IP, 而家用路由器还连着运营商路由器, 运营商是做什么的? 在现实中, 我们的网段划分都是经过设计的, 所以说互联网是一个被设计过的世界. 那么设计者是谁呢?

互联网的设计者, 主要是全球的通信运营商, 在中国, 主要由移动、电信、联通三大运营商主导, 其他国家也有各自的运营商(如美国的 AT&T、Verizon,欧洲的 Vodafone 等)

上网的背后, 都是由大量的网络基础设置建设来支撑的, 而运营商就负责提供网络基础设施, 包括:

  • 骨干网建设:大规模光纤网络、海底光缆、基站等。
  • IP 地址分配:网络资源划分,保证不同地区、不同用户能够连接互联网。
  • 数据传输与流量管理:优化网络流量,提高网络稳定性和效率。

这些工作的特点是前期投入高、回报周期长, 涉及大量基础设施建设, 因此往往需要政府的政策支持, 使其具备一定的行业垄断性.

回顾历史, 21 世纪初, 随着智能手机的兴起, 移动互联网逐步发展:

  • 早期, 网络资费高昂, 由于基础设施尚未完善, 流量资费对普通用户来说较贵, 限制了互联网的普及
  • 运营商降低资费, 推动普及, 为了扩大市场规模, 运营商逐步降低资费, 推出各种流量套餐让更多人负担得起网络费用
  • 互联网产业随之繁荣当用户规模足够大时, 互联网服务行业(如电商、社交媒体、云计算等)蓬勃发展, 从而形成了今天的数字经济生态.

由此我们可以知道, 我们主机发送和收到的报文, 都必须经过运营商. 既然我们用户是运营商的客户, 那么反过来, 互联网公司也是运营商的客户, 也需要向运营商付费.

 所以我们如果欠费了, 运营商就可以拦截我们的报文, 不允许接收和发送报文; 既然运营商能拦截报文, 也就可以通过"无形的墙"拦截非法目的地址的请求, 那么我们使用魔法的行为是在 cheat yys.

6. 私有IP地址和公网IP地址

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

  • 10.*,前8位是网络号, 共16,777,216个地址
  • 172.16.到172.31., 前12位是网络号, 共1,048,576个地址
  • 192.168.*,前16位是网络号, 共65,536个地址
  • 包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

比如云服务器通过ifconfig查看ip, 查询到的是内网(私有)IP:

 windows下ipconfig, 也能查到内网IP:

依着这个图继续说.

WAN口IP和LAN口IP 

每个路由器通常都连接两个不同的网络, 因此它需要配置 两个IP地址, 分别用于管理各自的网络接口:

  1. WAN口IP(广域网 IP): 用于连接上一级网络 (例如, 运营商或上级路由器)

  2. LAN口IP(局域网 IP): 用于管理和提供本地网络 (如家庭或企业局域网)

以上图家庭路由器为例:

LAN口 IP:192.168.1.1/24 , 这是 家庭局域网的网关地址, 通常用于分配内网 IP并管理家庭设备的通信, 该网段(192.168.1.0/24)下的设备, 例如手机、电脑,会被分配 IP 192.168.1.X

WAN口 IP:10.1.1.2/24, 这是连接运营商/上级路由器的 IP属于运营商内部网络/公网, 该 IP 地址是由上一级网络(ISP 或更高层网络设备)分配的, 这个地址用于NAT 转换, 将家庭内网设备访问互联网的数据进行地址转换.

那么是否报文从家用路由器出去后, 就到了公网去了?

不是, 而是到了一个由运营商组织的更大的内网之中, 因此真实的网络情况是, 公网+私网(家用网络和运营商私网)构建的网络拓扑环境.

  • 私网中, 一个子网中所有节点的IP地址都不能相同, 要具有唯一性. 但不同子网中的IP地址可以相同.
  • 公网中, IP地址必须具有唯一性, 不论属于哪个子网.
NAT 转换

NAT转换是解决IP地址绝对数量的关键技术, 而且现在依然在使用, 理解NAT就能理解 公网+私网网络拓扑体系了.

假设, 我们现在要用我们的电脑给服务器发送一条数据, 我电脑的内网IP地址为192.168.1.201/24,服务器的公网IP地址为 122.77.241.3/24。

如果将192.168.1.201/24作为源IP, 122.77.241.3/24作为目的IP填入报头且传输过程中不做更改, 就会发生下面的问题:

电脑会把报文发送给默认网关, 路由器进行路由选择之后选择出来一条发送路径:

     

    但服务器对数据做处理并将处理后的数据放入IP报文内, 并将目的IP设为192.168.1.201/24, 这是一个内网地址, 而内网地址是可以在不同的子网中重复使用的, 所以当数据发到运营商路由器那里时, 运营商路由器维护的子网下会有很多这样的IP, 无法进行路由选择. 此时报文有来无回!

    为了解决公网和内网的通信问题, 我们引入了NAT(网络地址转换)技术

    内网中的主机需要和公网进行通信时, 路由器会自动将IP报头中的源IP替换成该路由器的WAN口IP: 

     接着, 我们看看数据的接收:

    服务器将处理后的数据经过封装, IP报头中的源IP是一个公网IP122.77.241.3/24, 目的IP是一个公网IP122.77.241.4/24. 由于两个地址都是公网IP, 它们在公网内具有唯一性. 所以, 发送到广域网后是可以到达运营商路由器的. 但该数据到达运营商路由器后, 由于此时报文的 目的IP 是运营商路由器的WAN口IP. 那么, 运营商路由器怎么知道哪份数据应该发送给哪个主机呢?

    这个问题就需要用到数据链路层去解释了.  

    四. 路由

    在复杂的网络拓扑结构中找出一条通往终点的路线称为路由, 数据从一个节点传递到另一个节点称为一跳. 

    首先我们需要明确, 当IP数据报到达路由器以后:

    • 如果目的IP在本网段内直接将数据发送给目标主机.
    • 如果不在本网段内, 就要查路由表, 选择一个端口发送出去, 给它上一层网络的路由器.

     那么路由器是如何判断当前这个IP数据报该发送到哪里呢? 也就是路由表具体应该怎么查呢?

    在Linux上, 使用route指令可以查看当前机器上的路由表, 可见我们的计算机也有路由选择功能, 不过这里只可以选择本子网内和外部两个方向:

    • 路由表的Destination表示目的IP地址, Gateway是下一跳的IP地址, Genmask是子网掩码. Iface是发送接口, 通过网线和对应网络相连. 这台主机有两个网络接口(Iface),一个网络接口eth0连到192.168.10.0/24网络,另一个网络接口eth1连到192.168.56.0/24网络。
    • Flags中的 表示此条目有效, G 标志表示此 条目 的下一跳地址是某个路由器的地址, 比如上图的第一条目默认路由; 没有 G 的条目表示目的网络地址是与本机接口直接相连的网络, 不必经路由器转发, 比如上图第二条表示本地子网路由
    • default表示缺省网段, 图中为0.0.0.0, 此条目是在查过路由表中其它条目后发现目的网络都不匹配, 那么就会把报文转发给 default 这行的 gateway 网关. default设置为0.0.0.0, 且Genmask设置为0.0.0.0, 所以任何IP地址 & 0.0.0.0 得到的网段都是0.0.0.0, 保证了此条目最终一定能被匹配到.

    以下面这个路由表举个例子, 看看路由是如何工作的:

    当一个报文来到节点后,会经过四步完成数据报文的发送:

    • 遍历路由表
    • 目的IP和路由表中的每一行的子网掩码按位与, 得到目的网段.
    • 目的网段与Destination进行对比, 如果比对成功则通过Iface接口发出报文, 否则就继续比对, 最后一定能与默认路由相匹配.

    例一: 如果要发送的数据的目的IP是 192.168.56.3

    首先, 目的IP会跟第一行的子网掩码 255.255.255.0 得到网络号192.168.56.0, 结果与第一行的目的网络地址不符, 然后和第二行的目的网络地址比对相符, 因此该节点将会把数据从eth1接口发送出去。

    由于192.168.56.0/24正是与eth1接口直接相连的网络, 因此节点可以在该网络中查找目的IP是否有主机占用, 如果有主机使用该IP地址, 节点会把数据发送到该主机上。

    例二:如果要发送的数据包的目的地址是 202.10.1.2

    数据依旧从第一行到倒数第二行通过子网掩码进行按位与运算,并与路由表前几项的网络号进行对比。我们发现它们都不匹配,说明该数据不应该发送到该节点的网段。

    所以, 数据会按最后一行的缺省路由, 从eth0接口发往IP地址为192.168.10.1的路由器, 由IP地址为192.168.10.1的路由器根据它的路由表决定下一跳的地址.

    路由表生成算法

    上面我们是用现成的路由表去模拟路由选择的过程, 路由表是要经过一定的算法来生成的.

    路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由), 暂不介绍.

    相关文章:

    网络层之IP协议

    在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的? 如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?…...

    【设计模式】策略模式(Strategy Pattern)详解

    策略模式(Strategy Pattern)详解 一、策略模式的定义 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一组算法,将每个算法封装起来,并使它们可以相互替换,从而让算法的…...

    Elasticsearch:构建 AI 驱动的搜索体验

    Elasticsearch 介绍 当你开始使用 Elastic 时,你将使用 Elasticsearch Relevance Engine™(ESRE),它专为 AI 搜索应用程序提供支持。借助 ESRE,你可以利用一整套开发者工具,包括 Elastic 的文本搜索、向量…...

    数据文件误删除,OceanBase中如何重建受影响的节点

    当不慎误删数据文件且当前没有现成的可替换节点时,在OceanBase中,不必急于采取极端措施,可以考虑运用 server_permanent_offline_time 参数,来重建受影响的节点。 原理: server_permanent_offline_time 是 OceanBase数…...

    MySQL面试专题

    1.什么是BufferPool? Buffer Pool基本概念 Buffer Pool:缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。 Buffer Pool由缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制…...

    Redmi Note 11 T pro + 刷入 LinegaOs 22.1 记录 手机已经解锁bl.

    Redmi Note 11 T pro 刷入 LinegaOs 22.1 记录 手机已经解锁bl. 获取LIneagaOS源码, 以及https://github.com/xiaomi-mediatek-devs 这个组织提供的代码,非常感谢 环境要求: ubuntu 22.04 需要准备的依赖 sudo apt install git curl vim…...

    Python+Requests+Pytest+YAML+Allure接口自动化框架

    GitHub源码地址(详细注释):源码 调试项目python自主搭建:附项目源码 一、项目介绍 本项目是基于 PythonRequestsPytestYAMLAllure 搭建的 接口自动化测试框架,用于对 REST API 进行测试。 框架的主要特点包括&#…...

    如何解决Redis缓存异常问题(雪崩、击穿、穿透)

    引言 Redis作为一种高性能的内存数据库,被广泛应用于缓存系统的构建中。然而,在实际应用过程中,我们常常会遇到三种典型的缓存异常问题:缓存雪崩、缓存击穿和缓存穿透。这些问题如果处理不当,可能会导致系统性能下降&…...

    如何使用 Postman 进行接口测试?

    使用 Postman 这一工具,可以轻松地进行接口测试。以下是一份简单的使用教程,帮助你快速上手。 Postman 接口测试教程:详细步骤及操作技巧...

    记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException

    一、问题描述 有个文件导入功能,用到了Hutool 的加密解密功能,本地运行完全可以,但是线上报错:“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFou…...

    VLAN实验

    一:实验拓扑 二:实验需求 1、PC1和PC3所在接口为access接口,属于VLAN 2 2、PC2/4/5/6处于同一网段 其中PC2可以访问PC4/5/6 PC4可以访问PC5不能访问PC6 PC5不能访问PC6 3、PC1/3和PC2/4/5/6不在一个网段,且可以正常通讯 4、…...

    FPGA中串行执行方式之状态机

    FPGA中串行执行方式之状态机 在FPGA中,默认情况下,逻辑是并行执行的,因为FPGA的硬件资源是并行的。然而,在某些情况下,你可能需要某一段逻辑以串行方式执行。这可以通过以下几种方法实现:使用状态机(Finite State Machine, FSM)​、使用计数器控制、使用流水线(Pipel…...

    【常用的中间件】

    中间件(Middleware)是位于客户端和服务器之间的软件层,用于处理客户端请求和服务器响应之间的各种任务。中间件可以提供多种功能,如负载均衡、消息队列、缓存、身份验证等。以下是常用的中间件及其作用: 1. 消息队列中…...

    spring - 十二种事务失效场景

    目录 ​编辑 一、方法内部调用 1、原理: 2、结论: 3、解决方法: 1. 增加一个service,把一个事务的方法移到新增加的service方法里面,然后进行注入再调用 2. 在自己类中注入自己 3. 通过AopContentent 二、访问权限不是pubilc 三、方法用final修饰 四、没有被spr…...

    python脚本处理excel文件

    1.对比perl和python 分别尝试用perl和python处理excel文件,发现perl的比较复杂,比如说read excel就有很多方式 Spreadsheet::Read use Spreadsheet::ParseExcel 不同的method,对应的取sheet的cell方式也不一样。更复杂的是处理含有中文内…...

    C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程

    作为一只C#萌新,当你试图用数组装下整个世界时,系统可能会温柔地弹出一句**"Index was outside the bounds of the array."**。别慌!这份求生指南将用段子教你玩转数组 一、数组是什么 数组简单来说就是由相同元素组成的一个集合&a…...

    MySQL 性能优化方向

    MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...

    2025年- G26-Lc100-57.插入间隔(max、min)--java版

    1.题目描述 题目翻译: 给定一个不重叠的区间阵列 intervals,其中intervals[i] [starti, endi]表示第i一个区间的起始位置和结束位置,并且intervals 按照起始位置starti升序排序。 另外,给定一个新的区间newInterval [start, e…...

    Burp Suite HTTPS解密原理

    HTTPS HTTPS是在HTTP的基础上增加了SSL/TLS协议,提供了数据的加密、完整性校验和身份认证等安全保障。HTTPS的工作过程可以分为两个阶段:握手阶段和数据传输阶段。 流程如下图所示: 通过上面的图可以看到,在TCP建立连接后会发起…...

    【ESP32S3】esp32获取串口数据并通过http上传到前端

    通过前面的学习(前面没发过,因为其实就是跑它的demo)了解到串口配置以及开启线程实现功能的工作流程,与此同时还有esp32作为STA节点,将数据通过http发送到服务器。 将这两者联合 其实是可以得到一个:esp32获…...

    怎么查看linux是Ubuntu还是centos

    要确定你的Linux系统是基于Ubuntu还是CentOS,可以通过几种不同的方法来进行判断。下面是一些常用的方法: 要快速判断 Linux 系统是 Ubuntu 还是 CentOS,可通过以下方法综合验证: 一、查看系统信息文件 1. /etc/os-release 文件…...

    Qt进程间通信:QSharedMemory 使用详解

    1. 什么是 QSharedMemory? QSharedMemory 是 Qt 中用于进程间共享内存的类。它允许多个进程共享一块内存区域,从而避免数据传输时的 IO 操作,提高通信速度。通过共享内存,多个进程可以直接读写这块内存,而无需经过文件…...

    【day1】数据结构刷题 链表

    一 反转链表 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]…...

    使用redis设置店铺状态

    知识点: 将前端传过来的status(0,1)通过redis对象以key,values值的形式存放在redis中。 #设置店铺状态 redisTemplate.opsForValue().set(KEY,status); #获取店铺状态 Integer status (Integer) redisTemplate.o…...

    基于python+django的商城网站-电子商城管理系统源码+运行

    基于 python 开发的电子商城网站,平台采用 B/S 结构,后端采用主流的 Python 语言进行开发,前端采用主流的 Vue.js 进行开发。该系统是给师弟做的课程作业。同学们可以拿去自用。学习问题可以留言哦。 整个平台包括前台和后台两个部分。 前台…...

    深度解读 C 语言运算符:编程运算的核心工具

    一、引言 在 C 语言的编程世界中,运算符是构建逻辑与运算的基石,它如同一位指挥家,精准地协调着程序中各种数据的操作与处理。C 语言丰富多样的运算符涵盖了算术、关系、逻辑、位运算、赋值以及其他杂项运算等多个领域,为开发者提…...

    docker中间件部署

    1.docker安装 # 1.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安装包 yum install -y yum-utils# 3.设置镜像的仓库 # 3.1.默认是国外的&#x…...

    【Python Cookbook】字符串和文本(二)

    字符串和文本(二) 6.字符串忽略大小写的搜索替换7.最短匹配模式8.多行匹配模式9.将 Unicode 文本标准化10.在正则式中使用 Unicode 6.字符串忽略大小写的搜索替换 你需要以忽略大小写的方式搜索与替换文本字符串。 为了在文本操作时忽略大小写&#xf…...

    docker pull时报错:https://registry-1.docker.io/v2/

    原文:https://www.cnblogs.com/sdgtxuyong/p/18647915 https://www.cnblogs.com/OneSeting/p/18532166 docker 换源,解决连接不上的问题。 编辑以下文件,不存在则创建: vim /etc/docker/daemon.json {"registry-mirrors&qu…...

    DeepSeek助力文案,智能音箱如何改变你的生活?

    你好,我是三桥君 你有没有为写智能音箱的宣传文案而抓耳挠腮过?三桥君在这方面可是有些感想,今天就来给你唠唠怎么用DeepSeek写出超赞的智能音箱宣传文案。 首先,你得给DeepSeek喂足“料”。这就好比做饭,你得准备好各…...

    【机器学习】什么是随机森林?

    什么是随机森林? 随机森林(Random Forest)是一种集成学习方法,它通过组合多个决策树来提高预测的准确性和鲁棒性。可以把随机森林看作是“森林”,而森林中的每棵树就是一个决策树。每棵树独立地做出预测,最…...

    Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务

    近期英国爱丁堡大学发表Nature Machine Intelligence研究工作,提出了一种名为ELLMER(具身大型语言模型支持机器人)的创新框架,通过整合大型语言模型(如GPT-4)、检索增强生成(RAG)、视…...

    [特殊字符] 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

    🔍 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字 🚀 题目速览 题目难度:⭐⭐⭐(需掌握位运算与组合数学) 考察重点:二进制状态处理、位运算、乘法原理、枚举 P10984 [蓝桥杯 2…...

    【AcWing】算法基础课-数学知识

    目录 1、质数 1.1 试除法判定质数 暴力解法 优化解法 1.2 分解质因数(试除法) 暴力解法 优化解法 1.3 筛质数 朴素筛法(nlogn) 埃氏筛法(nloglogn) 线性筛法(n) 2、约数 2.1 试除法求约数 2.2 约数个数 2.3 约数之和 2.4 最大公约数 实现方法一 实现方法二 …...

    JVM常见概念之条件移动

    问题 当我们有分支频率数据时,有什么有趣的技巧可以做吗?什么是条件移动? 基础知识 如果您需要在来自一个分支的两个结果之间进行选择,那么您可以在 ISA 级别做两件不同的事情。 首先,你可以创建一个分支&#xff…...

    k8s存储介绍(二)Secret

    Kubernetes(K8s)提供了一种安全的方式来存储和管理敏感信息,如密码、OAuth 令牌和 SSH 密钥,这就是 Secret。使用 Secret 可以避免将敏感数据硬编码到 Pod 规范或容器镜像中,从而提高安全性和可管理性。 1. Secret 的…...

    Css布局-常规流笔记

    https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Normal_Floworghttps://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Normal_Flow 前言 常规流布局是html元素默认布局,凡是没有设置过css布局的html元素,默认布局方式称为常…...

    Linux系统管理与编程08:任务驱动综合应用

    兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 [环境] windows11、centos7.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境:Lamp(linux httpd mysql8.0 php) [步骤] 3 …...

    基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案

    基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案 一、数据获取与准备 (一)OCO - 2 氧气 A 带辐射数据 数据下载:从 OCO - 2 官方数据发布平台(如 NASA 的相关数据存储库),按照研究所需的时间范围(例如,近 5 年的数据以获取足够的样本…...

    Linux centos7 虚拟用户访问脚本

    下面是脚本: #!/bin/bash #function:创建 vsftpd 虚拟用户脚本 #author: 20250324 IT小旋风# 判断是否是 root 用户 if [ "$USER" ! "root" ]; thenecho "不是 root 用户,无法进行安装操作"exit 1 fi# 关闭防火墙 system…...

    HTTP 协议中请求与响应的详细解析

    前言:HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在互联网上传输超文本的协议 --由一个请求和响应组成,一个完整的 HTTP 请求由请求行(Request Line)、请求头(Headers&…...

    Collectors.toMap / list 转 map

    前言 略 Collectors.toMap List<User> userList ...; Map<Long, User> userMap userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity()));假如id存在重复值&#xff0c;则会报错Duplicate key xxx, 解决方案 两个重复id中&#…...

    根据模板将 Excel 明细数据生成 PDF 文档 | PDF实现邮件合并功能

    在日常办公中&#xff0c;我们常常会面临这样的需求&#xff1a;依据特定的模板&#xff0c;把 Excel 里的每一条数据转化为单独的 PDF 文档&#xff0c;且这些 PDF 文档中的部分内容会根据 Excel 数据动态变化。这一功能不仅能高效完成任务&#xff0c;还支持图片的动态替换&a…...

    <KeepAlive>和<keep-alive>有什么区别

    在不同的前端技术框架里&#xff0c;<KeepAlive> 和 <keep-alive> 有着不同的含义与使用场景&#xff0c;下面分别从 Vue 2 和 Vue 3 来为你详细介绍它们的区别。 Vue 2 中的 <keep-alive> 在 Vue 2 里&#xff0c;<keep-alive> 属于内置组件&#x…...

    vscode正则表达式使用

    小标题 ^\d.\d.\d\s.*$ ^表示匹配字符串的开头。\d\.\d\.\d表示匹配一到多个数字&#xff0c;接着一个小数点&#xff0c;再接着一到多个数字&#xff0c;然后又一个小数点和一到多个数字&#xff0c;用来匹配类似 “2.1.1” 这样的标题号部分。\s表示匹配一个空格。.*表示匹配…...

    【LeetCode 题解】算法:4.寻找两个正序数组的中位数

    1. 引言&#xff1a;挑战 LeetCode 经典算法题 在算法这片广袤无垠的天地里&#xff0c;一道道经典题目宛如夜空中熠熠生辉的星辰&#xff0c;持续吸引着开发者们投身其中&#xff0c;不断探索。今天&#xff0c;我们继续将目光聚焦于 LeetCode 平台上一道极具代表性的题目&am…...

    2025.03.23【前沿工具】| CellPhoneDB:基因网络分析与可视化的利器

    文章目录 1. CellPhoneDB工具简介2. CellPhoneDB的安装方法3. CellPhoneDB常用命令 1. CellPhoneDB工具简介 在单细胞生物学的迅猛发展中&#xff0c;理解细胞间的通讯机制对于揭示组织功能和疾病状态至关重要。CellPhoneDB工具&#xff0c;作为一个专门设计用来分析单细胞转录…...

    Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表

    目录 PowerQuery工具基础修改现有数据理规则PowerQuery抓取数据的两种方式多文件合并透视不同表结构多表追加数据透视追加与合并整理横向表格:逆透视 数据用拆分工具整理数据算账龄 不等步长值组合合并文件夹中所有文件PowerQuery处理CSV文件双行表头、带合并单元格如何做数据…...

    【WebGIS教程2】Web服务与地理空间服务解析

    前言&#xff1a; 在万物互联的时代&#xff0c;Web服务作为跨平台协作的基石&#xff0c;正推动地理信息领域向开放共享迈进。地理空间Web服务通过标准化协议&#xff08;如WMS、WFS&#xff09;与松耦合架构&#xff0c;打破传统GIS的封闭性&#xff0c;实现数据与功能的无缝…...

    [250325] Claude AI 现已支持网络搜索功能!| ReactOS 0.4.15 发布!

    目录 Claude AI 现已支持网络搜索功能&#xff01;ReactOS 0.4.15 发布&#xff01; Claude AI 现已支持网络搜索功能&#xff01; 近日&#xff0c;Anthropic 公司宣布&#xff0c;其 AI 助手 Claude 现在可以进行网络搜索&#xff0c;为用户提供更及时、更相关的回复。这项新…...