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

LWIP的ICMP协议

ICMP协议简介

ICMP协议是一个网络层协议

背景:如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能

为什么需要ICMP协议

1IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效性,例如:数据报在网络中被丢弃了,源主机更希望等到该数据报递交过程中的异常信息

2IP 协议不能进行主机管理与查询机制,例如:不知道对方主机或者路由器的活跃,对

于不活跃的主机和路由器就没有必要发送数据报类似于电脑cmdping

ICMP协议类型与结构

ICMP协议类型

类型

应用

差错报告报文

目的不可达、源站抑制、重定向、超时、参数错误

询问报文

回送请求/回答(类似ping)、时间戳请求/回答

消息帧结构:差错/询问一样(前4

ICMP 差错报文

用于检测IP数据报在传输过程的异常信息(目的不可达、源站抑制、重定向、超时、参数错误)

ICMP类型

代码值

描述

3

0

网络不可达(找不到地方)

1

主机不可达(找到地方,找不到人)

2

协议不可达(找到地方且找到人,但口令对不上)

3

端口不可达(找到地方且找到人以及口令对上,但事情对不上)

4

需要分片但设置了不分片(发不了)

5

源站路由失败(速度慢了)

11

0

传输期间生存时间为0

1

数据报组装期间生存时间为0

ICMP 查询报文

用于诊断两个网络设备之间彼此是否能够通信

ICMP类型

报文结构

描述

08

回显请求/应答

lwip处理

910

路由器查询/通告

lwIP不处理

1314

时间戳请求/应答

1416

信息请求/应答

1718

地址掩码请求/应答

目的主机(stm)收到 ICMP 回送请求报文后立刻回送应答报文,若源主机电脑收到 ICMP 回送应答报文,则说明到达该主机的网络正常(PING

ICMP差错报文源码
 

ICMP报文数据结构

struct icmp_echo_hdr 
{ 
PACK_STRUCT_FLD_8(u8_t type); 		/* 类型 */
PACK_STRUCT_FLD_8(u8_t code); 		/* 代码 */
PACK_STRUCT_FIELD(u16_t chksum); 	/* 校验和 */
PACK_STRUCT_FIELD(u16_t id); 		/* 标志符 */
PACK_STRUCT_FIELD(u16_t seqno); 	/* 序号 */
} 
PACK_STRUCT_STRUCT; 

差错报文结构

查询报文结构

个人理解:数据里面,有一帧,请求;应答是重复这个报文(这个是错误理解,参考下一节ICMP查询章节描述

ICMP的差错报文

lwIP实现1目的不可达2超时差错报文,它们分别为icmp_dest_unreachicmp_time_exceeded函数

差错报文

类型

描述

目的不可达

在传递过程中出错,不能到达目标主机,

或到达目标主机后无法传递至上层协议

超时差错

IP首部的“TTL”字段记录着该数据报的生命值,

该数据报每被转发一次,TTL值减1。直到为0,丢弃该报

这两种差错报文最终都是调用icmp_send_response函数发送

\Middlewares\lwip\src\core\ipv4\icmp.c

不可到达函数icmp_dest_unreach

void
icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
{MIB2_STATS_INC(mib2.icmpoutdestunreachs);icmp_send_response(p, ICMP_DUR, t);// 参2: 类型不可到达    宏定义3   为0为网络不可到达      
}

不可到达类型枚举

\Middlewares\lwip\src\include\lwip\icmp.h

/** ICMP destination unreachable codes */
enum icmp_dur_type {/** net unreachable */ICMP_DUR_NET   = 0,/** host unreachable */ICMP_DUR_HOST  = 1,/** protocol unreachable */ICMP_DUR_PROTO = 2,/** port unreachable */ICMP_DUR_PORT  = 3,/** fragmentation needed and DF set */ICMP_DUR_FRAG  = 4,/** source route failed */ICMP_DUR_SR    = 5
};

 ICMP超时枚举

\Middlewares\lwip\src\include\lwip\icmp.h

/** ICMP time exceeded codes */
enum icmp_te_type {/** time to live exceeded in transit */ICMP_TE_TTL  = 0,/** fragment reassembly time exceeded */ICMP_TE_FRAG = 1
};

差错报文的原理

把丢弃的数据包IP首部和数据区域(前8字节)拷贝到差错报文当中

差错报文主要函数icmp_send_response

static void
icmp_send_response(struct pbuf *p, u8_t type, u8_t code)
{
struct pbuf *q;
struct ip_hdr *iphdr;
struct icmp_echo_hdr *icmphdr;
ip4_addr_t iphdr_src;
struct netif *netif;
u16_t response_pkt_len;
MIB2_STATS_INC(mib2.icmpoutmsgs);
/* response_pkt_len = 20 + 8 = 28*/
response_pkt_len = IP_HLEN + ICMP_DEST_UNREACH_DATASIZE;
if (p->tot_len < response_pkt_len) {
response_pkt_len = p->tot_len;
} /
* 申请pbuf内存 */
q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + response_pkt_len,
PBUF_RAM);
if (q == NULL) {
MIB2_STATS_INC(mib2.icmpouterrors);
return;
} /
* 获取对方主机数据报的IP首部 */
iphdr = (struct ip_hdr *)p->payload;
/* 在q->payload地址附加icmp_echo_hdr结构体 */
icmphdr = (struct icmp_echo_hdr *)q->payload;
/* 设置ICMP首部信息 */
icmphdr->type = type;
icmphdr->code = code;
icmphdr->id = 0;
icmphdr->seqno = 0;
/* 把对方主机的数据复制IP首部和前8字节数据到新申请的pbuf当中 */
SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,
response_pkt_len);
/* 复制目标地址 */
ip4_addr_copy(iphdr_src, iphdr->src);
/* 判断是否同一网段 */
netif = ip4_route(&iphdr_src);
if (netif != NULL) {
icmphdr->chksum = 0;
ICMP_STATS_INC(icmp.xmit);
/* 发送ICMP差错报文 */
ip4_output_if(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP, netif);
}申请pbuf内存
添加ICMP首部
调用ip4_output_if函数发送数据,注:目标IP地址不为NULL
pbuf_free(q);
}

申请pbuf内存
 

添加ICMP首部
 

调用ip4_output_if函数发送数据,注:目标IP地址不为NULL
 

ICMP查询报文

请求报文发送,应答报文重复。简单来讲,应答包是在请求包的基础上修改得来

原理,最终形成第三个结构效果

查询报文主函数icmp_input

void
icmp_input(struct pbuf *p, struct netif *inp)
{
u8_t type;
struct icmp_echo_hdr *iecho;
const struct ip_hdr *iphdr_in;
u16_t hlen;
const ip4_addr_t *src;
ICMP_STATS_INC(icmp.recv);
MIB2_STATS_INC(mib2.icmpinmsgs);
iphdr_in = ip4_current_header();
/* 获取IP首部 */
hlen = IPH_HL_BYTES(iphdr_in);
if (hlen < IP_HLEN) {
goto lenerr;
} i
f (p->len < sizeof(u16_t) * 2) {
goto lenerr;
} /
* 获取 ICMP 的类型字段 */
type = *((u8_t *)p->payload);
switch (type) {
case ICMP_ER:/* 回送应答 */
MIB2_STATS_INC(mib2.icmpinechoreps);
break;
case ICMP_ECHO:/* 回送请求 */
MIB2_STATS_INC(mib2.icmpinechos);
/* 获取IP地址 */
src = ip4_current_dest_addr();
/* 判断是否为多播地址 */
if (ip4_addr_ismulticast(ip4_current_dest_addr())) {
goto icmperr;
} /
* 判断是否为广播地址 */
if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) {
goto icmperr;
} /
* 判断这个pbuf的总长度是否小于icmp首部 */
if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
goto lenerr;
}
#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN
/* 偏移paylosd指针 = IP首部(20) + 14 + 0 = 34 */
if (pbuf_add_header(p, hlen + PBUF_LINK_HLEN +
PBUF_LINK_ENCAPSULATION_HLEN)) {
struct pbuf *r;/* 申请大小 = p->tot_len + hlen */
u16_t alloc_len = (u16_t)(p->tot_len + hlen);
if (alloc_len < p->tot_len) {
goto icmperr;
} /
* 申请pbuf */
r = pbuf_alloc(PBUF_LINK, alloc_len, PBUF_RAM);
if (r == NULL) {
goto icmperr;
} i
f (r->len < hlen + sizeof(struct icmp_echo_hdr)) {
pbuf_free(r);
goto icmperr;
} /
* 拷贝IP首部到新申请的pbuf当中 */
MEMCPY(r->payload, iphdr_in, hlen);
/* 偏移paylosd指针 */
if (pbuf_remove_header(r, hlen)) {
pbuf_free(r);
goto icmperr;
} /
* 复制没有ip首部的其余数据包 */
if (pbuf_copy(r, p) != ERR_OK) {
pbuf_free(r);
goto icmperr;
} /
* 释放pbuf(p) */
pbuf_free(p);
/* p -> r */
p = r;
} else {
/* 偏移paylosd指针 IP首部(20) + 14 + 0 = 34 */
if (pbuf_remove_header(p, hlen + PBUF_LINK_HLEN +
PBUF_LINK_ENCAPSULATION_HLEN)) {
goto icmperr;
}
}
#endif
/* p->payload地址上附加icmp_echo_hdr结构体 */
iecho = (struct icmp_echo_hdr *)p->payload;
/* 添加IP首部 */
if (pbuf_add_header(p, hlen)) {
} else {
err_t ret;
/* 设置IP首部信息 */
struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;
ip4_addr_copy(iphdr->src, *src);
ip4_addr_copy(iphdr->dest, *ip4_current_src_addr());
/* 设置ICMP首部信息 */
ICMPH_TYPE_SET(iecho, ICMP_ER);
iecho->chksum = 0;
/* 设置生存时间 */
IPH_TTL_SET(iphdr, ICMP_TTL);IP数据包递交给icmp_input函数之前的pbuf示意图
IPH_CHKSUM_SET(iphdr, 0);
ICMP_STATS_INC(icmp.xmit);
MIB2_STATS_INC(mib2.icmpoutmsgs);
MIB2_STATS_INC(mib2.icmpoutechoreps);
/* 发送ICMP回显应答包 */
ret = ip4_output_if(p, src, LWIP_IP_HDRINCL,
ICMP_TTL, 0, IP_PROTO_ICMP, inp);
if (ret != ERR_OK) {
}
} b
reak;
default: /* lwIP不作处理 */
if (type == ICMP_DUR) {
MIB2_STATS_INC(mib2.icmpindestunreachs);
} else if (type == ICMP_TE) {
MIB2_STATS_INC(mib2.icmpintimeexcds);
} else if (type == ICMP_PP) {
MIB2_STATS_INC(mib2.icmpinparmprobs);
} else if (type == ICMP_SQ) {
MIB2_STATS_INC(mib2.icmpinsrcquenchs);
} else if (type == ICMP_RD) {
MIB2_STATS_INC(mib2.icmpinredirects);
} else if (type == ICMP_TS) {
MIB2_STATS_INC(mib2.icmpintimestamps);
} else if (type == ICMP_TSR) {
MIB2_STATS_INC(mib2.icmpintimestampreps);
} else if (type == ICMP_AM) {
MIB2_STATS_INC(mib2.icmpinaddrmasks);
} else if (type == ICMP_AMR) {
MIB2_STATS_INC(mib2.icmpinaddrmaskreps);
}
} p
buf_free(p);
return;
lenerr:
pbuf_free(p);
ICMP_STATS_INC(icmp.lenerr);
MIB2_STATS_INC(mib2.icmpinerrors);
return;
#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING ||
!LWIP_BROADCAST_PING
icmperr:
pbuf_free(p);
ICMP_STATS_INC(icmp.err);
MIB2_STATS_INC(mib2.icmpinerrors);
return;
#endif
}

