[网络] 网络层--IP协议

目录

一、IP协议

1.1 基本概念 

1.2 IP协议报头

1.3 如何将报头和有效载荷分离和分用

1.4 分片与组装

1.5 如何减少分片?

1.6 分片和封装的具体过程

 二、网段划分

   2.1 再次理解IP地址

2.2 了解DHCP

2.3 网络划分方案

2.4 为什么要进行网络划分

2.5 特殊的 IP 地址 

三、IP 地址的数量限制

四、私有IP地址和公网IP地址

4.1基本概念

4.2 运营商

4.3 路由器

4.4.1路由的概念

4.4.2 路由的具体过程


一、IP协议

1.1 基本概念 

        IP(Internet Protocol)即互联网协议,是计算机网络中用于数据通信的一套规则或标准。它是TCP/IP(传输控制协议/互联网协议)协议族中的核心协议之一。

  • IP协议:负责在网络层将数据(通常是数据包)从源设备传输到目标设备
  • 网络层:在复杂的网络环境中确定一个合适的路径.

IP地址可以标识互联网中唯一的一台设别,它提供了一种可以将一台主机的数据跨网络发送到另一台主机的能力,而传输层的TCP协议提供了数据的安全和可靠性。我们常见的IP格式通常为网络号+主机号,例如197.128.128.5,其中197.128.128.0就是该IP地址的网络号,5就是主机号。这样设计的原因是可以大大减少网络路由的时间,例如我们知道了一个学生的学号,我们可以根据学号的前几位找到他所在的院系班级,在通过后几位确定具体是班级里的哪一个人。

  • 主机: 配有 IP 地址, 在前几年,主机一般都不进行路由控制,但是如今的主机大多数都是支持路由的
  • 路由器: 即配有 IP 地址, 又能进行路由控制
  • 节点: 主机和路由器的统称
