传输层协议TCP (上)
文章目录
- 前言
- TCP报文格式
- TCP连接管理
- 连接建立与中止
- 三次握手
- 三次握手的状态变化
- 为什么是三次握手
- 四次挥手
- 四次挥手的状态变化
- FIN_WAIT_2 状态可能导致连接长时间不释放的问题
- TIME_WAIT状态作用
- 复位报文段
- 非法连接请求
- 其他异常情况
- 半打开连接
- 同时握手
- 同时关闭
- 参考资料
前言
TCP(Transmission Control Protocol,传输控制协议)是互联网最重要的协议之一,为应用层提供可靠的、面向连接的数据传输服务。它广泛应用于 HTTP、FTP、SMTP 等协议中,保障数据能够准确、有序地到达目标设备。本文将主要介绍TCP连接管理机制
TCP报文格式
首先我们来看TCP的报文格式
- 16位源端口/目的端口 : 用于寻找发端和收端应用进程。这两个值加 上 IP 首部中的源端 IP 地址和目的端 IP 地址唯一确定一个 TCP 连接。
- 序号 : 序号用来标识从 TCP 发端向 TCP 收端发送的数据字节流,它表示在这个报文段中的的第一 个数据字节。
- 确认序号 : 确认这个序号以前的报文都收到了, ACK标记为 1 生效
- 4位首部长度 : 表示该TCP头部有多少个32位bit(有多少个4字节), 首部长度范围[5,15], 所以TCP报头长度[20,60]字节
- 6个标注位
- URG : 紧急指针有效
- ACK : 确认序号有效
- PSH : 提示接收方应该尽快将这个报文交付到应用层
- RST : 直接终止当前连接或拒绝新的连接请求, 我们把携带 RST 标识的称为复位报文段
- SYN : 请求建立连接; 我们把携带 SYN 标识的称为同步报文段
- FIN : 通知断开连接, 我们称携带 FIN 标识的为结束报文段
- 16位窗口大小 : 自己的接收缓冲区的剩余空间大小
- 16位校验和 : CRC校验, 接收端校验不通过, 则认为数据有问题
- 16位紧急指针 : 标识哪部分数据是紧急数据
TCP连接管理
TCP 是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接
连接建立与中止
我们使用tcpdump工具来查看TCP在连接建立和中止时发生了什么, 这里使用了telnet向一个服务端发起连接
localhost.57692 > localhost.http-alt:
Flags [S], cksum 0xfe30 (incorrect -> 0xe677), seq 2011543754, win 65495, options [mss 65495,sackOK,TS val 3010364542 ecr 0,nop,wscale 7], length 0localhost.http-alt > localhost.57692:
Flags [S.], cksum 0xfe30 (incorrect -> 0xaee7), seq 2821871467, ack 2011543755, win 65483, options [mss 65495,sackOK,TS val 3010364542 ecr 3010364542,nop,wscale 7], length 0localhost.57692 > localhost.http-alt:
Flags [.], cksum 0xfe28 (incorrect -> 0xd5a3), seq 1, ack 1, win 512, options [nop,nop,TS val 3010364542 ecr 3010364542], length 0localhost.57692 > localhost.http-alt:
Flags [F], cksum 0xfe28 (incorrect -> 0xc7a7), seq 1, ack 1, win 512, options [nop,nop,TS val 3010368121 ecr 3010364542], length 0localhost.http-alt > localhost.57692:
lags [.], cksum 0xfe28 (incorrect -> 0xb9a9), seq 1, ack 2, win 512, options [nop,nop,TS val 3010368124 ecr 3010368121], length 0localhost.http-alt > localhost.57692:
Flags [F], cksum 0xfe28 (incorrect -> 0xae2d), seq 1, ack 2, win 512, options [nop,nop,TS val 3010371063 ecr 3010368121], length 0localhost.57692 > localhost.http-alt:
Flags [.], cksum 0xa2af (correct), seq 2, ack 2, win 512, options [nop,nop,TS val 3010371063 ecr 3010371063], length 0
主要观察这些标记位变化, 可以得出
- 建立连接
- 客户端 --> 服务端发送带有SYN标识的报文
- 服务端 --> 客户端发送SYN+ACK
- 客户端 --> 服务端发送ACK
- 关闭连接
- 客户端 --> 服务端发送带有FIN标识的报文
- 服务端 --> 客户端发送ACK
- 服务端 --> 客户端发送FIN
- 客户端 --> 服务端发送ACK
有时我们也可以看到在服务端 --> 客户端 合并了FIN+ACK报文
localhost.http-alt > localhost.57692:
Flags [F.] ......
三次握手
从上面的例子来看, 为了建立一TCP条连接
- 请求端(通常称为客户端)发送一个 SYN 段指明打算连接的服务器的端口,
- 服务器发回 SYN 报文段作为应答。同时,对客户的 SYN 报文段进行确认。
- 客户将对服务器的 SYN 报文段进行确认。
这三个报文段完成连接的建立。这个过程也称为三次握手
三次握手的状态变化
- 一开始, 客户端和服务端都处于CLOSED状态, 然后服务端开始监听进入LISTEN状态
- 客户端发起请求建立连接, 发送一个带有SYN标识的报文, 客户端进入SYN_SEND状态
- 服务端收到客户端发送的SYN报文, 回应一个SYN+ACK, 服务端进入SYN_RCVD状态
- 客户端收到服务端的SYN+ACK, 回应一个ACK, 客户端三次握手完成, 进入ESTABLISHED状态
- 服务端收到客户端的ACK后, 服务端三次握手完成, 也进入ESTABLISHED状态
为什么是三次握手
TCP 是一个全双工协议,这意味着连接的双方可以同时发送和接收数据。为了确保这种能力,在连接建立时,必须确认双方都能够发送和接收数据, 三次握手可以保证双方可读可写
如果是二次握手, 客户端在接收到服务端发送的ACK+SYN就已经结束了, 服务端无法得知客户端是否收到此报文, 也就是不能保证客户端是否可以接收数据, 如果服务端发送的ACK+SYN发送丢包, 此时服务端认为连接建立完成, 但实际并没有, 客户端和服务端各自等待对方的响应,最终会导致超时和连接失败
三从握手是可以满足这些条件的最小次数, 三此握手可以确定双方的全双工, 如果任意时刻发生丢包, 也能通过超时重传来机制来保证
四次挥手
建立一个连接需要三次握手,而终止一个连接要经过 4次握手, 从之前的例子来看
- 客户端发送一个FIN标识的报文表示要和服务端关闭连接
- 服务端应答一个ACK
- 服务端发送FIN表示与客户端关闭连接
- 客户端应答一个ACK
四次挥手的状态变化
- 客户端打算关闭连接, 发送一个FIN报文, 客户端进入FIN_WAIT_1状态
- 服务端应答一个ACK, 服务端进入CLOSE_WAIT状态
- 客户端收到服务端的ACK, 客户端进入FIN_WAIT_2状态
- 服务端打算关闭连接, 发送一个FIN报文, 服务端进入LAST_WAIT状态
- 客户端应答一个ACK, 客户端进入TIME_WAIT状态
- 服务端收到应答, 服务端进入CLOSED状态
- 客户端会在2MSL(Maximum Segment Lifetime 最大报文生命周期)后自动关闭, 进入CLOSED状态
FIN_WAIT_2 状态可能导致连接长时间不释放的问题
在 FIN_WAIT_2 状态我方已经发出了 FIN ,并且另一端也已对它进行确认。除非我们在实行半关闭,否则将一直等待另一端的应用层意识到它已收到一个文件结束符说明,并向我们发一 个 FIN 来关闭另一方向的连接。只有当另一端的进程完成这个关闭,我们这端才会从 FIN_WAIT_2 状态进入 TIME_WAIT 状态。 这意味着我们这端可能永远保持这个状态。另一端也将处于 CLOSE_WAIT状态,并一直保持这个状态直到对方关闭连接
某些操作系统(如 Linux)提供了超时机制,当连接在 FIN_WAIT_2状态超过一定时间后,内核会强制关闭连接,释放资源。在 Linux 中,可以通过修改 TCP 超时参数 来限制 FIN_WAIT_2 的最大存活时间
TIME_WAIT状态作用
TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个 MSL(maximum segment lifetime)的时间后才能回到CLOSED状态
查看MSL时间
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
MSL 是任何报文段被丢弃前在网络内的最长时间, 等待2MSL时间可以保证一些陈旧报文已经消散, 同时TIME_WAIT状态依然可以接收对方的重传报文,并进行必要的应答
如果没有这个状态的等待时间, 假设我们主动关闭的一方关闭后立即重启, 端口不变, 那么就有可能将一些还在网络中的陈旧报文接收到, 造成曲解, 如果客户端最后应答的ACK报文丢包, 在2MSL时间内也可以进行重传
复位报文段
TCP 首部中的 RST 比特是用于“复位”的。一般说来,无论何时一个报文段发往基准的连接(referenced connection)出现错误,TCP 都会发出一个复位报文段 ------《TCP/IP详解 卷1: 协议》
非法连接请求
当一个数据报到达目的端口时,该端口没在使用,这是一个非法连接请求, TCP 使用复位。我们来查看Linux2.6内核源码方便理解这点
TCP对数据包的处理在tcp_v4_rcv中
/* 处理接收到的TCP数据包 */
int tcp_v4_rcv(struct sk_buff *skb)
{......
no_tcp_socket: /* 没有找到对应的socket,发送RST */if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) /* 如果不符合安全策略,丢弃 */goto discard_it;if (skb->len < (th->doff << 2) || tcp_checksum_complete(skb)) { /* 如果数据包长度或校验和有问题,丢弃 */
bad_packet:TCP_INC_STATS_BH(TCP_MIB_INERRS);} else {tcp_v4_send_reset(skb); /* 发送RST */}discard_it:/* 丢弃数据包 */kfree_skb(skb);return 0;......
}
然后调用tcp_v4_send_reset发送复位报文
static void tcp_v4_send_reset(struct sk_buff *skb)
{struct tcphdr *th = skb->h.th;struct tcphdr rth;struct ip_reply_arg arg;......memset(&rth, 0, sizeof(struct tcphdr));rth.dest = th->source;rth.source = th->dest;rth.doff = sizeof(struct tcphdr) / 4;rth.rst = 1;//设置RST标志if (th->ack) {rth.seq = th->ack_seq;} else {rth.ack = 1;rth.ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin +skb->len - (th->doff << 2));}memset(&arg, 0, sizeof arg);arg.iov[0].iov_base = (unsigned char *)&rth;arg.iov[0].iov_len = sizeof rth;arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr,skb->nh.iph->saddr, /*XXX*/sizeof(struct tcphdr), IPPROTO_TCP, 0);arg.csumoffset = offsetof(struct tcphdr, check) / 2;ip_send_reply(tcp_socket->sk, skb, &arg, sizeof rth);TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);TCP_INC_STATS_BH(TCP_MIB_OUTRSTS);
}
我们可以看到 RST 标注位被设置
其他异常情况
-
连接中断:当连接的另一端在未正常关闭的情况下强制终止连接(比如程序崩溃或网络故障),接收方可能会发送 RST 报文来终止连接。
-
协议错误或违规行为:当发现协议中的违规行为(例如,接收到错误的序列号、非法的报文等),接收方可以使用 RST 报文来重置连接
半打开连接
如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的 TCP 连接称为半打开连接, 半打开连接的常见原因是当客户主机突然掉电或者结束客户应用程序异常中止后再关机, 只有这条连接上没有数据传递, 服务端就不会知道客户端已经关闭, 当客户端再次打开后又会重新建立连接, 长期以往就会出现连接堆积问题, 后面我们介绍TCP的保活机制可以解决这个问题
同时握手
当两端同时向对方发送 SYN 请求以建立 TCP 连接时,这种情况被称为 SYN Flood 的一种特殊形式,或者更正式地叫做 双向 SYN 同时发起。这种情形会引起连接的同时握手(Simultaneous Open)
TCP标准支持这种同时握手, 对于同时打开仅建立一条连接而不是两条连接, 状态转移更像双向的三次握手, 一共要交换四个报文
- 两端同时发起请求建立连接, 发送一个带有SYN标识的报文, 都进入SYN_SEND状态
- 两端收到对方发送发送的SYN报文, 回应一个SYN+ACK, 都进入SYN_RCVD状态
- 两端收到对方的SYN+ACK, 握手完成, 进入ESTABLISHED状态
同时关闭
既然同时握手可能存在, 那么双方都执行主动关闭也是可能的, TCP 协议也允许这样的同时关闭(simultaneous close)
CLOSING状态就是为了处理这种特殊情况, 两端都已经发送了 FIN 包,但还未完全收到对方的确认包时
- 两端同时发送FIN报文表示关闭连接, 都进入FIN_WAIT_1状态
- 两端收到对方发送的FIN报文, 回应一个ACK, 两端进入CLOSING状态
- 两端收到对方的ACK后, 进入TIME_WAIT状态
参考资料
- 《TCP/IP详解 卷1: 协议》
- Linux2.6内核源码
相关文章:
传输层协议TCP (上)
文章目录 前言TCP报文格式TCP连接管理连接建立与中止三次握手三次握手的状态变化为什么是三次握手 四次挥手四次挥手的状态变化FIN_WAIT_2 状态可能导致连接长时间不释放的问题TIME_WAIT状态作用 复位报文段非法连接请求其他异常情况 半打开连接同时握手同时关闭 参考资料 前言…...
Proxmox 更新软件包数据库(TASK ERROR: command ‘apt-get update‘ failed: exit code 100)
1、连接自己报错的物理机Shell,编辑文件 vi /etc/apt/sources.list.d/pve-enterprise.list 2、注释文件的第一行在开头加上# 按I进入编辑模式后 开头添加# 然后shift: 输入wq或者wq!进行保存 3、注释后执行两个命令apt-get update 和 apt…...
java程序员进阶之路需要的学习过程
http://blog.csdn.net/qq_37267015/article/details/77108692...
C#01项目——计算器
实现需求: 可以连续相加,并记录计算表达式。 实现逻辑 1、利用字符串加减原则,获取相加的数值。 2、将数值存入到列表中,需要计算最终结果时,遍历列表中数值,全部相加 数字键 判断计算式长度是否超出上限根据运算…...
windows蓝牙驱动开发-在蓝牙配置文件驱动程序中接受 L2CAP 连接
L2CAP 服务器配置文件驱动程序会响应来自远程设备的传入逻辑链接控制和适应协议 (L2CAP) 连接请求。 例如,PDA 的 L2CAP 服务器配置文件驱动程序将响应来自 PDA 的传入连接请求。 接收传入 L2CAP 连接请求 1. 若要接收来自特定 PSM 的任何远程设备的传入 L2CAP 连…...
如何下载AndroidStudio的依赖的 jar,arr文件到本地
一、通过jitpack.io 下载依赖库 若需要下载 com.github.xxxxx:yy-zzz:0.0.2 的 jar则 https://jitpack.io/com/github/xxxxx/yy-zzz/0.0.2/ 下会列出如下build.logyy-zzz-0.0.2.jaryy-zzz-0.0.2.pomyy-zzz-0.0.2.pom.md5yy-zzz-0.0.2.pom.sha1jar 的下载路径为https://jitpack…...
QT笔记——QRadioButton
文章目录 1、概要2、实际的应用2.1、创建多个QRadioButton,只可同时选中其中一个,点击后实现对应的槽函数 1、概要 实现QRadioButton相关的应用;2、实际的应用 2.1、创建多个QRadioButton,只可同时选中其中一个,点击后实现对应的槽函数 创建…...
Vue 2 + Vite 项目集成 ESLint 和 Prettier
在 Vue 2 Vite 项目中集成 ESLint 和 Prettier 可以帮助你规范代码风格并自动格式化代码。以下是详细的步骤: 1. 安装 ESLint 和 Prettier 相关依赖 在项目根目录下运行以下命令,安装 ESLint、Prettier 和相关插件: npm install --save-de…...
uniapp canvas 生成海报并保存到相册
前言: 之前写过一篇canvas小程序画图只要是canvas各种方法的实际应用,有兴趣的小伙伴也可以看看 微信小程序:使用canvas 生成图片 并分享_小程序canvas生成图片-CSDN博客 上一篇文章是小试牛刀,这次是更加全面的记录生成海报的…...
无人机不等同轴旋翼架构设计应用探究
“结果显示,对于不等组合,用户应将较小的螺旋桨置于上游以提高能效,但若追求最大推力,则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中,Max Miles和Stephen D. Prior博士深入探讨了不同螺…...
C语言中隐式类型转换 截断和整型提升
C的整形算数总是至少以缺省整形类型的精度来进行的 为了获得这个精度 表达式中的字符和短整形操作数在使用之前被转换为普通整形 这种类型转换成为整型提升 给出代码实例↓ #include<stdio.h> int main() {//char signed charchar a 3;char b 127;char c a b;pri…...
R语言学习计划启动
R语言入门课 生信基地已然落地,我们希望能够给大家提供系统性、形成性、规范性的生信教学。前面几次活动中同学们表示希望能够有线下集中学习以及针对性的指导、答疑。所以,此次我们计划于2025年02月22日~23日(周六周日)推出"生信R语言入门课"…...
AI写代码工具时代:前端开发技能迭代的挑战与应对
近年来,人工智能(AI)技术飞速发展,深刻地改变着各个行业,前端开发领域也不例外。AI技术不仅带来了新的开发模式,也显著加快了前端开发技能的迭代速度,给前端工程师带来了巨大的挑战。本文将深入…...
消息队列之-springcloud-mq-stream 学习
背景: 开发中我们往往需要用到mq中间件进行消息处理,但是市面上的mq中间件实在太多了,导致我们在集成过程中困难重重,尤其在微服务当中,比如我们有一个订单模块、物流模块 他们都用到了mq,订单用的是rabbitmq 物流用的是kafka 导致当我们需要向这两个模块推送mq消息时,需…...
数据结构(考研)
线性表 顺序表 顺序表的静态分配 //线性表的元素类型为 ElemType//顺序表的静态分配 #define MaxSize10 typedef int ElemType; typedef struct{ElemType data[MaxSize];int length; }SqList;顺序表的动态分配 //顺序表的动态分配 #define InitSize 10 typedef struct{El…...
【16届蓝桥杯寒假刷题营】第1期DAY4
5.倍数区间 - 蓝桥云课 5. 倍数区间 问题描述 给定一个长度为 n 的数组 a,定义 f(i) 表示包含 ai 的最长区间长度,要求该区间中的所有数都是 ai 的倍数。请计算不同的 f(i) 的个数,其中 1≤i≤n。 输入格式 第一行包含一个正整数 n …...
「软件设计模式」适配器模式(Adapter)
软件设计模式深度解析:适配器模式(Adapter)(C实现) 一、模式概述 适配器模式(Adapter Pattern)是结构型设计模式中的"接口转换器",它像现实世界中的电源适配器一样&#…...
进阶版MATLAB 3D柱状图
%% 1. 数据准备 % 假设数据是一个任意形式的矩阵 % 例如:5行 x 7列的矩阵 data [3 5 2 6 8 4 7;7 2 6 9 3 5 8;4 8 3 7 2 6 9;6 1 5 8 4 7 2;9 4 7 3 6 2 5];% 定义行和列的标签(可选) rowLabels {Row1, Row2, Row3, Row4, Row5}; % 行标签…...
【Elasticsearch】token filter分词过滤器
以下是Elasticsearch中常见的分词过滤器(Token Filter)的详细说明,基于搜索结果中的信息整理: 1.Apostrophe • 功能:处理文本中的撇号(apostrophe),例如将“OReilly”转换为“ore…...
一天急速通关SpringMVC
一天急速通关SpringMVC 0 文章介绍1 介绍1.1 MVC架构与三层架构1.2 Spring MVC介绍1.3 入门程序 2 请求的映射3 请求数据的接收3.1 RequestParam接收3.2 POJO/JavaBean接收3.3 RequestHeader和CookieValue接收 4 请求数据的传递5 视图5.1 视图的理解5.2 请求转发和响应重定向的…...
MongoDB 7 分片副本集升级方案详解(下)
#作者:任少近 文章目录 1.4 分片升级1.5 升级shard11.6 升级shard2,shard31.7 升级mongos1.8重新启用负载均衡器1.9 推荐MongoDB Compass来验证数据 2 注意事项: 1.4 分片升级 使用“滚动”升级从 MongoDB 7.0 升级到 8.0,即在其他成员可用…...
如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍
如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍 引言问题描述实现步骤1. 计算每本书在每个季度的累计销量2. 找到每个季度的最高累计销量3. 匹配最高销量的书籍 总结扩展练习 引言 在数据分析和业务报表中,经常需要对数据进行分组统计,并找到每…...
JAVA生产环境(IDEA)排查死锁
使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤: 1. 编写并运行代码 首先,我们编写一个可能导致死锁的示例代码: public class DeadlockExample {private static final Obj…...
群体智能优化:粒子群算法(PSO)详解与实战
一、引言:从鸟群行为到优化算法 1995年,社会心理学家James Kennedy和电气工程师Russell Eberhart通过观察鸟群觅食行为,提出了著名的粒子群优化算法(Particle Swarm Optimization, PSO)。这一算法仅用不到30年时间&am…...
k8s集群搭建参考(by lqw)
文章目录 声明配置yum源安装docker安装 kubeadm,kubelet 和 kubectl部署主节点其他节点加入集群安装网络插件 声明 由于看了几个k8s的教程,都存在各种问题,自己搭建的时候,踩了不少坑,最后还是靠百度csdnchatGPT才搭建…...
vue3+vite项目引入electron运行为桌面项目
一、安装electron npm install --save-dev electron二、项目根目录添加electron文件 在此文件夹中添加两个js文件:main.js、preload.js main.js: // Modules to control application life and create native browser window const { app, BrowserWindow } requ…...
教育小程序+AI出题:如何通过自然语言处理技术提升题目质量
随着教育科技的飞速发展,教育小程序已经成为学生与教师之间互动的重要平台之一。与此同时,人工智能(AI)和自然语言处理(NLP)技术的应用正在不断推动教育内容的智能化。特别是在AI出题系统中,如何…...
使用 Flask 构建流式返回服务
使用 Flask 构建流式返回服务是一个很常见的应用场景,特别是在需要逐步传输大数据或进行长时间操作的场景下(比如下载大文件、实时日志等)。Flask 中可以通过 Response 对象来实现流式响应。以下是一个简单的例子,展示了如何在 Fl…...
Redis 集群相关知识介绍
Redis 集群详解:从入门到实战 Redis 是一个高性能的开源数据库,支持多种数据结构,广泛应用于缓存、消息队列、实时分析等领域。随着业务规模的增长,单机 Redis 的性能和容量往往无法满足需求,因此 Redis 集群…...
宏基传奇swift edge偶尔开机BIOS重置
电脑是acer swift edge, SFA16-41,出厂是Win11系统, BIOS版本出厂1.04,更新到了目前最新1.10。 问题是 会偶尔开机ACER图标变小跑到屏幕左上方,下次开机BIOS就会被重置,开机等待很长时间。 因为是偶尔现象的…...
DeepSeek是如何通过“蒸馏”技术打造自己的AI模型
1 引言: 最近,外媒对中国公司——DeepSeek进行了猛烈抨击,指控其采用了所谓的“蒸馏”(Distillation)技术,涉嫌抄袭甚至作弊。那么,什么是“蒸馏”技术? 在人工智能领域,…...
你如何利用SIMD(如SSE/AVX)优化图像处理的性能?
SIMD优化问题 1. SIMD 在图像处理中的优化方式2. 典型应用场景3. SIMD 的常见优化技巧4. 总结 利用 SIMD(Single Instruction, Multiple Data) 指令集(如 SSE/AVX/AVX2/AVX-512)优化图像处理的性能,可以极大地提升计算…...
支付宝 IoT 设备入门宝典(上)设备管理篇
相信不少朋友最近都被支付宝“碰一下”广告刷屏,“不用打开 APP 支付就碰一下”几个字一出简直自带BGM……其实“碰一下”就是支付宝 IoT 设备的一种,趁着热度还在,我会分为设备管理和设备经营上下两篇,简单介绍一下支付宝 IoT&am…...
Go语言 Web框架Gin
Go语言 Web框架Gin 参考 https://docs.fengfengzhidao.com https://www.liwenzhou.com/posts/Go/gin/#c-0-7-2 返回各种值 返回字符串 package mainimport ("net/http""github.com/gin-gonic/gin")func main() {router : gin.Default()router.GET("…...
蓝桥杯-洛谷刷题-day5(C++)(为未完成)
1.P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 i.题目 ii.代码 #include <iostream> #include <string> using namespace std;int N, Na, Nb; //0-"剪刀", 1-"石头", 2-"布", 3-"蜥", 4-"斯"࿱…...
【Unity3D优化】使用ASTC压缩格式优化内存
在Unity3D手游开发中,合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程,重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。 1. 现状分析:从ETC2到ASTC 6x6 block 在项目…...
NO.13十六届蓝桥杯备战|条件操作符|三目操作符|逻辑操作符|!||||(C++)
条件操作符 条件操作符介绍 条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下: exp1 ? exp2 : exp3条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算, exp2 计算的结果是整个表达式的结果&am…...
【uniapp-小程序】实现方法调用的全局tips弹窗
【uniapp-小程序】实现方法调用的全局tips弹窗 开发背景弹窗组件全局调用封装配置项入参全局注入使用 附带:如何在uniapp-H5项目中实现全局自定义弹窗组件定义定义vue插件引入 笑死,只有在想找工作的时候才会想更新博客。 开发背景 本来是个uniapp开发…...
springboot如何将lib和jar分离
遇到一个问题,就是每次maven package或者maven install后target中的jar很大,少的50几MB,大的100多兆 优化前: 优化后: 优化前 优化后压缩率77.2MB4.65MB93% 具体方案: pom.xml中 <build><…...
深入探索C语言中的字符串处理函数:strstr与strtok
在C语言的字符串处理领域, strstr 和 strtok 是两个非常重要的函数,它们各自承担着独特的功能,为开发者处理字符串提供了强大的支持。 一、strstr函数:字符串查找的利器 strstr 函数用于在一个字符串中查找另一个字符串的首次出现…...
Django学习笔记(第一天:Django基本知识简介与启动)
博主毕业已经工作一年多了,最基本的测试工作已经完全掌握。一方面为了解决当前公司没有自动化测试平台的痛点,另一方面为了向更高级的测试架构师转型,于是重温Django的知识,用于后期搭建测试自动化平台。 为什么不选择Java&#x…...
npm版本号标记
在 npm 中,版本号的标记遵循 语义化版本控制(Semantic Versioning, SemVer) 的规则,版本号通常由 主版本号(major)、次版本号(minor) 和 修订版本号(patch) 组成,格式为: <major>.<minor>.<patch>1. 版本号格式 主版本号(major):当你做了不兼…...
无人机雨季应急救灾技术详解
无人机在雨季应急救灾中发挥着至关重要的作用,其凭借机动灵活、反应迅速、高效安全等特点,为救灾工作提供了强有力的技术支撑。以下是对无人机雨季应急救灾技术的详细解析: 一、无人机在雨季应急救灾中的应用场景 1. 灾情侦查与监测 无人机…...
算法与数据结构(多数元素)
题目 思路 方法一:哈希表 因为要求出现次数最多的元素,所以我们可以使用哈希映射存储每个元素及其出现的次数。每次记录出现的次数若比最大次数大,则替换。 方法二:摩尔算法 摩尔的核心算法就是对抗,因为存在次数多…...
详解如何使用Pytest内置Fixture tmp_path 管理临时文件
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 临时目录在测试中起着至关重要的作用,它为执行和验证代码提供了一个可控…...
量子计算的五大优势
量子计算的优势有哪些? 量子计算是一个快速发展的领域,有望彻底改变我们处理复杂计算问题的方式。那么,量子计算的优势是什么?与经典计算相比,量子计算又有哪些优势呢?当我们探索量子力学的世界以及量子系…...
行内元素和块级元素
行内元素和块级元素 1.行内元素1.1什么是行内元素1.2行内元素的特点1.3常见的行内元素 2.块级元素2.1什么是块级元素2.2块级元素的特点2.3常见的块级元素 3.行内元素和块级元素的区别 1.行内元素 1.1什么是行内元素 行内元素是指在网页中不会独占一行,而是与其他行内元素在同…...
java面试题-集合篇
Collection 1.Collection有哪些类? Java集合框架中的Collection接口是所有集合类的基础接口,定义了一些基本的集合操作,如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。 List List接口定义了按照索引…...
二十九、vite项目集成webpack+vue2项目
一、开发 基座应用: 1、安装依赖 npm i @micro-zoe/micro-app@0.8.6 --save 2、在入口处引入(main.ts) import microApp from @micro-zoe/micro-appmicroApp.start()...
小程序之间实现互相跳转的逻辑
1:小程序之间可以实现互相跳转吗 可以实现互相跳转! 2:小程序跳转是否有限制 有限制!限制如下 2.1:需要用户触发跳转 从 2.3.0 版本开始,若用户未点击小程序页面任意位置,则开发者将无法调用此接口自动跳转至其他小程序。 2.2:需要用户确认跳转 从 2.3.0 版本开始…...