各个操作的效果图

IP数据包递交给icmp_input函数之前的pbuf示意图
 

如果该数据包为回送请求包,则修改ICMP首部的类型

lwIP内核对该数据包的payload指针偏移20字节,添加IP首部
 

设置IP首部的字段信息,设置完成之后调用ip4_output_if函数发送ICMP回送应答包。注:目标IP地址为NULL
 

相关文章:

LWIP的ICMP协议

ICMP协议简介 ICMP协议是一个网络层协议 背景&#xff1a;如果丢包了&#xff0c;IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能 为什么需要ICMP协议 1&#xff0c;IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效…...

Spring Web MVC响应

返回静态页面 第一步 创建html时&#xff0c;要注意创建的路径&#xff0c;要在static下面 第二步 把需要写的内容写到body内 第三步 直接访问路径就可以 返回数据ResponseBody RestController Controller ResponseBody Controller&#xff1a;返回视图 ResponseBody&…...

STM32智能窗帘系统:从零到一的开发实战

简介 智能窗帘控制系统是智能家居领域的经典应用,随着物联网技术的不断发展,其功能从简单的远程控制演变为具备环境感知、多设备联动和跨平台兼容的智能系统。本篇文章将全面解析基于STM32的智能窗帘系统开发方案,从硬件设计到软件实现,再到企业级扩展功能,提供完整的代码…...

