【Linux网络】TCP协议
文章目录
- 引言
- 1、TCP协议的特点
- 2、确认应答机制
- 3、超时重传机制
- 4、TCP报头结构
- 5、三次握手建立连接
- 6、四次挥手断开连接
- 总结
引言
TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转移、TCP数据流、TCP数据流的控制
等等方面来讨论!
在TCP协议中,通信双方的地位是平等的。不存在请求和相应。
1、TCP协议的特点
传输层中我们常用的协议有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:面向连接、可靠的、面向字节流的。
使用TCP协议通信的双方在通信之前必须建立连接,然后才能开始进行数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,即一方在向对方发送数据的同时,并不妨碍对方向该方发送数据;数据可以在两个方向上同时传输,而这两个方向的传输是相互独立的,互不干扰。完成数据交换后,通信双方必须断开连接,同时释放连接所占用的网络资源。
在讲它们的区别之前,我们需要了解一下TCP协议全双工的特点
TCP协议属于传输层中的协议,传输层由操作系统管理。在建立连接后,操作系统会为通信双方在内核中创建相应的数据结构和读写缓冲区,通信双方的内核中都有发送缓冲区和接收缓冲区。数据在接收和发送缓冲区内是分离的
那我们在应用层中调用write和read
是在干什么呢?
就write函数而言,我们调用write函数就是要告诉操作系统这里有数据要传输,此时的数据就会被拷贝到该端的发送缓冲区中,应用层就返回了。该数据何时发送给对端,数据在传输过程中出现丢包的情况怎么办?这一切由操作系统和TCP协议决定,用户层只是给出建议。所以TCP协议又被称为传输控制协议。
由于双方可以同时向对方发送数据,所以这种通信模式被称为全双工。
我们知道TCP协议是面向字节流的,但UDP协议确是面向数据报的,字节流和数据报有什么区别呢?
学到现在,相信大家已经完成了TCP和UDP通信的编码了。字节流和数据报的区别对应到编码中就是通信双方是否必须执行相同次数的读写操作【这只是表现形式】。
当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或者多个TCP报文发出去,因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数没有固定的数量关系。
当接收缓冲区收到一个或者多个TCP报文后,TCP模块将它们携带的应用程序的数据按照TCP报文的序号【见下文】依次放入TCP接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以一次性的将TCP接收缓冲区内的数据全部读出,也可以分多次读取器,这取决于用户指定的应用程序缓冲区大小。因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间没有固定的数量关系。
所以,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何的数量关系,这就是字节流的概念:应用程序对数据的接收和发送是没有边界限制的。UDP则不然,发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报并发送之。接收端必须及时针对每一个UDP数据报进行读操作,如果没能及时读取数据报,就有可能发生丢包现象【这经常发生在一些较慢的服务器上】。并且如果用户没有足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断。
如图所示:
2、确认应答机制
为了使TCP通信更具有可靠性,TCP协议采用了确认应答机制:即发送端发的每一个报文都必须得到对方的应答,才认为这个TCP报文传输成功。其次TCP还采用了超时重传机制,发送端在发送一个TCP报文后启动定时器,如果在约定时间内没有收到对方对该报文的应答信息,发送段将重新发送该报文。并且TCP报文最后是以IP数据报的形式发送的,而IP数据报到达对端可能会出现乱序、重复等情况,所以TCP接收端还要对接收到的报文进行去重、排序等操作,然后再通知应用层读取数据。
这种通信方式就好比做两个人交谈,一问一答,等到回答完上一个问题,再问下一个问题。
但是,也有可能会出现一个人语速很快的情况,一口气问了几个问题。回答问题的人只能等到所有问题都提出完,然后从第一个问题开始回答。如下图:
但是我们怎么将报文和应答一一对应起来呢?
在TCP报头中【后面讲】有一个字段为32位确认号【ACK】。该字段用来作为对另一方发来的数据的应答,其值为已经确认收到的序列号+1,表示确认号之前的所有报文而且是连续的都已收到。对没有收到应答的报文,采用超时重传机制。
在通信过程中,只需要对正常的报文进行确认,不需要对应答报文再次进行确认
在TCP报头中,既存在32位序列号,又存在32位确认号。为什么要有两组序号呢?
一切的一切都归究于TCP是全双工协议。有可能这个报文既是对收到的报文的应答,同时也是一个新的请求。
3、超时重传机制
对于超过时间限制但未收到应答的报文,TCP协议会重新传输;这也就决定了对已经发送到网络中的数据报的数据,我们不能立即丢弃,应该再保存一段时间,以防报文在传输过程中出现数据丢失的情况。
但是保存在哪里呢?应该保存在TCP维护的发送缓冲区里。
TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.
- Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时
- 时间都是500ms的整数倍.
- 如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
- 如果仍然得不到应答, 等待 4*500ms 进行重传. 依次类推, 以指数形式递增.
- 累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接
4、TCP报头结构
1、16位端口号
告知主机该报文来着哪里【16位源端口号】以及要交给上层哪一个协议或者应用程序【16位目的端口号】。在使用TCP通信时,客户端由操作系统和TCP协议动态绑定端口号,服务器则需要程序员绑定特定的端口号。
2、32位序列号
序列号:当前TCP报文中的第一个字节的序号。
一次TCP通信(从TCP连接到断开)过程中某一个传输方向上的字节流的每一个字节编号。假设主机A和主机B进行TCP通信,A向B发送的第一个报文中,序列号被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的TCP报文段中序列号值将会被系统设置成ISN+该报文段所携带的数据的第一个字节在整个字节流中的偏移量。
3、32位确认序列号
用作对另外一方发送来的TCP报文的响应。其值是收到的TCP报文段的序列号+1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文不仅要携带自己的序号,而且包含对B发送过来TCP报文端的确认号。反之,B发送的TCP报文段也同时包括自己的序号和A发送过来的TCP报文端的确认号。
4、16位窗口大小
现在我们将TCP通信双方看做两个人在当面交流。为了保证自己说的话可以准确的被对方获取,我们需要控制说话的速度。同理,为了保证TCP通信的效率,尽量减少丢包的概率,我们也应该控制TCP发送数据的速度,快了也不行,慢了也不行。
那什么指标可以看出接收方接收数据的能力呢?接收缓冲区剩余空间大小恰巧合适。这个数据是TCP流量控制的一种手段。
它告诉对方本端的TCP接受缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
5、TCP标记位
有的TCP报文是一个请求报文,里面包含着数据;有的TCP报文仅仅是对请求的一个应答。那我们如何区分该报文的类型呢?TCP标记位
控制位由6个标志位组成,每个标志位占1位,总共6位。这些标志位可以单独设置,也可以组合设置,以表达不同的控制信息。
- URG(紧急指针有效)
当URG=1时,表示紧急指针字段有效。这告诉系统此报文段中包含紧急数据,应尽快传送(相当于高优先级的数据),而不是按照原来的排队顺序传送。紧急数据后面的数据仍然是普通数据。
注意:即使窗口为零时也可发送紧急数据。 - ACK(确认序号有效)
当ACK=1时,表示确认序号字段有效。这意味着报文段中的确认序号字段包含了接收方期望从发送方收到的下一个字节的序号。
TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。
ACK控制位经常与其他控制位(如SYN、FIN)结合使用,以表示不同的TCP状态或操作。 - PSH(接收方应尽快交付给应用层)
当PSH=1时,表示接收方TCP应该尽快地将这个报文段交付给应用层,而不需要等到整个缓存都填满后再交付。
这通常用于那些需要立即处理的数据,比如交互式通信中的命令响应。 - RST(重置连接)
当RST=1时,表示TCP连接中出现严重差错(如主机崩溃),必须释放连接,然后再重新建立连接。
RST也可以用来拒绝一个非法的报文段或拒绝打开一个连接。
RST响应通常是由于连接无法继续(如主机不可达、端口未运行等)或连接已经失效(如长时间无数据传输导致的超时)而触发的。 - SYN(同步序号)
当SYN=1时,表示这是一个连接请求报文段。在TCP三次握手过程中,第一个报文段(由客户端发送)的SYN位会被置为1。
SYN也可以与ACK结合使用(SYN-ACK),表示对连接请求的确认和响应。 - FIN(释放连接)
当FIN=1时,表示此报文段的发送方的数据已经发送完毕,并要求释放TCP连接。
FIN通常用于TCP四次挥手过程中,由希望关闭连接的一方发送。
控制位的组合使用
在实际应用中,控制位可以单独使用,也可以组合使用。例如:
- SYN=1且ACK=0:表示这是一个连接请求报文段。
- SYN=1且ACK=1:表示对连接请求的确认和响应(SYN-ACK)。
- FIN=1:表示请求释放连接。
- RST=1:表示连接重置。
5、16位校验和
由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个检验不仅包括TCP头部,也包括数据部分。这是TCP可靠性传输的一个重要保障
6、4位头部长度
标识该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最大是60个字节。
7、16位紧急指针
是一个正的偏移值。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,准确的来说,这个字段是紧急指针先对于当前序号的偏移量。TCP紧急指针是发送端向接收端发送紧急数据的方法。
5、三次握手建立连接
三次握手是建立连接的方式,但不保证通过三次握手一定建立连接成功。
三次握手的过程如下:
过程用形象的例子来形容就是如下:
预备知识
- 连接建立成功是双方共识,即双方都认为建立连接成功了,才算成功了。
- 三次握手是建立连接的方式,但不保证通过三次握手一定建立连接成功,最担心的是最后一个ACK丢失,但我们对此也有对应的解决方案。
- TCP连接是需要被双方管理起来的,被OS管理起来。先描述,再组织。维护一个连接是需要成本的【时空成本】
接下来,我们要讨论为什么需要三次握手:
一次握手不行吗?
答案是肯定不行的,因为这样极容易浪费网络资源,造成SYN洪水。
两次握手也不行,会出现一次握手一样的问题。
那么,为社么三次握手就一定可以呢?
- 三次握手是保证全双工通信是通常的。
- 三次握手可以有效防止单机对服务器进行攻击,防止SYN洪水发生。
6、四次挥手断开连接
如图:
为什么挥手需要四次?
TCP的四次挥手是为了确保数据流的正确和可靠地关闭。这需要双方都明确地确认关闭请求,并确保所有的数据包都已接收或处理。通过四次握手,每一方都可以确认对方已经完成了数据传输和接收的准备工作。
举个例子
张三和李四的对话
张三:好的,那我先走了
李四:好的,那你走吧
李四:那我也走了?
张三:好的,你走吧
四次挥手是指终止一个TCP连接的过程。它是TCP协议中用于正常关闭连接的机制。下面是四次挥手的具体流程:
-
第一次挥手:主动关闭方发送关闭请求(FIN)
在TCP的四次挥手过程中,首先由主动关闭方(通常是客户端)发起关闭请求。主动关闭方发送一个TCP报文,其中包含FIN(Finish)标志位,表示主动关闭方不再有数据要发送了。此时,主动关闭方进入FIN_WAIT_1状态,等待被动关闭方的确认。 -
第二次挥手:被动关闭方回应确认(ACK)
被动关闭方(通常是服务器)接收到主动关闭方的FIN后,发送一个确认(ACK)报文,表示已经收到了关闭请求。此时,被动关闭方进入CLOSE_WAIT状态,表示服务器端的应用程序已经等待关闭了,但仍可以接收来自客户端的数据。 -
第三次挥手:被动关闭方发送关闭请求(FIN)
在完成自己的数据发送后,被动关闭方也发送一个带有FIN标志的TCP报文,表示被动关闭方也没有数据要发送了。此时,被动关闭方进入LAST_ACK状态,等待主动关闭方的确认。 -
第四次挥手:主动关闭方回应确认(ACK)
主动关闭方接收到被动关闭方的FIN后,发送一个确认(ACK)报文,表示已经收到了关闭请求。此时,主动关闭方进入TIME_WAIT状态,等待一段时间,以确保被动关闭方收到了确认,并防止可能存在的延迟报文导致连接混乱。一旦等待时间过去,主动关闭方进入CLOSED状态,表示连接已经完全关闭。
接下来我们来分析一下四次挥手过程中通信双方状态变化:
如图,OS内核会为TCP连接双方创建相应的11TCP状态【包括三次握手过程中的5种状态和四次挥手断开过程中的6种状态】。
typedef enum { CLOSED, // 初始状态,表示TCP连接是"关闭着的"或"未打开的" LISTEN, // 表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接 SYN_SENT, // 客户端发送SYN报文后等待服务端确认的状态 SYN_RCVD, // 服务端接收到客户端的SYN报文后的状态 ESTABLISHED, // TCP连接已经成功建立,开始传输数据 FIN_WAIT_1, // 客户端主动关闭连接,发送FIN报文后等待服务端确认 FIN_WAIT_2, // 客户端收到服务端的ACK确认后,等待服务端发送FIN报文 CLOSE_WAIT, // 服务端收到客户端的FIN报文后,等待关闭连接 LAST_ACK, // 服务端发送FIN报文后,等待客户端的ACK确认 TIME_WAIT, // 客户端在收到服务端的FIN报文并发送ACK后,进入TIME_WAIT状态 CLOSING // 一个特殊状态,双方同时关闭连接时可能出现
} TcpState; typedef struct { TcpState state; // 当前TCP连接的状态 // 其他可能的字段,如序列号、确认号、超时时间等,根据具体需求添加
} TcpConnectionState;
为什么 TIME_WAIT 等待的时间是 2MSL?
首先说什么是MSL,TTL,以及两者的关系
MSL就是最大的报文生成时间,MSL是网络报文生存的最长时间,超过这个时间,报文将会被丢弃,因为TCP是基于IP协议的,TTL是经过路由器的最大跳数,每经过一个路由器,TTL就减一,当减到0的时候报文就会被丢弃,同时发送ICMP报文给源主机.
TTL 与 MSL的区别 : TTL是经过路由的最大跳数,MSL是报文生存的最长时间,要确保MSL>=TTL才能保证报文是正常消亡.
为什么要等待2MSL呢 ?
原因是 在网络中可能来自发送方发来的数据报,然后接收方要给对方一个响应. 这样报文一来一回的时间就是2MSL.
比如当最后一个ACK报文丢失(也就是第四次挥手丢失),服务器那边就会触发超时重传机制,重传FIN报文,当FIN报文到达客户端,客户端再回一个ACK响应,这样一来一回等待的时间是2MSL.
2MSL时长允许报文至少丢失一次,当ACK报文丢失的时候,重发的FIN会在第二个MSL到达客户端,这样TIME_WAIT状态就可以应对.2MSL是当第三次挥手到达客户端的时候就会开始计时,当中途FIN报文再次到达客户端,定时器就会被重置为2MSL.
为什么不是 4MSL或者8MSL呢 ?
由于丢包概率很小,加入丢包概率为1/100,那么第二次丢包就是1/10000, 所以我们可以忽略,性价比会更高。
总结
- TCP协议相对于UDP协议的优势在于其有良好的可靠性保证,但这也就意味着其编码过程会更加复杂。
- TCP通信的双方地位是平等的。
- TCP协议采取了多种方式来保证其传输过程的可靠性:确认应答机制、超时重传机制、滑动窗口机制。
- 使用TCP通信之前需要建立连接,建立连接的过程位三次握手。数据发送完成后需要断开连接,断开连接需要四次挥手。
相关文章:
【Linux网络】TCP协议
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言1、TCP协议的特点2、确认应答机制3、超时重传机制4、TCP报头结构5、三次握手建立连接6、四次挥手断开连接总结 引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转…...
Linux 基本指令讲解 上
linux 基本指令 clear 清屏 Alt Enter 全屏/退出全屏 pwd 显示当前用户所处路径 cd 改变目录 cd /root/mikecd … 返回上级目录cd - 返回最近所处的路径cd ~ 直接返回当前用户自己的家目 roor 中:/root普通用户中:/home/mike mkdir 创建一个文件夹(d) …...
深入了解指针(6)
文章目录 1.函数指针数组2.转移表3.回调函数 1.函数指针数组 存放函数指针的数组 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int add(int x, int y) {return x y; } int sub(int x, int y) {return x - y; }int main() {int (*p1)(int x, int y) add;int (…...
【Linux系列】known_hosts详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
MySQL4 多表查询 内连接
内连接 多表查询内连接 多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) pr…...
力扣45:跳跃游戏2题解
题目链接: https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解: 题目 难度 中等,标的是中等难度,而且我之前做过这道题,但是我没写…...
产品经理-产品被同行抄袭如何处理(32)
在面试当中,如果被问到,产品被同行抄袭如何处理 竞争分析、战略决策。 1)对行业相关事件的关注度:如之前对腾讯抄袭事件的讨论,如果能结合“被抄袭”后的失败案例(例如联众)和反抄袭的成功案例(例如豆瓣&am…...
LDR6020在Type-C手机同时充电与USB2.0数据传输方案
随着科技的飞速发展,Type-C接口已成为智能手机等移动设备的主流充电和数据传输接口。为了满足用户对于高效充电与稳定数据传输的双重需求,乐得瑞科技推出的LDR6020芯片凭借其卓越的性能和丰富的功能,为Type-C手机提供了同时充电与USB2.0数据传…...
Python学习笔记(七)
""" 演示数据容器字典的定义 """# # 定义字典{key:value,key2:value2} 注意key不能是字典,value可以任意 # my_dict1 {"王力鸿": 99, "周杰轮": 88, "林俊节": 77}# #定义空字典 # my_dict2 {} # my…...
mysql中log
目录 MySQL 日志系统概述 日志类型 日志的作用和重要性 Mermaid图示 1. Undo Log 和 Redo Log 的协同工作图 2. Redo Log 确保持久性的流程图 Undo Log(回滚日志) 事务的原子性(Atomicity)保障 事务回滚机制 MVCC&#…...
iOS Object-C 创建类别(Category) 与使用
有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来. Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的 一:创建Ca…...
Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard
目录 Kubernetes介绍 Kubernetes具备的功能 Kubernetes集群角色 Master管理节点组件 Node工作节点组件 非必须的集群插件 Kubernetes集群类型 Kubernetes集群规划 集群前期环境准备 开启Bridge网桥过滤 关闭SWAP交换分区 安装Containerd软件包 K8s集群部署方式 集…...
Springboot整合Flowable入门-学习笔记
目录 1、定义流程(画图) 2、Springboot部署流程 3、Springboot删除所有流程 4、Springboot根据 流程部署ID 查询 流程定义ID 5、Springboot启动(发起)流程 6、Springboot查询任务 6.1全部任务 6.2我的任务(代办任务) 7、…...
C语言常见的题目
1、 从源码到可执行文件会经历怎样的过程? 预编译:去掉空格、注释,处理预定义的指令,生成处理后的源代码文件。 编译:翻译成汇编代码,生成汇编文件。 汇编:翻译成机器码,生成一个或…...
Android13适配记录
多语言支持,此功能在国内被阉割 配置后在设置内可以选择 <?xml version"1.0" encoding"utf-8"?> <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"zh" …...
Android TV上OTT PWA应用开发的播放器选择:video.js vs exoplayer
跨平台 OTT PWA 应用开发,最方便的当然是选用 video.js 库。但是既然是安卓平台,exoplayer 看起来总是最稳妥的选择 介绍 Exoplayer 是 Android media3 的一个实现,以前是独立出来的,现在已经合并到 androidx.media3 中了。 Vid…...
24.8.14 《CLR via C#》 笔记12
第十五章 枚举类型和位标志 使用枚举类型而不是硬编码的理由:枚举类型更易编写,阅读和维护;枚举类型是强类型枚举类型是值类型,不能定义任何方法,属性或事件,可利用扩展方法向枚举类型添加方法枚举类型定义…...
P2801 教主的魔法
[题目通道](教主的魔法 - 洛谷) 摘要 分块,是一种优雅的暴力,它通过对数列分段,完成对数列一些区间操作和区间查询的操作,是一种根号算法。 这篇学习笔记&题解是本萌新在学习分块过程中的一些感悟,希望能够帮助…...
Go 语言channel的应用场景及使用技巧
通过反映的方式执行 select 语句。这在处理有很多 case 子句,尤其是不定长 case 子句的情况时非常有用。 1. 使用反射操作 select 和 channel 使用 select 语句可以处理 chan 的 send 和 recv, send 和 recv 都可以作为 case 子句。如果需要同时处理两个 chan, 则可以写成下面…...
QLabel设置图像的方法+绘制文本换行显示
1、QLabel设置图像有两种方法 (1) void setPicture(const QPicture &); (2) void setPixmap(const QPixmap &); QPicture和QPixmap都是继承于QPaintDevice,它们都可以通过加载图片的方式获取:bool load(QIODevice *dev, const char *format …...
LVS原理及相关配置
1. 描述以及工作原理 1. 什么是 LVS linux virtural server 的简称,也就是 linxu 虚拟机服务器,这是一个 由章文嵩博士发起的开源项目,官网是 http://www.linuxvirtualserver.org,现在 lvs 已经是 linux 内核标 准的一部分,使用…...
webrtc一对一视频通话功能实现
项目效果 实现原理 关于原理我就不做说明,直接看图 WebRTC建立的时序图 系统用例逻辑 搭建环境 turn服务器:Ubuntu24.04搭建turn服务器 mkcert的安装和使用:配置https访问 必须使用https协议, 由于浏览器的安全策略导致的&am…...
通道(channel)传递数据的例子写一个
当然!以下是一个简单的 Go 程序示例,展示了如何使用通道(channel)在两个 goroutine 之间传递数据。示例代码 go package mainimport ("fmt""time" )// 发送数据到通道的 goroutine func sendData(ch chan int…...
Vue3+Echarts+饼图环形图
记得给容器宽高 <div id"leftChartguawang" style"height: 28vh"></div> 配置函数 const leftChartguawang () > {const chartBox echarts.init(document.getElementById(leftChartguawang))let datas [[{ name: 居民节能建筑, value…...
Python while编程题目|AI悦创Python一对一教学辅导
你好,我是悦创。 以下是十道有创意的while循环编程题目,每道题目都有一定的难度,适合锻炼编程逻辑和思维能力。 题目1:旋转字符串 描述:给定一个字符串,每次循环将字符串的第一个字符移到末尾࿰…...
C语言 | Leetcode C语言题解之第324题摆动排序II
题目: 题解: static inline void swap(int *a, int *b) {int c *a;*a *b;*b c; }static inline int partitionAroundPivot(int left, int right, int pivot, int *nums) {int pivotValue nums[pivot];int newPivot left;swap(&nums[pivot], &a…...
Docker③_VMware虚拟机和Docker的备份与恢复
目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…...
【EMC专题】ESD抑制器简要介绍
在ESD保护器件中可以分为陶瓷基类型和半导体基类型。其中有一类陶瓷基类型,使用的机制是电极间放电方法的产品就是ESD抑制器。本文章简要介绍了ESD抑制器的特点、基本结构和特性。 ESD抑制器的特点 ESD抑制器是间隙型的ESD(静电放电 Electrostatic Discharge)对策保护元件,…...
贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询)
目录 标题:贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询) 内容: 一,环境部署 二,源码分析 三,sql注入 总结: [回到顶部](#article_top) 一&am…...
『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比!
『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比! 文章目录 一. 虚拟机(Virtual Machine,VM)与Docker对比!1. 定义这两种技术2. 工作原理3. 关于如何选择适合工作负载的技术的指导二. 参考文献Docker 只是一个轻量级的虚拟机吗?虽然二者确实有一个共同点,即 虚…...
安徽合肥疫情最新情况/东莞seo
关于Liferay环境的配置,可以参考博客园中其他的文章,这里不再详细叙述。现在要在Liferay的基础上进行二次开发,正在学习中,为了在学习过程中留下足迹,现在通过此形式记录自己的学习笔记。 一、Liferay整体框架 由于目前…...
邢台视频优化/重庆网站优化
http://semantic-ui.com/introduction/getting-started.html...
vue做的网站有什么/免费网页模板网站
php实实现现微微信信小小程程序序授授权权登登录录功功能能(实实现现流流程程)先上图实现流程:1、授权登陆按钮和正文信息放到了同一 页面,未授权的时候显示登陆按钮,已授权的时候隐藏登陆按钮,显示正文信息,当然也可以…...
app开发公司投入/seo排名课程咨询电话
一.集中删除DZ论坛垃圾广告的技巧去年曾经介绍过“一劳永逸 杜绝DZ论坛垃圾广告”。有些冤家说不方便,这次要是没有设置好,根据论坛的实际情况设置好后,很管用的。用DZ论坛系统的冤家,可能都知道,不管是设置验证码还是…...
做网站服装app/网页设计大作业
转载至我的个人博客:LOVCHUN.COM我对编程很感兴趣,想当一名程序员。每个人可能会有很多兴趣:音乐、美食、游戏、编程等等,这些兴趣都可以指向某个行业,为什么最后你要选“编程”这个兴趣?编程并没有想象中的…...
杭州建设职业学校网站/公司网站如何制作
朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow 声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享…...