1.2 IP协议报头

  • 4 位版本号 (version):  指定 IP 协议的版本, 对于 IPv4 来说, 就是 4.
  • 4 位头部长度 (header length):  表示IP报头的长度,单位是4字节,可以表示的最大长度是 60 字节.
  • 8 位服务类型 (Type Of Service):  3 位优先权字段(已经弃用), 4 位 TOS 字段, 和 1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要
  • 16 位总长度 (total length):  IP 数据报整体占多少个字节.
  • 16 位标识 (id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片 了, 那么每一个片里面的这个 id 都是相同的.
  • 3 位标志字段:  第一位保留.,暂时不会用到, 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文,第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1,类似于一个结束标记,如果没有分片该位会置为0
  • 13 位分片偏移 (framegament offset): 是分片相对于原始 IP 报文开始处的偏移(不带IP报头). 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文 就不连续了).
  • 8 位生存时间 (Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是 64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  • 8 位协议: 表示上层协议的类型
  • 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏.
  • 32 位源地址和 32 位目标地址: 表示发送端和接收端.
  • 选项字段:不定长, 最多 40 字节
1.3 如何将报头和有效载荷分离和分用

如何分离:

IP报头的分离过程与TCP的报头分离过程类似,由于IP报头的基本长度是20个字节,所以我们可以先读取报文的前20个字节,从中提取出4位首部长度和16位总长度,如果首部长度大于20个字节,那 首部长度 - 20 就是选项的长度,剩下的就是有效载荷。

 如何分用:

在报头中存在一个8位协议号,它表示了传输层采用的是TCP协议还是UDP协议,这样目标主机在传输层就可以解析了

1.4 分片与组装

在数据链路层,他会将网络层中传下来的IP报文封装成帧,在通过网络发送出去,而数据链路层一次性发送的数据是有限的,通常这个大小称为MTU(Maximum Transmission Unit,最大传输单元),通常是1500个字节。

当IP报文超过这个长度时,数据链路层可能就会丢弃这部分数据,所以为了避免这样的情况就需要在IP层对报文进行分片。

在学习TCP协议时,我们了解到一个叫滑动窗口的知识,而滑动窗口中的数据是可以暂时直接发送的数据,在发送时通常是分为一块一块的发送的而不是一整块全部发送,这样设计的原因就是为了满足数据链路层最大传输单元的问题。

而在实际数据发送时,分片并不是主流做法,因为将报文分片发送会提高报文的丢失概率。因为接收端需要将所有的分片都收到才能拼装成一个完整的数据,如果在传输过程中其中的一个分片丢失了,就会导致发送方超时重传,所以对于传输层来说,丢失一个分片的影响是与丢失整个报文的影响相同的。分片会使丢包的概率增加,尽可能需要减少分片。

1.5 如何减少分片?

如何减少分片就需要通过产生分片的原因来解决,造成分片的根本原因是传输层交付到网络层的数据太大了,所以可以通过控制传输层交付下来的数据大小来解决。MSS(Maximum Segment Size,最大报文段长度)是TCP/IP协议中的一个概念,它指的是TCP数据报(Segment)中的数据字段的最大长度。MSS的值决定了TCP传输层每次能够传输的最大数据量,这个值在TCP连接建立时通过三次握手过程中的SYN和SYN-ACK报文段协商确定。

MSS的大小对TCP性能有重要影响。如果MSS设置得太小,会导致网络传输效率低下,因为每次传输的数据量太少,需要更多的报文段和更多的网络开销。如果MSS设置得太大,又可能会因为网络中的MTU(Maximum Transmission Unit,最大传输单元)限制而导致报文段被分片,同样会增加网络开销,并可能增加数据包丢失的风险。

MSS的值通常基于网络的MTU来设置。在以太网环境中,由于以太网的MTU通常是1500字节(不包括以太网帧头和帧尾),而IP头部和TCP头部通常占用40字节(IPv4头部20字节+TCP头部20字节),所以MSS的默认值通常为1460字节(1500 - 40 = 1460)。但是,这个值可能会因为各种因素(如VPN隧道、IPSec加密等)而减少。

1.6 分片和封装的具体过程

假设网络层要发送的数据大小是3000个字节。

分片的过程

由于他超过了MTU的大小,所以需要将他进行分片,而每个分片必须要有IP报头,因为每个分片都需要知道自己由哪来到哪去,由于只有第一个分片拥有IP报头(假设报头是20个字节,不带选项),通常的做法是将第一个分片的报头拷贝一份,在修改一下里面的某些属性。MTU最多支持一次性发送1500字节,因为我们要给其他分片添加报头,所以我们至少需要分为三片

问题:

在报头中的片偏移字段为13为,可以表示的最大长度为2^13个字节,但是IP报文的最大长度字段是16为,最大长度时2^16个字节,所以这就存在一个问题,当IP报文过长的话,一些分片的片偏移可能无法表示。再实际填写数据时,我们将实际的片偏移大小右移三位,在使用数据时,我们左移三位

  • 大致分片情况如上图所示,接下来处理报头
  • 假设所有分片的16位标识为1234
  • 分片1的其他分片为1,片偏移为0
  • 分片2的其他分片为1,片偏移为185( 1480 / 8 )
  • 分片3的其他分片为0,片偏移为370( (1480+1480)/ 8  )

封装的过程

要明白封装的过程我们只需要明白这几个问题即可

接收端如何区分接收到的数据是否是分片?

如果数据时分片的话,我们接收到的无非可能是第一片,第二片或者第三片,通过上面的图我们可以知道如果分片的话,其他分片或者片偏移至少一个不为0。所以如果没有分片的话,其他分片==0&&片偏移==0

如何保证接收端接收到了所有的分片? 

将所有收到的分片依据片偏移按升序排列,并且判断

下一个分片的片偏移是否==上一个分片的片偏移+上一个分片的数据大小/8

如果全部都满足的话说所有的分片都接收到了

解决了上述问题,拼装的过程就很简单了,去掉所有分片的报头,并且依次尾插即可

 二、网段划分

   2.1 再次理解IP地址

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

  • 网络号: 保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
  • 不同的子网其实就是把网络号相同的主机放到一起.
  • 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.

2.2 了解DHCP

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同,但是手动管理子网内的 IP, 是一个相当麻烦的事情。

有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免 了手动管理 IP 的不便,DHCP允许网络中的设备动态地从DHCP服务器获取IP地址、子网掩码、默认网关、DNS服务器地址等网络配置信息,而不需要手动设置。这样做不仅简化了网络管理,还使得设备能够更容易地移动到网络中的不同位置而不需要重新配置网络设置。

如今一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器,当我们输入WIFI的账号密码后,他就会给我们的主机分配一个IP地址,我们就可以根据这个IP地址上网了。

2.3 网络划分方案

过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示

  • A 类 0.0.0.0 到 127.255.255.255
  • B 类 128.0.0.0 到 191.255.255.255
  • C 类 192.0.0.0 到 223.255.255.255
  • D 类 224.0.0.0 到 239.255.255.255
  • E 类 240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类 网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;

例如,

一个企业想申请自己的局域网,由于A类网络号只有7位,也就是说A类网络最多可以划分2^7个子网,一般申请比较困难,所以大多数组织都愿意申请B类网络

随着互联网的快速发展,传统的分类方法逐渐暴露出一些问题,如IP地址的浪费和分配不均匀。特别是在大型企业和ISP中,一个C类网络可能无法满足需求,而分配一个B类网络又会造成大量地址的浪费。

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

  • CIDR引入了一种新的表示IP地址的方法,即使用网络前缀长度来表示网络,而不是传统的类别划分。这种方法打破了固定的类别限制,允许更灵活的地址分配。CIDR还引入了可变长度子网掩码的概念,使得网络管理员可以根据实际需求来划分子网,进一步提高了IP地址的利用率。
  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
  • 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关; 

举个例子:
假设一个IP地址的前24位表示主机号,那它的子网掩码前24位就都是1,也就是  255.255.255.0,我们假设IP地址为  192.168.1.1 ,IP地址与子网掩码做按位与运算,得到的就是网络号192.168.1.0, 

IP地址与子网掩码按位与的本质就是将IP地址的主机号置为0,而主机号可以表示的范围就是该子网可以表示的范围,在这个例子中,这个子网的范围是主机号全0~全1,即

192.168.1.0 ~192.168.1.255,但是在实际中,有两个IP地址是不能用的,主机号全0表示该子网的网络号,主机号全为1表示广播地址。

IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为 140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0

2.4 为什么要进行网络划分

网络产生的根本原因是要进行设备间的远程通信,如果我们不对网络划分的话,想要在茫茫的网络中找到一个主机,无异于大海捞针,需要检索每一个IP地址。如果存在网络划分的话,我们就可以先找到该IP地址所在的网络号,在找到具体的主机。寻找的本质就是排除,例如我们减到一张学生卡,根据他的学号,我们就可以确定他是哪一个专业的,这样我们就不需要到其他的专业寻找了,这样可以大大增加网络性能,并且有利于管理。

要注意在实际过程中网络可能会被划分很多次,这与地理位置、功能和部门等等因素有关,在划分更小的子网时,其网络号位数是增加的,而主机号是减少的。所以数据在路由时,可能是从一个很小的子网逐步路由到大的子网,再由大的子网逐步向下路由,最终在一个小的子网中找到对应的主机。

2.5 特殊的 IP 地址 
  • 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网
  • 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
  • 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1 ,这个地址代表设备的本地虚拟接口,用于将数据包从同一主机的一个网络应用程序传输到另一个网络应用程序,而不需要经过实际的物理网络接口,由于流量不经过任何外部网络,因此可以用于安全地运行和测试一些敏感的应用程序或服务。

三、IP 地址的数量限制

我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP 地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.

这意味着, 一共只有 43 亿台主机能接入网络么?

实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主 机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.

CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP 地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

  • 动态分配 IP 地址:  只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
  • NAT 技术:NAT技术是一种将私有网络地址(如局域网内部地址)转换成公共网络地址(如互联网地址)的技术。它通常部署在连接私有网络与公共网络之间的路由器或防火墙上,以实现多台计算机共用一个公网IP地址上网。
  • IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容,IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;

四、私有IP地址和公网IP地址

4.1基本概念

如果一个组织内部组建局域网,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);