第三方评测机构如何凭借专业公正提供高可靠性软件检测服务?

第三方评测机构与软件开发及使用单位保持独立&#xff0c;凭借其专业技能和公正立场&#xff0c;为企业提供多样化的软件检测服务。这些检测结果的可靠性极高&#xff0c;不仅有助于企业减轻负担&#xff0c;节省人力和物力资源&#xff0c;而且赢得了业界的普遍认可。下面&…...

相或为K(位运算)蓝桥杯(JAVA)

这个题是相或为k&#xff0c;考察相或的性质&#xff0c;用俩个数举例子&#xff0c;011001和011101后面的数不管和哪个数相或都不可能变成前面的数&#xff0c;所以利用这个性质我们可以用相与运算来把和k对应位置的1都积累起来&#xff0c;看最后能不能拼起来k如果能拼起来k那…...

X.509证书详解

文章目录 1. X.509证书基础1.1 什么是X.509证书1.2 X.509证书结构1.3 证书编码格式2. Java中的X509Certificate2.1 类层次结构2.2 核心方法3. 获取X509Certificate对象3.1 从文件加载证书3.2 从KeyStore获取证书3.3 从HTTPS连接获取证书4. 创建自签名证书5. 证书验证5.1 基本验…...

深入浅出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系统开发中&#xff0c;服务间通信是常见需求。作为 Spring 框架的重要组件&#xff0c;RestTemplate 为开发者提供了简洁优雅的 HTTP 客户端解决方案。本文将从零开始讲解 RestTemplate 的核心用法&#xff0c;并附赠真实地图 API 对接案例。 一、环境准备 在 Spring…...

