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

计算机网络——传输层(TCP)

传输层

在计算机网络中,传输层是将数据向上向下传输的一个重要的层面,其中传输层中有两个协议,TCP,UDP 这两个协议。

TCP

话不多说,我们直接来看协议报头。

在这里插入图片描述

源/目的端口号:表示数据从哪个进程来,到哪个进程去;

序号(Sequence Number)

在数据的传输中,传输报文的数据部分的每一个字节,都有一个他自己的编号。序号(Sequence Number),简称SN。
SN与SYN标志控制位的值有关,SYN值不同,SN表达不同的含义:

当SYN为1时,说明此时为连接建立阶段,这时的SN为初始序号:ISN(Intial Sequence Number),通过随机生成SN。
当SYN为0时,说明现在是数据传输阶段,第一个报文的序号是ISN+1,后面的报文的序号, 当前的报文的SN值+Tcp报文的净荷字节数(不包括Tcp报头)eg.如果发送端发送的报文的SN为3,他的净荷字节数为20,那么发送端发送的下一个报文的SN为20 。
在实际的数据传输中,SN的作用是当我们主机收到很多报文时,我们可以利用SN值对当前报文进行一个去重效果

确认序号(Acknowledge Number)

对当前收到的序号进行一个确认。如果设置了一个ACK控制位,确认序号表示一个准备接受的包的序列号,注意,他的序列号指向的是准备接受的包,也就是下一个期望接受的包的序列号。

举个例子,假设发送端(如Cient)发送3个净荷为1000byte、起始SN序号为1的数据包给Server四服务端,Server每收到一个包之后需要回复一个ACK响应确认数据包给Client。ACK响应数据包的ACKNumber值,为每个Client包的为SN+包净荷,既表示Server已经确认收到的字节数,还表示期望接收到的下一个Cient发送包的SN序号。(三次握手详细图解)。

数据偏移(首部长度)

4位Tcp报头长度:表示该TCP 头部有多少个32 位bit(有多少个4 字节); 所以TCP 头部最大长度是15 * 4 = 60

标志控制位

· URG:占一位,表示紧急指针字段有效。在实际中,优先处理紧急字段,此时紧急字段指针才有用,并且指向紧急数据(应用较少,一般用来错误码,eg.在传输中,突然不要某个数据了)。
· ACK:置位ACK=1表示确认号字段有效:TCP协议规定,连接建立后所有发送的报文的ACK必须为1;当ACK=0时,表示该数据段不包含确认信息。当ACK=1时,表示该报文段包括一个对已被成功接收报文段的确认序号Acknowedgment Number,该序号同时也是下一个报文的预期序号。
· PSH:表示当前报文需要请求推(push)操作;当PSH=1时,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲中区满。(在窗口检测中,发送PSH,将消息进行交互)。
· RST:置位RST=1表示复位TCP连接;用于重置已经混乱的连接,也可用于拒绝一个无效的数据段或者拒绝一个连接请求。如果数据段被RST置了RST位,说明报文发送方有问题发生。
· SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接清求报文,对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1。综合下,SYN置1,就表示这是一个连接请求或连接接受报文。
· FIN:用于在释放TCP连接时,标识发送方比特流结束,用来释放一个连接。当 FIN=1时,表明此报文的发送方的数据已经发送完毕,并要求释放连接。

窗口大小

通俗来讲,就是表示自己的接收缓冲区的剩余空间大小。用来进行流量控制。

校验和

对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,接收端用于对收到的数据包进行验证。

紧急指针

它是一个偏移量,和SN序号值相加表示紧急数据最后一个字节的序号。以上内容是TCP报文首部必须的字段,也称固有字段,长度为20个字节。接下来是TCP报文的可选项和填充部分。

可选项和填充部分

可选项和填充部分的长度为4n字节(n是整数),该部分是根据需要而增加的选项。如果不足4n字节,要加填充位,使得选项长度为32(4字节)的整数倍,具体的做法是在这个字段中加入额外的零,以确保TCP头是32位(4字节)的整数倍。

Tcp三次握手

