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

网络基础III

目录

一、网络层

1.1IP协议

1.2网段划分(🔺)

1.3特殊的ip地址

1.4ip地址的数量限制

1.5私有ip和公网ip 

1.6路由

二、数据链路层

2.1认识以太网

2.2以太网帧格式

2.3认识mac地址

2.4mac地址和ip地址

2.5认识MTU

2.6MTU对IP协议的影响

2.7MTU对UDP协议的影响

2.8MTU对TCP协议的影响

三、ARP协议

3.1ARP协议的作用

3.2ARP数据报格式

四、其他重要协议或技术

4.1DSN域名解析

4.2域名简介

4.3浏览器输入url

4.3.1域名解析

4.3.2发起请求,构造连接

4.3.3 数据的转出(粗粒度)

​五、ICMP协议

六、ping命令和traceroute命令

七、NAT技术


一、网络层

在复杂的网络环境中确定一个合适的路径

1.1IP协议

  • 基本概念:主机是具有IP地址但不能进行路由控制的设备,路由器是具有IP地址又能进行路由控制的设备,节点和主机和路由器的统称
  • 协议头格式
  1. 4位版本好:指定IP协议的版本,ipv4就是4
  2. 4位首部长度:IP头部的长度是多少个32bit,也就是 length * 4 的字节数,4bit表示最大 的数字是15,因此IP头部最大长度是60字节
  3. 8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0),4位 TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小成本,这四者相互冲突,只能选择一个,对于 ssh/telnet这样的应用程序,最小延时比较重要,对于ftp这样的程序,最大吞吐量比较重要
  4. 16位总长度:IP数据报整体占多少个字节
  5. 16位标识:唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一个片里面的这个 id都是相同的
  6. 3位标记:第一位保留,第二位为1标识禁止分片,如果此时报文的长度超过MTU,ip模块就会丢弃报文,第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0,类似于一个结束标记
  7. 13位片偏移:是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值 * 8 得到的,因此除了最后一个报文之外,其他报 文的长度必须是8的整数倍(否则报文就不连续了)
  8. 8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数, 一般是64,每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环
  9. 8位协议:表示上层协议的类型
  10. 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
  11. 32位源地址和32位目标地址:表示发送端和接收端
  12. 选项字段(不定长,最多40字节):略

1.2网段划分(🔺)

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

  • 网络号: 保证相互连接的两个网段具有不同的标识

  • 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

  • 子网实际上就是由相同网络号的主机组成的

  • 在子网中新增一个主机,这台主机的网络号必须和该子网的网络号一样,但主机号必须和该子网中的其他主机的主机号不一样

  • 通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同

  • 有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不, 一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器

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

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 

  • 以上这种方法可能会导致某一类型的ip地址申请频繁,大量的ip地址被浪费
  • 因此针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)
  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号,子网掩码也是一个32位的正整, 通常用一串 "0" 来结尾,将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关 

1.3特殊的ip地址

将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网

将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包

127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1 

1.4ip地址的数量限制

IP地址(IPv4)是一个4字节32位的正整数,那么一共只有 2的32次方 个IP地址,大概是43亿左右,而TCP/IP 协议规定,每个主机都需要有一个IP地址,这意味着,一共只有43亿台主机能接入网络么? 实际上,由于一些特殊的IP地址的存在,数量远不足43亿,另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址,CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:

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

1.5私有ip和公网ip 

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

10.*,前8位是网络号,共16,777,216个地址

172.16. 到 172.31.,前12位是网络号,共1,048,576个地址

192.168.*,前16位是网络号,共65,536个地址

包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP)

一个路由器可以配置两个IP地址,一个是WAN口IP, 一个是LAN口IP(子网IP),路由器LAN口连接的主机,都从属于当前这个路由器的子网中,不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了

每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了,子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP,这种技术称为NAT(Network Address Translation,网络地址转换)