C++23 views::repeat (P2474R2) 写一篇博客

文章目录 std::views::enumerate 简介使用示例性能和灵活性与其他视图的结合使用总结 C23 标准引入了众多令人期待的新特性&#xff0c;其中 std::views::enumerate 便是一个备受瞩目的新增视图。这个新特性通过为迭代器提供索引和元素的组合&#xff0c;极大地简化了对集合中…...

微软向现实低头:悄悄延长Windows 10的Microsoft 365支持

快科技5月11日消息&#xff0c;Windows 10将在今年10月14日正式结束支持&#xff0c;此前微软曾明确表示&#xff0c;Microsoft 365&#xff08;M365&#xff09;应用&#xff0c;如Outlook、Teams、OneDrive、Word、Excel等&#xff0c;也将随之停止支持。 不过无法升级至Win…...

数字化转型-4A架构之技术架构

4A架构系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…...

生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例

生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例 为了帮助你更好地理解如何将 Flink 作业部署为独立服务,下面我将提供一个完整的工程代码示例。这个例子基于之前的 MySQL 到 Kafka 的数据同步需求,但这次我们将 Flink 作业作为一个独立的服务进行打包和部署。 …...

【计算机视觉】OpenCV实战项目:Text-Extraction-Table-Image:基于OpenCV与OCR的表格图像文本提取系统深度解析

