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

TCP四次握手与http协议版本区别

TCP四次挥手(图解)-为何要四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那 对于TCP的断开连接,这里就有了神秘的“四次挥手”。

第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和 Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示 主机1没有数据要发送给主机2了;

第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭 请求;

第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT 状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复, 则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为何要四次分手呢?

那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全 双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉 主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2 返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当 主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数 据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解 四次分手过程中的状态变化。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待 对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态 时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方 回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该 马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用 netstat看到。(主动方)

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即 有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连 接。(主动方)

CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送 FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下 来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可 以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成 的事情是等待你去关闭连接。(被动方)

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK 报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态 了。如果FINWAIT1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到 TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)

为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文 是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立 即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我 Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不 可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发 送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以 Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT 状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发 ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网 络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有 再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

为什么不能用两次握手进行连接?

3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要 允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假 定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认 为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下, 将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在 这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S 在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服 务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收 到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探 测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

http协议版本区别

HTTP 是基于 TCP/IP 协议的一个应用层协议,是现代互联网的一个基础协议。规定了客户端与服务端之 间的通信格式以及所占用的服务端口80(HTTPS是443)。

版本

HTTP 协议从开始立项到现在一共经历了 4 个版本:

HTTP 0.9 -> HTTP 1.0 -> HTTP 1.1 -> HTTP 2

HTTP 0.9

HTTP 0.9 是一个最古老的版本

只支持GET请求方式:由于不支持其他请求方式,因此客户端是没办法向服务端传输太多的信息

没有请求头概念:所以不能在请求中指定版本号,服务端也只具有返回 HTML字符串的能力

服务端相响应之后,立即关闭TCP连接

HTTP 1.0

随着 HTTP 1.0 的发布,这个版本:

请求方式新增了POST,DELETE,PUT,HEADER等方式

增添了请求头和响应头的概念,在通信中指定了 HTTP 协议版本号,以及其他的一些元信息 (比如: 状态码、权限、缓存、内容编码)

扩充了传输内容格式,图片、音视频资源、二进制等都可以进行传输

在这个版本主要的就是对请求和响应的元信息进行了扩展,客户端和服务端有更多的获取当前请求的所 有信息,进而更好更快的处理请求相关内容。

请求头

一个简单请求的头信息

GET / HTTP/1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) Accept: / 可以看到在请求方法之后有 请求资源的位置 + 请求协议版本,之后是一些客户端的信息配置

响应头

一个简单响应的头信息(v1.0)

HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 137582 Expires: Thu, 05 Dec 1997 16:00:00 GMT Last-Modified: Wed, 5 August 1996 15:55:28 GMT // 这是一个空行 ...数据内容服务端的响应头第一个就是 请求协议版本,后面紧跟着是这次请求的状态码、以及状态码的描述,之后 的内容是一些关于返回内容的描述。

Content-Type

在 HTTP 1.0 的时候,任何的资源都可以被传输,传输的格式呢也是多种多样的,客户端在收到响应体 的内容的时候就是根据这个 Content-Type 去进行解析的。所以服务端返回时候必须带着这个字段。

这些 Content-Type 有一个总称叫做MIME type。

关于MIME type,这里想播插一个小插曲:

在 chrome 浏览器中,当跨域请求回来的数据 MIME type 同跨域标签应有的 MIME type 不匹配时,浏 览器会启动 CORB 保护数据不被泄漏。被保护的数据有: html、xml、json。(eg: script、img 标签所支 持的 MIME type和他们都不一致),所以服务端在返回资源的时候一定要对应返回正确的 Content Type,以免浏览器屏蔽返回结果。