三次握手是Tcp面向连接的重要过程,和确保了数据传输的可靠性。
(1)第一次握手:CIient进入SYN SENT状态,发送一个SYN帧来主动打开传输通道,该帧的SYN标志位被设置为1,同时会带上Client分配好的SN序列号,该SN是根据时间产生的一个随机值,通常情况下每间隔4ms会加1。除此之外,SYN帧还会带一个MSS(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。

(2)第二次握手:Server接受SYN帧之后,会进入SYN RCVD,同时返回SYN+ACK帧给Client,主要目的在于通知Client,Server端已经收到SYN消息,现在需要进行确认。Server端发出的SYN+ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment Number)值被设置为Client的SN+1,SYN+ACK帧的SYN标志位被设置为1,SN值为Server端生成的SN序号,SYN+ACK帧的MSS(最大报文长度)

(3)第三次握手:Client在收到Server的第二次握手的SYN+ACK确认帧之后,首先将自己的状态会从SYN SENT变成ESTABLISHED,表示自己方向的连接通道已经建立成功,Client可以发送数据给Server端了。然后,Client发AGK帧给Server端,该ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledqment Number)值被设置为Server端的SN序号+1,还有一种情况,Client可能会将ACK帧和一帧要发送的数据,合并到一起发送给Server端。

(4)Server端在收到Client的ACK帧之后,会从SKN RCVD状态会进入ESTABLISHED状态,至此,Server方向的通道连接建立成功,Server可以发送数据给Client,TCP的全双工连接建立完成。

如下图:
在这里插入图片描述

四次挥手

(1)第一次挥手:主动断开方(可以是客户端,也可以是服务器端),向对方发送一个FIN结束请求报文,此报文的FIN位被设置为1并且正确设置Sequence Number(序列号)和Acknowledgment Number(确认号)。发送完成后,主动断开方进入FIN_WAIT_1状态,这表示主动断开方没有业务数据要发送给对方,准备关闭SOCKET连接了。

(2)第二次挥手:正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledqment Number(确认号)值为断开请求报文的SN+1,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了(CLOSE_WAIT)状态,TCP协议服务会通知高层的应用进程,对方向本地方向的连接已经关闭,对方已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接受。被动断开方的==CLOSE_WAIT(关闭等待)==还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。主动断开方在收到了ACK报文后,FIN _WAIT_1转换成FIN_WAIT_2状态。

(3)第三次挥手:在发送完成ACK报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送,或者CLOSE-WAIT(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK结束响应报文,表示被动断开方的数据都发送完了,然后,被动断开方进入LAST_ACK状态。

(4)第四次挥手:主动断开方收在到FIN+ACK断开响应报文还需要进行最后的确认,向被动断开方发送一个ACK确认报文然后,自己就进入TIME_WAIT状态,等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方,在等待完成2MSL的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。

被动断开方在收到主动断开方的最后的ACK报文以后,最终关闭了连接,自己啥也不管了。

在这里插入图片描述

小问

为什么建立连接是三次握手?为什么不是一次两次?

因为三次握手,C/S双方都有一次的确定的收发。并且中间两次(SYN和ACK被捎带应答了)。它也能确定通信双方是健康的。

四次挥手可以是三次挥手吗?
可以,当C发送close请求时,刚好S也发送了close请求,这种情况就和三次握手一样,同样被做捎带应答了,但是这种情况就很少。

洪水攻击
SYN洪水攻击(SYN Flood Attack) 是一种常见的 DDoS攻击(分布式拒绝服务攻击),利用 TCP协议的三次握手缺陷 耗尽服务器资源,使其无法正常响应合法用户的请求。防御需结合协议优化(如SYN Cookie)和流量过滤技术。

Tcp特性

滑动窗口

如果我们每次都是一发一接受,他的效率就会低很多,性能就会低一点。
如下图:
在这里插入图片描述
如果我们同时发很多数据呢,这样不就解决了效率低下的问题(其实是将多个段的等待时间重叠在一起了)。
在这里插入图片描述

• 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000 个字节(四个段)。
• 发送前四个段的时候, 不需要等待任何ACK, 直接发送;
• 收到第一个ACK 后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
• 操作系统内核为了维护这个滑动窗口, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
• 窗口越大, 则网络的吞吐率就越高;

如下图:
在这里插入图片描述

快重传

在上面的传输过程中,在同时传输多个数据报文时,如果遇到某个数据包丢包了,这种情况下Tcp会怎么做呢?
Tcp首先会让确实的数据包进行一个重传。其余的同时传输的数据包也会收到,但是不会进行一个重发。
如下图:

在这里插入图片描述

流量控制

接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.因此TCP 支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control);