Text-Extraction-Table-Image&#xff1a;基于OpenCV与OCR的表格图像文本提取系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线2.2 表格结构检测算法2.3 OCR优化策略 3. 实战部署指南3.1 环境配置3.2 核心代码解析3.3 执行流程示例 4. 常见问题与解决方案4.…...

TSN网络与DIOS融合:破解煤矿井下电力系统越级跳闸难题

一、引言 1.1 研究背景与意义 在现代煤矿生产中&#xff0c;井下电力系统作为整个煤矿生产的动力核心&#xff0c;其重要性不言而喻。煤矿井下的各类机械设备&#xff0c;如采煤机、刮板输送机、通风机、排水泵等&#xff0c;都依赖稳定的电力供应才能正常运行。电力系统的稳定…...

ALLinSSL:一站式SSL证书管理解决方案

引言 在当今互联网安全日益重要的背景下,SSL证书已成为保护网站安全的必备工具。然而,管理多个SSL证书常常是一项繁琐且容易出错的任务。ALLinSSL应运而生,它提供了一个一站式的SSL证书管理解决方案,大大简化了证书的申请、安装和更新过程。本文将深入介绍ALLinSSL的特性、…...

jsAPI

环境准备 1 安装nvm nvm 即 (node version manager)&#xff0c;好处是方便切换 node.js 版本 安装注意事项 要卸载掉现有的 nodejs提示选择 nvm 和 nodejs 目录时&#xff0c;一定要避免目录中出现空格选用【以管理员身份运行】cmd 程序来执行 nvm 命令首次运行前设置好国…...

三、c语言练习四题

在这个系列中&#xff0c;我将以每次五题的形式加强对C语言的理解 1、 矩阵转置 要求 输入&#xff1a; 2 3 1 2 3 4 5 6输出&#xff1a; 1 4 2 5 3 6 //矩阵转置&#xff08;复习&#xff09; int main() {int i 0;int j 0;int arr[10][10];/*提前定义好一个大容量数…...

MySql(进阶)

一.数据库约束 约束类型 NOT NULL - 指示某列不能存储 NULL 值。 (not null不能为NILL) UNIQUE - 保证某列的每行必须有唯一的值。 &#xff08;unique唯一值&#xff09; DEFAULT - 规定没有给列赋值时的默认值。 &#xff08;default为空给定默认值&#xff09; PRIMARY…...

数据结构练习:顺序表题目

今天我们来进行顺序表后面习题的练习 目录 移除数组 思路1&#xff1a;查找后进行删除 思路2&#xff1a;新数组交换&#xff1a; 思路3&#xff1a;双指针法&#xff1a; 删除重复项 合并两个有序数组 移除数组 它的示例如下&#xff1a; 思路1&#xff1a;查找后进行删除…...

Ubuntu 22虚拟机【网络故障】快速解决指南