1.6路由

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

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

  • 那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表
  • 路由表可以使用route命令查看
  • 如果目的IP命中了路由表,就直接转发即可,不命中就按照缺省的转发
  • 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到 192.168.56.0/24网络,路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发

转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3,跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符再跟第二行的子网掩码做与运算得到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路由器根据它的路由表决定下一跳地址

二、数据链路层

用于两个设备(同一种数据链路节点)之间进行传递

2.1认识以太网

"以太网" 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容,例如: 规定了网络拓扑结构,访问控制方式,传输速率等,例如以太网中的网线必须使用双绞线,传输速率有10M, 100M, 1000M等,以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等

2.2以太网帧格式

  •  源地址和目的地址是网卡的硬件地址,也叫mac地址,实在出厂的时候就固化了,长度为48位
  • 帧协议类型字段有三种值,分别是IP,ARP,RARP
  • 帧协议的末尾是CRC校验码

2.3认识mac地址

  • mac地址是用来识别数据链路层相连的节点
  • 长度为48为,即6个字节,一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了,不能修改,mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突,也有些网卡支持用户配置mac地址)

2.4mac地址和ip地址

  • IP地址描述的是路途总体的起点和终点,标识数据选择的路径
  • MAC地址描述的是路途上的每一个区间的起点和终点,根据标识的路径,采用ARP协议进行转换,得知下一个发送目标
  • ip一般是服务商给的,mac是网卡出厂就固化的
  • ip长度16位,mac长度48位
  • ip在不同局域网中可能是变化的,但是mac是固定的
  • nat技术转发后的报文,源ip可能会变成一样的,但mac地址不一样,可以根据目的ip,经过ARP技术,得到要发往主机的mac地址,目标主机也可以根据mac地址区分是哪个主机发来的报文

2.5认识MTU

MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层,产生的限制

  • 以太网帧中的数据长度规定最小46字,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
  • 如果一个数据包从以太网路由到数据链路上,数据包长度大于数据链路的MTU了,则需要对数据包进行分片(fragmentation),不同的数据链路层标准的MTU是不同的 

2.6MTU对IP协议的影响

  •  由于数据链路层MTU的限制,对于较大的IP数据包要进行分包

  • 将较大的IP包分成多个小包,并给每个小包打上标签

  • 每个小包IP协议头的16位标识(id) 都是相同的

  • 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0)

  • 到达对端时再将这些小包,会按顺序重组拼装到一起返回给传输层,一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据

2.7MTU对UDP协议的影响

  • 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报,这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败,那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了

2.8MTU对TCP协议的影响

  • TCP的一个数据报也不能无限大,还是受制于MTU

  • TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size),TCP在建立连接的过程中,通信双方会进行MSS协商

  • 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)

  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS,MSS的值就是在TCP首部的40字节变长选项中(kind=2)

  • 使用ifconfig命令,即可查看ip地址,mac地址,和MTU

三、ARP协议

ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议 

3.1ARP协议的作用

  • 建立主机ip与mac地址之间的映射关系
  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,直接丢弃,因此在通讯前必须获得目的主机的硬件地址
  • 源主机发出ARP请,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中,不符合就丢弃掉该数据包
  • 每台主机都维护一个ARP缓存表,可以用arp -a命令查看,缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
  • 为什么要有缓存表? 为什么表项要有过期时间而不是一直有效?
  • 缓存表减少了查找MAC地址所需的时,因为查询缓存通常比广播ARP请求并等待响应要快得多。 这有助于加快数据包在网络中的传输速度。 网络设备的MAC地址可能会因为多种原因发生变化,如设备重启、故障恢复或更换网络接口卡等。 如果ARP缓存表中的表项一直有效,那么即使MAC地址已经发生变化,发送方仍然可能使用旧的MAC地址发送数据,导致数据无法正确到达目的地

3.2ARP数据报格式

注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。

硬件类型指链路层网络类型,1为以太网