接收端将自己可以接收的缓冲区大小放入TCP 首部中的"窗口大小" 字段, 通过ACK 端通知发送端;表示自己能接受的数量大小。
窗口大小字段越大, 说明网络的吞吐量越高;
接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
发送端接受到这个窗口之后, 就会减慢自己的发送速度;
如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端。
发送窗口探测包被接受后,发送端会发送一个Ack其中它的一个标志位PSH也将置1,表示我需要尽快收到数据。
在这里插入图片描述

拥塞控制

因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据, 是很有可能引起雪上加霜的,少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞。

拥塞控制, 归根结底是TCP 协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案。

TCP 引入慢启动机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据;这样也确保了一个可靠性。
拥塞控制的窗口=min(拥塞窗口大小,接收端反馈的窗口大小)。
因为他作为一个高效的传输,需要一个快速的拥塞窗口增长速度。
因为接受的能力有限,因此不能单纯使拥塞窗口变大。就需要一个阈值,来限制一下他的增长速度。让他的增长的速度减缓。
在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1;少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞;当TCP 通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降;
如下图
在这里插入图片描述

延迟应答

如果接收数据的主机立刻返回ACK 应答, 这时候返回的窗口可能比较小。

假设接收端缓冲区为1M. 一次收到了500K 的数据; 如果立刻应答, 返回的窗口就是500K;
但实际上可能处理端处理的速度很快, 10ms 之内就把500K 数据从缓冲区消费掉了;
在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也能处理过来;
如果接收端稍微等一会再应答, 比如等待200ms 再应答, 那么这个时候返回的窗口大小就是1M;

一定要记得, 窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;
如下图:
在这里插入图片描述

捎带应答

在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是"一发一收"的。意味着客户端给服务器说了"How are you", 服务器也会给客户端回一个"Fine,thank you";那么这个时候ACK 就可以搭顺风车, 和服务器回应的"Fine, thank you" 一起回给客户端。

我们的三次握手,也是采用的是捎带应答,接收端收到数据后,我们会将一个ACK+SYN一起发送给发送端。

面向字节流

创建一个TCP 的socket, 同时在内核中创建一个发送缓冲区和一个接收缓冲区;
• 调用write 时, 数据会先写入发送缓冲区中;
• 如果发送的字节数太长, 会被拆分成多个TCP 的数据包发出;
• 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去;
• 接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;
• 然后应用程序可以调用read 从接收缓冲区拿数据;
如下图:
在这里插入图片描述

eg.
由于缓冲区的存在, TCP 程序的读和写不需要一一匹配, 例如:
• 写100 个字节数据时, 可以调用一次write 写100 个字节, 也可以调用100 次write, 每次写一个字节;
• 读100 个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以一次read 100 个字节, 也可以一次read 一个字节, 重复100 次;

粘包问题

因为他是一个全双工的,并且面向字节流,就会导致它的一个发送的数据不全或者是发送的数据多了一点。
那么如何避免粘包问题呢? 归根结底就是一句话,明确两个包之间的边界
对于定长的包, 保证每次都按固定大小读取即可; 例如上面的Request 结构, 是固定大小的, 那么就从缓冲区从头开始按sizeof(Request)依次读取即可;对于变长的包, 可以在包头的位置, 约定一个包总长度的字段, 从而就知道了包的结束位置;对于变长的包, 还可以在包和包之间使用明确的分隔符(应用层协议, 是我们自己来定的, 只要保证分隔符不和正文冲突即可);
对UDP来说不会存在粘包问题,因为他每次发送的就是一个数据报格式的。UDP发送的数据要么收到,要么不收到。

小结

TCP 复杂,是因为要保证可靠性, 同时又尽可能的提高性能。
可靠性:

校验和
序列号(按序到达)
确认应答
超时重发
连接管理
流量控制
拥塞控制

提高性能:

滑动窗口
快速重传
延迟应答
捎带应答

这就是TCP的主要内容。

相关文章:

计算机网络——传输层(TCP)

传输层 在计算机网络中,传输层是将数据向上向下传输的一个重要的层面,其中传输层中有两个协议,TCP,UDP 这两个协议。 TCP 话不多说,我们直接来看协议报头。 源/目的端口号:表示数据从哪个进程来&#xff0…...