Ubuntu22虚拟机突然无法连接网络了&#xff0c;以下是故障排除步骤记录。 Ubuntu 22虚拟机网络故障快速解决指南 当在虚拟机中安装的 Ubuntu 22 系统出现 ping: connect: 网络不可达 和 ping: www.baidu.com: 域名解析出现暂时性错误的报错时&#xff0c;通常意味着虚拟机无法…...

SwaggerLogger.java

package further.config;import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils;/*** swagger启动ap…...

基于SpringBoot的在线教育管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

企业内训|智能调控系统算法与优化——某汽车厂商

5月9日&#xff0c;东北某市&#xff0c;TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“智能调控系统算法与优化”课程。 本课程系统化解析智能调控系统的核心算法原理与前沿优化技术&#xff0c;深度融合经典控制、现代控制及模型预测控制&#xff08;MPC&#x…...

Web 实时通信技术:WebSocket 与 Server-Sent Events (SSE) 深入解析

一、WebSocket&#xff1a; &#xff08;一&#xff09;WebSocket 是什么&#xff1f; WebSocket 是一种网络通信协议&#xff0c;它提供了一种在单个 TCP 连接上进行全双工通信的方式。与传统的 HTTP 请求 - 响应模型不同&#xff0c;WebSocket 允许服务器和客户端在连接建立…...

一个网球新手的学习心得

一个网球新手的学习心得 握拍正手反手发球 网球新手学习的几个重要点就是握拍、正手、反手&#xff0c;还有发球。 握拍 不管是发球还是拉球&#xff0c;首先要注意握拍的方式。 正手的话&#xff0c;一般是右手握住球拍柄&#xff0c;掌心对着球拍柄宽的一面&#xff0c;食…...

12、电子电路设计与PCB布局组件 (概念) - /设计与仿真组件/pcb-layout-tool

76个工业组件库示例汇总 电子电路设计与 PCB 布局组件 (概念演示) 概述 这是一个交互式的 Web 组件&#xff0c;用于演示电子电路原理图设计和 PCB 布局的基本概念。用户可以从元件库中选择元件&#xff0c;在原理图和 PCB 画布上放置、移动&#xff0c;进行原理图连线&…...

[特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享

一、项目简介 本项目为一款功能完备的 免税商品优选购物商城系统&#xff0c;采用 Java 后端 Vue 前端的主流前后端分离架构&#xff0c;支持用户、商家、管理员三类角色&#xff0c;满足商品浏览、下单、商家管理、后台运营等多项功能&#xff0c;适用于实际部署或作为毕业设…...

小土堆pytorch--torchvision中的数据集的使用dataloader的使用

torchvision中的数据集的使用&dataloader的使用 一级目录二级目录三级目录 1 torchvision 中的数据集的使用1.1 对与CIFAR - 10数据集的介绍1.2 数据集加载代码1.3 使用transform加载代码 2 DataLoader的使用2.1 DataLoader的作用1. 数据读取2. 数据预处理3. 批量处理4. 并…...

【RabbitMQ】 RabbitMQ高级特性(一)

文章目录 一、消息确认1.1、消息确认机制1.2、手动确认方法1.2.1、AcknowledgeMode.NONE1.2.2、AcknowledgeMode.AUTO1.3.3、AcknowledgeMode.MANUAL 二、持久性2.1、 交换机持久化2.2、队列持久化2.3、消息持久化 三、发送方确认3.1、confirm确认模式3.2、return退回模式3.3、…...

优化理赔数据同步机制:从4小时延迟降至15分钟

优化理赔数据同步机制&#xff1a;从4小时延迟降至15分钟 1. 分析当前同步瓶颈 首先诊断当前同步延迟原因&#xff1a; -- 检查主从复制状态&#xff08;在主库执行&#xff09; SHOW MASTER STATUS; SHOW SLAVE HOSTS;-- 在从库执行检查复制延迟 SHOW SLAVE STATUS\G -- 关…...

lampiao靶场渗透

lampiao https://www.vulnhub.com/entry/lampiao-1,249/ 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.245 3&#xff0c;对靶机进行端…...

云计算中的虚拟化:成本节省、可扩展性与灾难恢复的完美结合

云计算中虚拟化的 4 大优势 1. 成本效益 从本质上讲&#xff0c;虚拟化最大限度地减少了硬件蔓延。团队可以将多个虚拟机整合到单个物理主机上&#xff0c;而不是为每个工作负载部署单独的服务器。这大大减少了前期硬件投资和持续维护。 结果如何&#xff1f;更低的功耗、更低…...

jenkins built-in节点如何删除

1 概述 在 Jenkins 中&#xff0c;默认的 “Built-In” 节点&#xff08;即主节点/master&#xff09;无法直接删除&#xff0c;因为它是 Jenkins 的核心组件。它的存在&#xff0c;有时会造成困扰&#xff0c;因为部分作业调度到其上&#xff0c;由于 “Built-In” 节点的环境…...

QSS样式表的选择器

一个最简单的样式设置格式如下 QWidget {background-color: black; }将样式应用到对应的控件 QWidget* w new QWidget; w->setStyleSheet("QWidget {background-color: black;}");样式表中控件的设置有多种方式 通用选择器 /*匹配所有控件*/ *{}类型选择器 …...