协议类型指要转换的地址类型,0x0800为IP地址

硬件地址长度对于以太网地址为6字节

协议地址长度对于和IP地址为4字节

op字段为1表示ARP请求,op字段为2表示ARP应答

四、其他重要协议或技术

4.1DSN域名解析

DNS是一整套从域名映射到IP的系统 

  • TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系
  • 最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的,如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件,其他计算机也需要定期下载更新新版本的hosts文件才能正确上网
  • 这样就太麻烦了,于是产生了DNS系统,一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系,如果新计算机接入网络,将这个信息注册到数据库中
  • 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址,我们的计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容
  • cat /etc/hosts

4.2域名简介

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称

域名使用 . 连接 com

com: 一级域名,表示这是一个企业域名,同级的还有 "net"(网络提供商),"org"(非盈利组织) 等

baidu: 二级域名,公司名

www: 只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议

4.3浏览器输入url

 以百度为例子,当我在浏览器的中输入网址www.baidu.com时,发生了什么?

来源:当我的浏览器输入域名后,发生了什么? - shy_BIU - 博客园

4.3.1域名解析

  1. 首先数据真正的传输是在数据链路层,通过帧转发实现的,通过知道对方的mac地址,将数据发送给目标主机,而要得知对方的mac地址,就必须得知对方的ip地址通过ARP技术转化获得mac地址,所以当务之急是要得知对方的ip地址
  2. 而应用层只认识ip地址,通过域名如何得知对方的ip地址,这就需要DNS域名解析了
  3. 但是主机并不会直接去找DNS服务器。首先,主机会现在自己的hosts文件中查询是否有该域名映射的ip地址,Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制
  4. 如果hosts文件中没有,浏览器会查看自己的缓存
  5. 当这两个方法都无法获取到ip地址,就需要去找DNS服务器了,以下是分布式的域名系统
  6. DNS域名系统可以通过迭代或者递归来查询ip地址

4.3.2发起请求,构造连接

获取了对方的IP地址后,我们自然要发送相对的HTTP报文(当然因为百度是https://www.baidu.com/,所以在发送HTTP请求报文前要先发送一个HTTPS报文建立一个安全信道,并且确定网站的真实性。)

  1. 建立TCP连接,牢记三次握手的过程
  2. 确认连接后发送一个HTTP请求报文。封装数据包的过程:首先写入http请求行、请求头、空行、请求体,然后来到传输层,加成tcp首部字段,再来到网络层加上ip首部字段,接着发送一个ARP包获取对方的mac地址后在数据链路层封装成帧,通过路由转发到目标mac地址,接着从下往上进行拆包,读取请求后,构建一个响应报文以相同的方式传回
  3. CONNECT表示要求用隧道协议连接代理,连接https协议下的域名时经常可以抓到这个类型的包。GET表示获取资源,与POST作用大致相同,最大的不同就是POST有body,而GET没有

4.3.3 数据的转出(粗粒度)

  1. 请求抵达运营商维护的CDN服务器,看看是否有该请求对应响应的静态页面。CDN的一大作用就是贮存一些在它所管理区域会频发用到的响应静态页面,这在很大程度上就很好的减轻了网络压力,用户不用直接去询问网站的总部服务器,可以更快得到响应,增加了用户体验的幸福感,还减轻了网络拥塞,两全其美

  2. 如果CDN没有,则先询问百度入口服务器,如果入口服务器有对应请求响应的静态页面,那么可以作为一个反向代理回复请求报文。入口服务器的作用也是为了提高用户体验的幸福感,入口服务器也会贮存一些常用的静态页面,这也不用再深入其他服务器取数据了。

  3. 如果入口服务器也没有,则要深入去相关的服务器取得数据。就比如我要看图片,还有我登录了账号的信息,就会从图片服务器,用户管理服务器去取响应数据。

 五、ICMP协议

ICMP协议是一个网络层协议,一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通,但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因

功能:

确认IP包是否成功到达目标地址

通知在发送过程中IP包被丢弃的原因

ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议

ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;

ICMP大概分为两类报文:一类是通知出错原因,一类是用于诊断查询 

六、ping命令和traceroute命令

  • ping 的是域名,而不是url,一个域名可以通过DNS解析成IP地址,ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期),ping命令会先发送一个 ICMP Echo Request给对端,对端接收到之后, 会返回一个ICMP Echo Reply 

  • ping命令基于ICMP,是在网络层,而端口号,是传输层的内容,在ICMP中根本就不关注端口号这样的信息

  • traceroute也是基于ICMP协议实现,能够打印出可执行程序主机,一直到目标主机之前经历多少路由器