Go 语言规范学习(1)

文章目录 IntroductionNotation示例(Go 语言的 if 语句): Source code representationCharacters例子:变量名可以是中文 Letters and digits Lexical elementsCommentsTokensSemicolons例子:查看程序所有的token Ident…...

深入理解椭圆曲线密码学(ECC)与区块链加密

椭圆曲线密码学(ECC)在现代加密技术中扮演着至关重要的角色,广泛应用于区块链、数字货币、数字签名等领域。由于其在提供高安全性和高效率上的优势,椭圆曲线密码学成为了数字加密的核心技术之一。本文将详细介绍椭圆曲线的基本原理…...

nginx优化(持续更新!!!)

1.调整文件描述符 # 查看当前系统文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 编辑 /etc/security/limits.conf 文件,添加以下内容 * soft nofile 65535 * hard nofile 65535# 编辑 /etc/sysctl.conf 文件,添加以下内容 fs.file-max 655352.调…...

ARCGIS PRO SDK 创建右键菜单

ArcGIS Pro SDK中的弹出式右键菜单常见的在地图视图、布局视图、文件目录等地方,随便右键点击某个文件、要素、要素类,一般都会弹出一个右键菜单。 操作对象右键菜单 refID要素图层esri_mapping_layerContextMenushp图层esri_mapping_unregisteredLaye…...

编译原理——LR分析

文章目录 LR分析概述一、LR分析概述二、LR(0)分析概述(一)可归前缀和子前缀(二)识别活前缀的有限自动机(三)活前缀及可归前缀的一般计算方法(四)LR(0)项目集规范族的构造 三、SLR(1)…...

css100个问题

一、基础概念 CSS的全称及作用是什么?行内样式、内部样式表、外部样式表的优先级?解释CSS的层叠性(Cascading)CSS选择器优先级计算规则伪类与伪元素的区别?举例说明!important的作用及使用注意事项如何继承父元素字体…...

js文字两端对齐

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.text-align: justify; 不就可以了吗?但是实际测试无效 二、原因及解决方法 1.原因:text-align只对非最后一行文字有效。只有一行文字时,text-align无效,要用text-alig…...

Java-面向对象-多态和抽象类

目录 什么是多态? 多态的优点 多态存在的三个必要条件 虚函数 重写 多态的实现方式 什么是抽象类? 继承抽象类 实现抽象方法 抽象类总结 什么是多态? 多态就是一个行为具有多种不同的表现形式。 举例: 我们按下 F1 键…...

前端性能优化:深入解析哈希算法与TypeScript实践

/ 示例&#xff1a;开放寻址哈希表核心实现 class OpenAddressingHashTable<T> {private size: number;private keys: (string | null)[];private values: (T | null)[];private tombstone Symbol(Deleted);constructor(size: number 53) {this.size size;this.keys …...

车架号查询车牌号接口如何用Java对接

一、什么是车架号查询车牌号接口&#xff1f; 车架号查询车牌号接口&#xff0c;即传入车架号&#xff0c;返回车牌号、车型编码、初次登记日期信息。车架号又称车辆VIN码&#xff0c;车辆识别码。 二、如何用Java对接该接口&#xff1f; 下面我们以阿里云接口为例&#xff0…...

linux input子系统深度剖析

input 就是输入的意思&#xff0c;因此 input 子系统就是管理输入的子系统&#xff0c;和 pinctrl 、 gpio 子系统 一样&#xff0c;都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备&#xff0c;不同的输入设备…...

香蕉派 BPI-CM6 工业级核心板采用进迭时空K1 8核 RISC-V 芯片开发

BPI-CM6 产品介绍 香蕉派BPI-CM6是一款工业级RISC-V核心板&#xff0c;它采用SpacemiT K1 8核RISC-V芯片设计&#xff0c;CPU集成2.0 TOPs AI计算能力。8/16G DDR和8/16/32/128G eMMC。设计了板对板连接器&#xff0c;以增强稳定性&#xff0c;与树莓派CM4尺寸相同&#xff0c…...

9.4分漏洞!Next.js Middleware鉴权绕过漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;Next.js 存在一个授权绕过漏洞&#xff0c;编号为 CVE-2025-29927。攻击者可能通过发送精心构造的 x-middleware-subrequest 请求头绕过中间件安全控制&#xff0c;从而在未授权的情况下访问受保护…...