Python多环境管理指南

Python/UV 多环境管理指南 在Python开发中&#xff0c;管理多个项目环境是一个常见需求。以下是使用Python内置工具和UV&#xff08;一种新兴的Python包管理器&#xff09;进行多环境管理的方法。 1. 使用Python内置venv管理多环境 创建虚拟环境 python -m venv /path/to/y…...

Java从入门到精通 - 数组

数组 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录 数组1. 认识数组2. 数组的定义和访问2.1 静态初始化数组2.1.1 数组的访问2.1.1 定义代码实现总结 2.1.2 数组的遍历2.1.2.1 定义代码演示总结 案例代码实现 2.2 动态初始化…...

《Vuejs 设计与实现》第 4 章(响应式系统)( 下 )

目录 4.6 避免无限递归循环 4.7 调度执行 4.8 计算属性 computed 与 lazy 4.9 watch 的实现原理 4.10 立即执行的 watch 与回调执行时机 4.11 过期副作用与竞态问题 总结 4.6 避免无限递归循环 在实现完善响应式系统时&#xff0c;需要注意避免无限递归循环。以以下代码…...

在 Windows 上为 Intel UHD Graphics 编译 OpenCL 程序

如果您使用的是 Intel UHD Graphics 集成显卡,以下是完整的 OpenCL 开发环境配置指南: 1. 准备工作 确认硬件支持 首先确认您的 Intel UHD Graphics 支持 OpenCL: 大多数第6代及以后的 Intel Core 处理器(Skylake 及更新架构)都支持 OpenCL 2.1+ 运行 clinfo 工具可以查…...

C++自学笔记 makefile

本博客参考南科大于仕琪教授的讲解视频和这位同学的学习笔记&#xff1a; 参考博客 感谢两位的分享。 makefile 的作用 用于组织大型项目的编译&#xff0c;是一个一键编译项目的脚本文件。 本博客通过四个版本的makefile逐步说明makefile的使用 使用说明 四个演示文件 …...

【PDF】使用Adobe Acrobat dc添加水印和加密

【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具&#xff1a; 1.Adobe Acrobat dc 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、添加保护加…...

客服系统重构详细计划

# 客服系统重构详细计划 ## 第一阶段&#xff1a;系统分析与准备工作 ### 1. 代码审查和分析 (1-2周) - 全面分析现有代码结构 - 识别代码中的问题和瓶颈 - 理解当前系统的业务逻辑 - 确定可重用的组件 - 制作系统功能清单 ### 2. 技术栈升级准备 (1周) - 升级PHP版本到7…...