例如,我们在电脑Cmd中输入 ipconfig ,我现在连接的是校园网,可以发现显示的IP地址是以10开头的私有地址

我们在来看看服务器上的IP地址

4.2 运营商

我们平时上网明明使用的是互联网公司的服务,为什么却要向移动、联通等运营商交钱呢?

  • 例如我们平时网购,这些数据不并不是直接发送给了对方的服务器,而是需要经过运营商建设的基站、路由器等设备,最终发送给对方的服务器
  • 运营商做这些工作的成本很大,所以我们上网需要向他们交钱,申请上网的权限
  • 如今的互联网公司的出现是基于运营商的这些设备的,没有运营商做这些工作,互联网就不会发展起来
  • 甚至我们的网络划分都是运营商精心策划的
4.3 路由器

        路由器能够连接两个或两个以上的个别网络,并根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。它是互联网的主要结点设备,也是互联网络的枢纽,可以称为“交通警察”。

路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:

  • LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。

我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下:

  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,直到数据包中的源IP地址替换为一个公网IP,这种技术称为NAT(Network Address Translation,网络地址转换)。

所以NAT技术在某种程度上缓解了IP地址不足的问题:通过路由器可以维护多个子网,子网内又可以维护多个设备,这样大量的个人设备使用私网IP即可,不占用有限的公网IP。

两个局域网当中的主机不能不跨公网进行通信

  • 两个局域网当中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址。
  • 即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。
  • 当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据就是要发给自己的,而不会向外进行发送了。
  • 所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。
  • 但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

4.4 路由

4.4.1路由的概念

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