【Unity3D实现UI轮播效果】

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、实现步骤👉2-1、搭建UI👉2-2、代码实现👉2-3、代码挂载使用👉三、扩展实现👉壁纸分享👉总结👉前言 功能需求如图所示,点击下一个按钮,所有卡片向右滚动,其中最后一张需要变更…...

谈谈 Webpack 中的 Loader 和 Plugin,它们的区别是什么?

Webpack Loader与Plugin深度解析 作为前端工程化的核心工具&#xff0c;Webpack的Loader和Plugin机制是其强大扩展能力的基石。 理解它们的差异和适用场景&#xff0c;是构建高效打包体系的关键。 我们将从底层原理到实际应用&#xff0c;深入剖析两者的区别。 核心概念对比…...

C#单例模式

单例模式 (Singleton),保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问&#xff0c;但它不能防止你实例化对个对象&#xff0c;一个最好的办法就是&#xff0c;让类自身负责保护它的唯一实例。这个类可以保证没…...

Oracle 数据库通过exp/imp工具迁移指定数据表

项目需求&#xff1a;从prod数据库迁移和复制2个表(BANK_STATE&#xff0c;HBS)的数据到uat数据库环境。 数据库版本&#xff1a;Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 迁移工具&#xff1a;客户端exp/imp工具 -- 执行命令 从Prod数据库导出数据exp us…...

MongoDB 与 Elasticsearch 使用场景区别及示例

一、核心定位差异 ‌MongoDB‌ ‌定位‌&#xff1a;通用型文档数据库&#xff0c;侧重数据的存储、事务管理及结构化查询&#xff0c;支持 ACID 事务‌。‌典型场景‌&#xff1a; 动态数据结构存储&#xff08;如用户信息、商品详情&#xff09;‌。需事务支持的场景&#xf…...

PyTorch生成式人工智能实战:从零打造创意引擎

PyTorch生成式人工智能实战&#xff1a;从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…...

蓝桥杯高频考点——二分(含C++源码)

二分 基本框架整数查找&#xff08;序列二分的模版题 建议先做&#xff09;满分代码及思路solution 子串简写满分代码及思路solution 1&#xff08;暴力 模拟双指针70分&#xff09;solution 2&#xff08;二分 AC&#xff09; 管道满分代码及思路样例解释与思路分析solution 最…...

VUE3项目VITE打包优化

VUE3项目VITE打包优化 代码加密依赖配置效果对比图 自动导入依赖配置 代码压缩依赖配置效果对比图 图片压缩依赖配置效果对比图 字体压缩总结与实践运用效果 代码加密 依赖 npm install -D vite-plugin-bundle-obfuscator配置 import vitePluginBundleObfuscator from "…...

IP 分片重组与 TCP 会话重组

1. IP 分片重组&#xff08;IP Fragmentation & Reassembly&#xff09; &#xff08;1&#xff09;分片原因 当 IP 数据包长度超过 MTU&#xff08;Maximum Transmission Unit&#xff09;&#xff08;如以太网默认 1500 字节&#xff09;时&#xff0c;路由器或发送端会…...

《Python实战进阶》No34:卷积神经网络(CNN)图像分类实战

第34集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;图像分类实战 摘要 卷积神经网络&#xff08;CNN&#xff09;是计算机视觉领域的核心技术&#xff0c;特别擅长处理图像分类任务。本集将深入讲解 CNN 的核心组件&#xff08;卷积层、池化层、全连接层&#xff09;…...

【Django】教程-1-安装+创建项目+目录结构介绍

欢迎关注我&#xff01;后续会更新django教程。一周2-3更&#xff0c;欢迎跟进&#xff0c;本周会更新第一个Demo的单独一个模块的增删改查【Django】教程-4-一个增删改查的Demo【Django】教程-2-前端-目录结构介绍【Django】教程-3-数据库相关介绍 1.项目创建 1.1 安装 Djan…...

力扣DAY29 | 热100 | 删除链表的倒数第N个结点

前言 中等 √ 链表心得&#xff1a;考虑好边界情况。 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#…...

渗透测试过-关于学习Token、JWT、Cookie等验证授权方式的总结

关于学习Token、JWT、Cookie等验证授权方式的总结 目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个…...