基于VSCode + PlatformIO平台的ESP8266的DS1302实时时钟

基于ESP8266的DS1302实时时钟系统开发 一、项目概述 本实验通过ESP8266开发板实现&#xff1a; DS1302实时时钟模块的驱动系统时间同步与维护串口实时时间显示RTC模块状态监控 硬件组成&#xff1a; NodeMCU ESP8266开发板DS1302实时时钟模块CR2032纽扣电池&#xff08;备…...

Flink 系列之十四 - Data Stream API的自定义数据类型

之前做过数据平台&#xff0c;对于实时数据采集&#xff0c;使用了Flink。现在想想&#xff0c;在数据开发平台中&#xff0c;Flink的身影几乎无处不在&#xff0c;由于之前是边用边学&#xff0c;总体有点混乱&#xff0c;借此空隙&#xff0c;整理一下Flink的内容&#xff0c…...

【数据结构】线性表

目录 1.1 线性表的概念 1.1.1 线性表的抽象数据类型 1.1.2 线性表的存储结构 1.1.3 线性表运算分类 1.2 顺序表 1.2.1 顺序表的类定义 1.2.2 顺序表的运算实现 1. 顺序表的检索 2. 顺序表的插入 3. 顺序表的删除 1.3 链表 1.3.1 单链表 1. 链表的检索 2. 链表的插…...

大疆卓驭嵌入式面经及参考答案

FreeRTOS 有哪 5 种内存管理方式&#xff1f; heap_1.c&#xff1a;这种方式简单地在编译时分配一块固定大小的内存&#xff0c;在整个运行期间不会进行内存的动态分配和释放。它适用于那些对内存使用需求非常明确且固定&#xff0c;不需要动态分配内存的场景&#xff0c;优点是…...

【网络】:传输层协议 —— UDP、TCP协议

目录 UDP协议 UDP协议的核心特点 UDP协议格式 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP协议的核心特点 TCP协议格式 确认应答机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 基于字节流 粘包和拆包 可靠性和性能保障 基于TCP的应用层…...

每日c/c++题 备战蓝桥杯(洛谷P1115 最大子段和)

洛谷P1115 最大子段和 题解 题目描述 最大子段和是一道经典的动态规划问题。题目要求&#xff1a;给定一个包含n个整数的序列&#xff0c;找出其中和最大的连续子序列&#xff0c;并输出该最大和。若所有数均为负数&#xff0c;则取最大的那个数。 输入格式&#xff1a; 第…...

Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)

一、背景介绍 DUT集成了多个可调衰减的射频通道&#xff0c;可调衰减由高精度DAC和VVA构成&#xff0c;使用中电思仪的3671E矢量网络分析仪测试DUT的S参数&#xff0c;并自动化调整VVA的控制电压&#xff0c;以自动化获取指定衰减值对应的控制电平。 二、前期准备 Python环境&…...

设计模式系列(1):总览与引导

目录 前言 设计模式简介 UML与设计模式 术语解释 UML工具与PlantUML 面向对象设计原则(SOLID等) 设计模式分类与典型场景 设计模式的价值 学习与实践建议 常见面试题 推荐阅读 1. 前言 本篇为设计模式系列的第一篇,定位为总览和引导,旨在为后续各专题打下基础,帮助大家…...

Day21打卡—常见降维算法

知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-sne降维 作业&#xff1a; 自由作业&#xff1a;探索下什么时候用到降维&#xff1f;降维的主要应用&#xff1f;或者让ai给你出题&#xff0c;群里的同学互相学习下。可以考虑对比下在某些特定数据集上t-sne的可视化和pca可…...

什么是人工智能(Artificial Intelligence,AI)? —— 机器学习 =》 深度学习 =》 新型技术

文章目录 什么是人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1f; —— 关系&#xff1a;AI >> ML >> DL一、机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;1、历史2、类型&#xff08;1&#xff09;监督学习…...