路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程. 所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间.

IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。

路由器的查找结果可能有以下三种:

  • 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
  • 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
  • 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。
     
4.4.2 路由的具体过程

每个路由器内部会维护一个路由表,我们可以通过 route命令查看云服务器上对应的路由表。

  • Destination : 代表的是目的网络地址。
  • Gateway : 代表的是下一跳地址。
  • Genmask: 代表的是子网掩码。
  • Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。

如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。

数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。

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

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

相关文章

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么? 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类:对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…

【html】基础(二)

本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:js专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &am…

http增删改查四种请求方式操纵数据库

注意:在manage.py项目入口文件中的路由配置里,返回响应的 return语句后面的代码不会执行,所以路由配置中每个模块代码要想都执行,不能出现return 激活虚拟环境:venv(我的虚拟环境名称)\Scripts\activate …

Unity3D 小案例 像素贪吃蛇 03 蛇的碰撞

Unity3D 小案例 像素贪吃蛇 第三期 蛇的碰撞(完结) 像素贪吃蛇 碰撞蛇身 当蛇头碰撞到蛇身时,游戏应该判定为失败。 找到蛇身预制体,添加 Body 标签和碰撞体,碰撞体的大小为 0.5,跟蛇头和蛇身的碰撞体范…

AlDente Pro for Mac电池健康保护工具

AlDente Pro for Mac 是一款适用于 Mac 的实用电池健康保护工具。以下是它的主要特点和优势: 软件下载地址 一、保护电池寿命的原理 锂离子和聚合物电池(如 Mac 笔记本中的电池)在 30% 到 80% 之间运行时使用寿命最长。始终将电池电量保持…

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接:https://sysin.org/blog/windows-10-arm/,查看最新版。原创作品,转载请保留出处。 作者主页:s…

【VUE3.0】动手做一套像素风的前端UI组件库---Message

目录 引言自己整一个UI设计稿代码编写1. 设计信息窗口基础样式2. 设置打开和关闭的方法3. 编写实例化组件的js文件4. 看下最终效果5. 组件完整代码6. 组件调用方式 总结 引言 本教程基于前端UI样式库 NES.css 的UI设计,自行研究复现。欢迎大家交流优化实现方法~ 此次…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

基于数据挖掘的航空客户满意度分析预测系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 航空公司致力于提供多样化的服务以满足乘客需求,包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等,并希望以此提升乘…

SQL面试常见题目

SQL面试常见题目涉及多个方面,包括数据查询、数据操作、表的设计与优化等。以下列举一些经典的SQL面试题目,并附上解析答案: 1. 查询一张表中重复的数据 题目: 给定一个表 employees,包含 id, name, salary 列。如何…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面:输入url就可以直接访问授权页面:登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓&#xff0c;可以分成⼏⾏写&#xff0c;除了最后⼀⾏外&#xff0c;每⾏的后⾯都加⼀个反…

win10下使用docker、k8s部署java应用

在上一篇文章 Windows10上Docker和Kubernetes的安装 中&#xff0c;已经介绍了在 Windows10上安装Docker和Kubernetes &#xff0c;有了这个环境基础之后&#xff0c;就可以用来部署服务了 在项目目录下新建Dockfile文件&#xff0c;内容如下&#xff08;请根据实际情况调整&am…

前端——阿里图标的使用

阿里图标 将小图标定义成字体&#xff0c;通过引入字体的方式来展示这些图标 1.打开阿里图标库 https://www.iconfont.cn/ 2.登录 / 注册一个账号 3.选中你需要使用的图标 并且把它加入购物车 4.全部选择完之后 点击右上角 购物车 然后下载代码 5.解压后你下载的文…

Web+Mysql——MyBatis

MyBatis 目标 能够完成Mybatis代理方式查询数据能够理解Mybatis核心配置文件的配置 1&#xff0c;Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由…

面试面经|大模型算法岗常见面试题100道

本文提供了一份全面的大模型算法岗位面试题清单&#xff0c;包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点&#xff0c;旨在帮助求职者准备相关技术面试。 一、基础篇 1、目前主流的开源模型体系有哪些&#xff1f; Transformer体系&a…

neo4j(spring) 使用示例

文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j&#xff1a;neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…

zabbix“专家坐诊”第256期问答

原作者&#xff1a;乐维社区 原文链接&#xff1a;https://forum.lwops.cn/questions 问题一 Q&#xff1a;zabbix 6.4.18版本的&#xff0c;使用zabbix_agentd2监控mysql数据库&#xff0c;只能在界面配置mysql的相关信息吗&#xff1f;这个在zabbix表里面是明文存储的&#x…