C#从入门到精通(3)

目录 第九章 窗体 &#xff08;1&#xff09;From窗体 &#xff08;2&#xff09;MDI窗体 &#xff08;3&#xff09;继承窗体 第十章 控件 &#xff08;1&#xff09;控件常用操作 &#xff08;2&#xff09;Label控件 &#xff08;3&#xff09;Button控件 &…...

greenhill编译出现:3201原因错误

ecom800: 21Mar25 16:26:45.609351: No licenses available for ecom800 Reason: ecom800 (3201): The License Manager cannot be contacted. 解决方式&#xff1a;重新加载lincese驱动。 检查是否安装正确: 检查驱动是否正确识别&#xff1a; 以上检查都正常&#xff0c…...

Docker 快速入门指南

Docker 快速入门指南 1. Docker 常用指令 Docker 是一个轻量级的容器化平台&#xff0c;可以帮助开发者快速构建、测试和部署应用程序。以下是一些常用的 Docker 命令。 1.1 镜像管理 # 搜索镜像 docker search <image_name># 拉取镜像 docker pull <image_name>…...

RISC-V AIA学习2---IMSIC

我在学习文档这章时&#xff0c;对技术术语不太理解&#xff0c;所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解&#xff1a; 将 RISC-V 系统比作一个工厂&#xff1a; hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…...

C#基础学习(五)函数中的ref和out

1. 引言&#xff1a;为什么需要ref和out&#xff1f; ​问题背景&#xff1a;函数参数默认按值传递&#xff0c;值类型在函数内修改不影响外部变量&#xff1b;引用类型重新赋值时外部对象不变。​核心作用&#xff1a;允许函数内部修改外部变量的值&#xff0c;实现“双向传参…...

【每日算法】Day 9-1:贪心算法精讲——区间调度与最优选择(C++实现)

掌握高效决策的核心思想&#xff01;今日深入解析贪心算法的底层逻辑&#xff0c;聚焦区间调度与最优选择两大高频场景&#xff0c;结合大厂真题与严谨证明&#xff0c;彻底掌握“局部最优即全局最优”的算法哲学。 一、贪心算法核心思想 贪心算法&#xff08;Greedy Algorit…...

Netty源码—8.编解码原理二

大纲 1.读数据入口 2.拆包原理 3.ByteToMessageDecoder解码步骤 4.解码器抽象的解码过程总结 5.Netty里常见的开箱即用的解码器 6.writeAndFlush()方法的大体步骤 7.MessageToByteEncoder的编码步骤 8.unsafe.write()写队列 9.unsafe.flush()刷新写队列 10.如何把对象…...

【踩坑系列】使用httpclient调用第三方接口返回javax.net.ssl.SSLHandshakeException异常

1. 踩坑经历 最近做了个需求&#xff0c;需要调用第三方接口获取数据&#xff0c;在联调时一直失败&#xff0c;代码抛出javax.net.ssl.SSLHandshakeException异常&#xff0c; 具体错误信息如下所示&#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validat…...

双目云台摄像头全方位监控方案

双目云台摄像头是一种具有两个镜头的摄像头设备&#xff0c;通常配备云台功能&#xff0c;能够实现水平和垂直方向的旋转&#xff0c;从而提供全方位的监控视角&#xff1a; 一、工作原理与特点 工作原理 &#xff1a;双目云台摄像头利用仿生学原理&#xff0c;通过两个标定后的…...

测谎仪策略思路

来源:【东吴金工 金工专题】“高频价量相关性拥抱CTA”系列研究&#xff08;四&#xff09;&#xff1a;CPV因子期货版3.0—CPV测谎机 原创 高子剑 量化邻距离 2024年09月20日 14:37 该报告主要介绍了“高频价量相关性拥抱CTA”系列研究中CPV因子期货版的相关内容&#xff0c;…...

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质&#xff1a;缩短首次可见帧渲染时间。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型轻量化部署&#xff0c;减少云端等待。Android&#xff1a;强制启用SplashScreen API&#xff0c;通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…...

VScode-i18n-ally-Vue

参考这篇文章&#xff0c;做Vue项目的国际化配置&#xff0c;本篇文章主要解释&#xff0c;下载了i18n之后&#xff0c;该如何对Vscode进行配置 https://juejin.cn/post/7271964525998309428 i18n Ally全局配置项 Vscode中安装i18n Ally插件&#xff0c;并设置其配置项&#…...