七、NAT技术

NAT能够将私有IP对外通信时转为全局IP,也就是就是一种将私有IP和全局IP相互转化的技术方法,很多学校、家庭、公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP,全局IP要求唯一,但是私有IP不需要,在不同的局域网中出现相同的私有IP是完全不影响的,可以解决ip地址数量不够的问题

  • NAT路由器将源地址替换成全局的IP
  • NAT路由器收到外部的数据时,又会把目标IP替换回10.0.0.10
    在NAT路由器内部有一张自动生成的,用于地址转换的表
  • 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系

如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的,那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机? 这时候NAPT来解决这个问题了,使用IP+port来建立这个关联关系

  • 这种关联关系也是由NAT路由器自动维护的,例如在TCP的情况下,建立连接时就会生成这个表项,在断开连接后,就会删除这个表项

 NAT技术的缺点:

  • 生成和删除表项需要开销
  • 无法从NAT外部向内部服务器建立连接
  • 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开

NAT和代理服务器

  • 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题,代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙
  • 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层
  • 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网
  • 从部署位置上看,NAT一般集成在防火墙、路由器等硬件设备上,代理服务器则是一个软件程序, 需要部署在服务器上

代理服务器

  • 代理服务器分为正向代理和反向代理
  • 正向代理:翻墙
  • 反向代理:负载均衡,类似一种缓存

相关文章:

网络基础III

目录 一、网络层 1.1IP协议 1.2网段划分(🔺) 1.3特殊的ip地址 1.4ip地址的数量限制 1.5私有ip和公网ip 1.6路由 二、数据链路层 2.1认识以太网 2.2以太网帧格式 2.3认识mac地址 2.4mac地址和ip地址 2.5认识MTU 2.6MTU对IP协议的…...

【SpringBoot】自动配置原理与自定义启动器

Spring Boot 自动配置原理与自定义启动器 目录标题 Spring Boot 自动配置原理与自定义启动器摘要1. 引言2. Spring Boot自动配置原理分析2.1 自动配置的核心流程2.2 核心注解与配置文件解析2.2.1 EnableAutoConfiguration2.2.2 spring.factories 文件 2.3 自动配置类剖析2.4 配…...

Element实现el-dialog弹框移动、全屏功能