笔者遇到的问题是在 chrome v76 版本之后,跨域图片资源当请求回来的数据 Content-Type 不是 image/*,图片会被拦截,页面不展示图片。

特性

无状态:服务器不跟踪不记录请求过的状态

无连接:浏览器每次请求都需要建立tcp连接

无状态

对于无状态的特性可以借助cookie/session机制来做身份认证和状态记录

无连接

无连接导致的性能缺陷有两种:

无法复用连接

每次发送请求,都需要进行一次tcp连接(即3次握手4次挥手),使得网络的利用率非常低

队头阻塞

HTTP 1.0 规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也 给阻塞的

HTTP 1.1

HTTP 1.1 是在 1.0 发布之后的半年就推出了,完善了 1.0 版本。目前也还有很多的互联网项目基于 HTTP 1.1 在向外提供服务。

特性

长连接:新增Connection字段,可以设置keep-alive值保持连接不断开

管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的 顺序还是按照请求的顺序返回

缓存处理:新增字段cache-control

断点传输

长连接

HTTP 1.1默认保持长连接,数据传输完成保持tcp连接不断开,继续用这个通道传输数据

管道化

基于长连接的基础,我们先看没有管道化请求响应:

tcp没有断开,用的同一个通道

请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3

管道化的请求响应: 请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3

即使服务器先准备好响应2,也是按照请求顺序先返回响应1

虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题

缓存处理

当浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存, 则发送请求。

通过设置字段cache-control来控制缓存。

断点传输

在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以 从已经上传/下载好的地方继续请求,不用从头开始,提高效率

HTTP 2

特性:

二进制分帧

多路复用: 在共享TCP链接的基础上同时发送请求和响应

头部压缩

服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求

二进制分帧

HTTP 1.x 的解析是基于文本,HTTP 2之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进 制格式的编码,提高传输效率

多路复用

在共享TCP链接的基础上同时发送请求和响应,基于二进制分帧,在同一域名下所有访问都是从同一个 tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来。

头部压缩

由于 HTTP 是无状态的,每一个请求都需要头部信息标识这次请求相关信息,所以会造成传输很多重复 的信息,当请求数量增大的时候,消耗的资源就会慢慢积累上去。所以 HTTP 2 可以维护一个头部信息 字典,差量进行更新头信息,减少头部信息传输占用的资源,详见 HTTP/2 头部压缩技术介绍。

HTTPS 和 HTTP

HTTPS 协议需要申请证书

HTTP 和 HTTPS 使用端口不一样,前者是80,后者是443

HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,HTTPS 运行在 SSL/TLS 之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的

HTTPS 可以有效的防止运营商劫持

相关文章:

TCP四次握手与http协议版本区别

TCP四次挥手(图解)-为何要四次挥手 当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那 对于TCP的断开连接,这里就有了神秘的“四次挥手”。 第一次挥手:主机1(可以使客户端…...

【机器学习】洞悉数据奥秘:决策树算法在机器学习中的魅力

在机器学习的分类和回归问题中,决策树是一种广泛使用的算法。决策树模型因其直观性、易于理解和实现,以及处理分类和数值特征的能力而备受欢迎。本文将解释决策树算法的概念、原理、应用、优化方法以及未来的发展方向。 🚀时空传送门 &#x…...

redis(17):什么是布隆过滤器?如何实现布隆过滤器?

1 布隆过滤器介绍 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它基于位数组和多个哈希函数的原理,可以高效地进行元素的查询,而且占用的空间相对较小,如下图所示: 根据 key 值计算出它的存储位置,然后将此位置标…...

STM32自己从零开始实操03:输出部分原理图

一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器,设计出以小电流撬动大电流的继电器电路。 (提示)电路需要包含:三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…...

Unity中将图片做成Prefab的步骤

Unity中将图片做成Prefab的步骤 在Unity中,将一张图片做成Prefab是一个常见的操作。Prefab是Unity中的一种资源类型,可以让你预先定义一个游戏对象,然后在场景中多次实例化它。以下是详细的步骤: 步骤一:准备图片资源…...

Web前端三大主流框架:React、Vue和Angular

在当前的Web开发领域,前端框架的选择对于项目的成功至关重要。作为一名资深的IT技术员,我对前端技术的发展和行业趋势保持着持续的关注。本文将介绍当前Web前端三大主流框架:React、Vue和Angular,并分析它们各自的优势。 React&a…...

安全风险 - 检测设备是否为模拟器

在很多安全机构的检测中,关于模拟器的运行环境一般也会做监听处理,有的可能允许执行但是会提示用户,有的可能直接禁止在模拟器上运行我方APP 如何判断当前 app 是运行在Android真机,还是运行在模拟器? 可能做 Framework 的朋友思…...

maven的下载以及配置的详细教程(附网盘下载地址)

文章目录 下载配置IDEA内部使用配置 下载 1.百度网盘下载 链接: https://pan.baidu.com/s/1LD9wOMFalLL49XUscU4qnQ?pwd1234 提取码: 1234 2.解压即可 配置 1.打开安装文件下conf下的settings.xml文件,我的如下 2.修改配置信息(目的是为了修改本地…...

Unity3D 主城角色动画控制与消息触发详解

前言 在游戏开发中,角色动画控制和消息触发是非常重要的一部分,它可以让游戏更加生动和互动。本文将详细介绍如何在Unity3D中实现主城角色动画控制与消息触发。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开…...

【Endnote】如何在word界面加载Endnote

如何在word界面加载Endnote 方法1:方法2:从word入手方法3:从CWYW入手参考 已下载EndNote,但Word中没有显示EndNote,应如何加载显示呢? 方法1: 使用EndNote的Configure EndNote.exe 。 具体步骤为&#x…...

优化CPU占用率及内存占用2

在标准化无线通信板时,关注过程序占用ram的问题,当时 发现每一个线程都会分配8M栈空间,这次换rk3568后,偶尔看了下RAM占用,吓了一跳,不但每个线程有8M栈空间,几乎每个线程都占用了64MB的一个RAM…...

C语言(字符和字符串函数)2

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…...

【数据结构与算法 | 栈篇】力扣20,150

1. 力扣20 : 有效的符号 (1). 题 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…...

node依赖安装的bug汇总

1.npm仓库 首先要获取npm仓库的地址: registryhttp://11.11.111.1:1111/abcdefg/adsfadsf 类似这种的地址 然后设置npm仓库: npm config set registryhttp://11.11.111.1:1111/abcdefg/adsfadsf (地址要带等号) 接着安装依赖: npm i…...

Python中的 Lambda 函数

大家好,在 Python 编程的世界里,有一种功能强大却不常被提及的工具,它就是 Lambda 函数。这种匿名函数在 Python 中拥有着令人惊叹的灵活性和简洁性,却常常被许多开发者忽视或者只是将其当作一种附加功能。Lambda 函数的引入&…...

服务器遭遇黑洞后如何快速恢复与防范

在互联网世界中,“黑洞"一词常用于描述一种网络安全措施,即当服务器遭遇大规模DDoS攻击,为了保护网络基础设施和其他用户免受影响,网络服务商会暂时将受到攻击的IP地址流量导向一个"空洞”,使其不再响应任何…...

GPT-4o有点坑

GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的,但是看了相关的评论一直在说:技…...

【机器学习】探索未来科技的前沿:人工智能、机器学习与大模型

文章目录 引言一、人工智能:从概念到现实1.1 人工智能的定义1.2 人工智能的发展历史1.3 人工智能的分类1.4 人工智能的应用 二、机器学习:人工智能的核心技术2.1 机器学习的定义2.2 机器学习的分类2.3 机器学习的实现原理2.4 机器学习的应用2.5 机器学习…...

OceanBase 4.3.0 列存引擎解读:OLAP场景的入门券

近期,OceanBase 发布了4.3.0版本,该版本成功实现了行存与列存存储的一体化,并同时推出了基于列存的全新向量化引擎和代价评估模型。通过强化这些能力,OceanBase V4.3.0 显著提高了处理宽表的效率,增强了在AP&#xff0…...

算法每日一题(python,2024.05.25) day.7

题目来源(力扣. - 力扣(LeetCode),简单) 解题思路: 难点:加一时可能出现9使得位数进一,而当特殊情况,即全部为9时,数组所在长度会变长一。 从末尾开始判断&…...

【正在线上召开】2024机器智能与数字化应用国际会议(MIDA2024),免费参会

【ACM出版】2024机器智能与数字化应用国际会议(MIDA2024) 2024 International Conference on Machine Intelligence and Digital Applications 【支持单位】 宁波财经学院 法国上阿尔萨斯大学 【大会主席】 Ljiljana Trajkovic 加拿大西蒙菲莎大…...

景源畅信:抖音的爆款视频怎么选?

在短视频风起云涌的今天,抖音作为其中的佼佼者,每天都有无数视频在这里诞生。但如何在内容海洋中脱颖而出,成为人们茶余饭后谈论的焦点,是许多创作者和品牌思考的问题。选择爆款视频,不仅需要对平台规则有深刻理解&…...

开源大模型源代码

开源大模型的源代码可以在多个平台上找到,以下是一些知名的开源大模型及其源代码的获取方式: 1. **艾伦人工智能研究所的开放大语言模型(Open Language Model,OLMo)**: - 提供了完整的模型权重、训练代…...

算法思想总结:哈希表

一、哈希表剖析 1、哈希表底层:通过对C的学习,我们知道STL中哈希表底层是用的链地址法封装的开散列。 2、哈希表作用:存储数据的容器,插入、删除、搜索的时间复杂度都是O(1),无序。 3、什么时…...

基于Docker搭建属于你的CC++集成编译环境

常常,我会幻想着拥有一个随时可以携带、随时可以使用的开发环境,那该是多么美好的事情。 在工作中,编译环境的复杂性常常让我头疼不已。稍有不慎,删除了一些关键文件,整个编译链就会瞬间崩溃。更糟糕的是,…...

如何限制上网行为?上网行为管控软件有什么功能?

上网行为的管理与限制对于保障企业安全、提高员工工作效率以及保护孩子健康成长都显得尤为重要。 上网行为管控软件作为一种专业的工具,在这方面发挥着不可替代的作用。 本文将探讨如何限制上网行为,并介绍上网行为管控软件的主要功能。 一、如何限制上…...

重庆耶非凡科技有限公司的选品师项目靠谱吗?

在跨境电商和零售市场日益繁荣的今天,选品师的角色愈发凸显出其重要性。重庆耶非凡科技有限公司作为一家致力于多元化服务的科技公司,其选品师项目备受关注。那么,重庆耶非凡科技有限公司的选品师项目靠谱吗?接下来,我们将从多个…...

基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务

部署前准备: Cloudflare 账号 https://dash.cloudflare.com/login CloudDNS 账号 https://www.cloudns.net/ GitHub 账号 https://github.com/Harry-zklcdc/go-proxy-bingai Cloudflare 部署 Worker CloudDNS 获取免费二级域名 GitHub New Bing Ai 项目 https://git…...

redux状态管理用法详解

在React中使用redux,官方要求安装俩个其他插件 - Redux Toolkit 和 react-redux 1.ReduxToolkit (RTK) 官方推荐编写 Redux 逻辑的方式,是一套工具的集合集,简化书写方式 简化 store 的配置方式; 内置 immer 支持…...

细说ARM MCU中的MX_GPIO_Init()函数的实现过程

目录 1、建立.ioc工程 2、 MX_GPIO_Init()函数 (1)MX_GPIO_Init()函数的类型 (2)MX_GPIO_Init()函数中用到的结构体变量 (3)MX_GPIO_Init()函数使能时钟 (4)MX_GPIO_Init()函数…...

【wordpress】网站提示Error establishing a database connection错误代码

Error establishing a database connection错误代码处理方法: 检查数据库连接情况检查数据库账号密码是否正确检查数据库是否开启 总之较大可能是数据库出现了问题...

图书管理系统——Java实现

文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain(默认包) Java实现图书管理系统 学习了前六篇的SE语法,我们现在要用它们实现一个简单的图书管理系统项目,深入了解各个知识点的应…...

Capto 标准版【简体中文+Mac 】

Capto 是一套易于使用的屏幕捕捉、视频录制和视频编辑 Capto-capto安装包-安装包https://souurl.cn/DPhBmP 屏幕录制和教程视频制作 记录整个屏幕或选择的任何特定区域。在创建内容丰富的教程视频时选择显示或隐藏光标。无论您做什么,都可以确保获得高质量的视频。…...

连锁收银系统的五大功能 会员营销是核心

连锁企业的收银系统是其经营管理的关键工具之一,具备多种功能可以帮助企业提高效率、优化服务并实现会员营销。以下是连锁收银系统的五大功能,其中会员营销作为核心功能将在最后详细讨论。 首先,收银系统应具备高效的销售管理功能。这包括商品…...

射频功率限幅器简略

在功率输入保护方面,限幅器是最好用的器件之一,可以保护后级电路不受超限功率的损害,限幅器其实像TVS功能一样,让超过阈值的功率释放到接地上,来达到限制幅度的目的,目前限幅器的限幅幅度大多都大于15dBm,很…...

[备忘] Reboot Linux in python

1.可行的Reboot方法 1.1 修改/etc/sudoers 假定当前用户是mimi,增补这一行: mimi ALL(ALL) NOPASSWD: ALL 这是为了免输指令。 sudoers文件尽量在覆盖前把它的权限改回去: 原始权限 mimidebian-vm:~/test_app$ ls -l /tmp/sudoers -r--r-…...

windows打开工程文件是顺序读写吗

在 Windows 操作系统中,打开和读写工程文件的过程可以是顺序读写,也可以是随机读写,具体取决于使用的软件和文件的性质。以下是一些详细解释: 顺序读写 顺序读写(sequential access)是指按文件中数据的顺…...

【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

【1800】【5.22-5.24】

E1. String Coloring (easy version) E2. String Coloring (hard version) 【细节参考了题解】 题意:序列拆分为最少的若干条不降序列。 思路:简单版可以 n 2 n^2 n2 dp。定义 b o o l d p ( i , j ) bool ~dp(i, j) bool dp(i,j) 表示是否存在方案…...

统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…...

华为校招机试 - 矿车运输成本(20240522)

题目描述 露天矿采矿作业的特点是规模大,矿石和废料的移动量达到百万吨,运输成本开销较大,需要寻求一种最优的运输路径节省成本。 已知矿场可以划分成 N * M 的网格图,每个网格存在地形的差异,因此通过不同网格时,成本开销存在差异。 网格有以下 5 种类型: 标志为 S …...

【C++奇技淫巧】CRTP(奇特重现模板模式)

CRTP(Curiously Recurring Template Pattern,奇特重现模版模式),是一种在C中使用模板来实现的设计模式,主要用于实现编译时多态性(静态多态)。这种模式通过类模板和模板继承机制来实现,使得派生…...

web学习笔记(六十一)

目录 如何使用公共组件来编写页面 如何使用公共组件来编写页面 1.导入公共组件nav.vue import Catenav from "/components/nav.vue"; 2.在页面插入子组件 如果使用了setup语法糖此时就可以直接在页面插入 <Catenav ></Catenav>标签&#xff0c; …...

Nginx在Docker中的应用:容器化部署与扩展

在当今的云计算和微服务时代&#xff0c;Docker容器技术因其轻量级、可移植性和可扩展性而受到广泛关注。Nginx&#xff0c;作为一个高性能的HTTP和反向代理服务器&#xff0c;也在Docker中找到了其广泛的应用场景。本文将探讨Nginx在Docker中的容器化部署和扩展策略&#xff0…...

vscode编译和调试wsl环境的c语言程序

直接f5会报错&#xff0c;提示你改一下json文件 launch.json { “version”: “0.2.0”, “configurations”: [ { “name”: “(gdb) Launch”, “type”: “cppdbg”, “request”: “launch”, “program”: “ w o r k s p a c e F o l d e r / a . o u t " , " …...

(CPU/GPU)粒子继承贴图颜色发射

GetRandomInfo节点(复制贴进scratch pad Scripts) Begin Object Class/Script/NiagaraEditor.NiagaraClipboardContent Name"NiagaraClipboardContent_22" ExportPath/Script/NiagaraEditor.NiagaraClipboardContent"/Engine/Transient.NiagaraClipboardConten…...

【C#】 一个窗体能够显示、最小化、最大化、关闭时分别触发方法

在C#的WPF应用程序中&#xff0c;窗体&#xff08;即继承自System.Windows.Window的类&#xff09;能够通过处理以下事件来响应显示、最小化、最大化和关闭操作&#xff1a; 1.显示&#xff1a; 窗体显示时没有直接对应的事件&#xff0c;但你可以通过覆盖OnLoaded方法或订阅…...

pgsql基本操作

查看已经存在的数据库 postgres# \lList of databasesName | Owner | Encoding | Collate | Ctype | Access privileges ----------------------------------------------------------------------postgres | postgres | UTF8 | C | C | runoobdb …...

3d渲染的常用概念和技术,渲染100邀请码1a12

之前我们介绍了3D渲染的基本原理和流程&#xff0c;这次说下几个常用概念和技术。 3D渲染中涉及到很多专业的概念和技术&#xff0c;它们决定了渲染质量和效果&#xff0c;常用的有以下几个。1、光线追踪 光线追踪是一些专业渲染器&#xff08;如V-Ray和Corona等&#xff09;…...

热敏电阻的设计

热敏电阻(NTC)的作用&#xff1a;抑制开机时的浪涌电流。防止开机瞬间产生的浪涌电流损坏后面的元件。 取值依据:根据对开机的脉冲电流&#xff08;浪涌电流&#xff09;小于多少A&#xff1f; 由,这个U是指最大输入电压&#xff0c;I为要求的浪涌电流。 NTC是负温度系数的热…...