vue vue3 走马灯Carousel

背景&#xff1a; 在项目中需要展示多张图片&#xff0c;但在页面上只有一张图片的有限位置&#xff0c;此时考虑使用轮播图实现多张图片的展示。element组件官网有走马灯Carousel的组件详细介绍。 实现效果&#xff1a; 官网链接&#xff1a;点击跳转 核心代码&#xff1a; …...

Android设计模式之Builder模式

一、定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、核心思想&#xff1a; 分离构造与表示&#xff1a;将对象的构建过程&#xff08;如参数组合、校验逻辑&#xff09;与对象本身分离。 链式调用&#xff1a;通…...

【时时三省】(C语言基础)关系运算符和关系表达式

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 在if语句中对关系表达式disc > 0进行判断。其中的“>”是一个比较符&#xff0c;用来对两个数值进行比较。在C语言中&#xff0c;比较符&#xff08;或称比较运算符&#xff09;称为关…...

运算放大器(二)运算放大器的选型与应用

1.运算放大器的工艺决定Vos和Ib 2.TI放大器的命名规律 3.TI精密放大器家族 4.精密运放的选型指南 5.高共模抑制比放大器 6.TI其他的精密放大器 7.选型时需考虑的问题 8.TI精密运放选型实例 先确定供电电压 9.确定放大器的步骤 参考&#xff1a; 注&#xff1a;本文出自对b…...

vulhub靶场jangow-01-1.0.1

启动靶机时点shift停在这个界面 点e进入编辑页面&#xff0c;把ro改成rw signie init/bin/bash Ctrlx保存&#xff0c;ip a查看网卡信息 vim /etc/network/interfaces 把enp0s17改为ens33&#xff0c;保存退出 重启靶机&#xff0c;nmap扫ip ip为192.168.93.179 nmap扫端口 扫…...

android 一步完成 aab 安装到手机

家人们谁懂&#xff01;在 Android 系统安装 aab 应用超麻烦。满心期待快速体验&#xff0c;却发现 aab 无法直装&#xff0c;得先转为 apks 格式&#xff0c;这过程复杂易错。好不容易转好&#xff0c;还得安装 apks&#xff0c;一番折腾&#xff0c;时间与耐心全耗尽。别愁&a…...

mysqlworkbench导入.sql文件

1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 ​Schemas 区域右键选择 ​Create Schema...输入数据库名称&#xff08;例如 mydatabase&#xff09;&#xff0c;点击 ​Apply确认创建&#xff0c;点击 ​Finish 2、选择目标数据库 在左侧导航栏的 ​Schemas 列表中&a…...

pyqt 信号与槽

PySide6 信号与槽机制详解 引言 PySide6 是 Qt for Python 的官方绑定库&#xff0c;为 Python 提供了强大的 GUI 开发能力。其中&#xff0c;信号与槽&#xff08;Signals and Slots&#xff09; 机制是 Qt 事件处理系统的核心&#xff0c;它允许对象之间进行松耦合的通信&a…...

深入探索C++:从基础到实践

目录 引言 一、C 基础语法与特性 &#xff08;一&#xff09;命名空间&#xff08;Namespace&#xff09; 单独使用 嵌套使用 调用形式 &#xff08;二&#xff09;输入输出流&#xff08;I/O Streams&#xff09; &#xff08;三&#xff09;变量作用域 二、C 的…...

从零开始完成冒泡排序(0基础)——C语言版

文章目录 前言一、冒泡排序的基本思想二、冒泡排序的执行过程&#xff08;一&#xff09;第一轮排序&#xff08;二&#xff09;第二轮排序&#xff08;三&#xff09;第三轮排序&#xff08;四&#xff09;第四轮排序 三、冒泡排序的代码实现&#xff08;C语言&#xff09;&am…...

Echars插入的柱状图条形图,鼠标放在图上显示坐标值

只需要将axiosPointer改为cross axisPointer.type支持类型及作用&#xff1a; line&#xff1a;默认直线型指向线shadow&#xff1a;显示坐标轴方向的阴影区域cross&#xff1a;交叉线&#xff08;横向纵向双线&#xff09;none&#xff1a;不显示指向器inside&#xff1a;结合…...