1、在Vue项目中src/utils目录中创建dialog.js,用来定义draggable-dialog; import Vue from vue Vue.directive(draggable-dialog, { // 属性名称draggable-dialog,前面加v- 使用bind(el, binding, vnode) {const dialogHeaderEl el.querySe…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(11)

详解(11) 初始化配置解析上下文 senv environ;ngx_memzero(&conf, sizeof(ngx_conf_t));/* STUB: init array ? */conf.args ngx_array_create(pool, 10, sizeof(ngx_str_t));if (conf.args NULL) {ngx_destroy_pool(pool);return NULL;}conf.te…...

千峰React:案例一

做这个案例捏 因为需要用到样式,所以创建一个样式文件: //29_实战.module.css .active{text-decoration:line-through } 然后创建jsx文件,修改main文件:导入Todos,写入Todos组件 import { StrictMode } from react …...

部署Joplin私有云服务器postgres版-docker compose

我曾经使用过一段时间 Joplin,官方版本是收费的,而我更倾向于将数据掌握在自己手中。因此,在多次权衡后,我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连,下面是使用 Docker Compose 配置数据库…...

rust学习笔记6-数组练习704. 二分查找

上次说到rust所有权看看它和其他语言比有什么优势,就以python为例 # Python3 def test():a [1, 3, -4, 7, 9]print(a[4])b a # 所有权没有发生转移del b[4]print(a[4]) # 由于b做了删除,导致a再度访问报数组越界if __name__ __main__:test() 运行结…...

Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效

目录标题 Jsmoke 🚬🚬 by Yn8rt使用方式界面预览功能特性支持的敏感信息类型 Jsmoke 🚬🚬 by Yn8rt ​ 该插件由 Yn8rt师傅 开发,插件可以理解为主动版的hae和apifinder,因为其中的大多数规则我都引用了&a…...

PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下

PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…...

Spring Boot操作MaxComputer(保姆级教程)

目录 引言 一、引入依赖 二、配置文件 application.properties(信息用自己的奥) 三、实体类User.java 四、UserController 五、UserService 六、UserDao 七、UserDao.xml 八、postman 访问,成功查询数据 附件(修改和删除数据) 引言…...

Spring的构造注入

1.开发步骤2.构造方法的重载 2.1参数个数不同2.2构造参数个数相同时 3.注入总结 注入:通过Spring的配置文件,为成员变量赋值 Set注入:Spring调用Set方法,通过配置文件,为成员变量赋值 构造注入:Spring调用…...

服务器IPMI用户名、密码批量检查

背景 大规模服务器部署的时候,少不了较多的网管和监测平台,这些平台会去监控服务器的性能、硬件等指标参数,为了便于管理和控制,则需要给服务器IPMI带外管理添加较多的用户,这就需要对较多的服务器检查所对应的IPMI用…...

管理后台环境配置

后端配置及启动 a. 软件安装 1. Java sdk 1.8 2. maven 3.6 3. intellij IDEA 2024 4. Visual C Redistributable 5. mongodb 7.0 6. mysql 8.0 双击安装:mysql-installer-community-8.0.41.0.msi 版本选择:Full,包括服务器和客户端 …...

element-ui infiniteScroll 组件源码分享

简单分享 infiniteScroll 组件源码,主要有以下四个方面: 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构: 二、页面属性。 2.1 infinite-scroll-disab…...

Pany-v2:LFI漏洞探测与敏感文件(私钥窃取/其他)自动探测工具

地址:https://github.com/MartinxMax/pany 关于Pany-v2 Pany-v2 是一款 LFI(本地文件包含)漏洞探测工具,具备自动识别敏感文件的能力。它能够利用 LFI 漏洞检测并提取 id_rsa 私钥、系统密码文件以及其他可能导致安全风险的敏感信息。该工具…...

供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)

供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面 会员 UI 设计图(一)...

Day11,Hot100(贪心算法)

贪心 (1)121. 买卖股票的最佳时机 第 i 天卖出的最大利润,即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…...

nss刷题4

[SWPUCTF 2023 秋季新生赛]Pingpingping 看看源码&#xff0c;首先是get传参Ping_ip.exe,然后如果请求了_ping参数&#xff0c;就会执行ping命令&#xff0c;执行三次 <?php highlight_file(__FILE__); error_reporting(0); $_ping $_GET[Ping_ip.exe]; if(isset($_ping…...

Eclipse 编译项目指南

Eclipse 编译项目指南 引言 Eclipse 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛用于Java、C/C、Python等多种编程语言的开发。在Eclipse中编译项目是进行软件开发的基础步骤。本文将详细介绍如何在Eclipse中编译项目&#xff0c;包括项目设置…...

天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库

天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库&#xff0c;可用于文件打包&#xff0c;数据整合&#xff0c;加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有&#xff0c;专做储物之用。拥有不可思议之力&#x…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...