一文详解TCP协议 [图文并茂, 明了易懂]
欢迎来到啊妮莫的学习小屋!
目录
什么是TCP协议
TCP协议特点✨
TCP报文格式
三次握手和四次挥手✨
可靠性
效率性
基于字节流✨
基于TCP的应用层协议
什么是TCP协议
TCP(传输控制协议, Transmission Control Protocol) 是一种面向连接的, 可靠的, 基于字节流的传输层通信协议, 广泛应用于互联网中. 它旨在提供可靠的端到端通信; 在双方进行通信之前, 必须先通过三次握手建立连接. TCP同时提供了一系列的机制来保证数据的可靠传输, 这些机制包括: 序列号, 确认应答, 重传控制, 流量控制和拥塞控制.
TCP协议特点✨
-
基于连接
-
可靠传输
-
面向字节流
TCP报文格式
-
源端口, 目的端口: 占16位, 分别用于标识发送方和接收方的应用层服务. TCP协议是基于IP协议的基础上传输的, TCP报文中的源端口+IP报文中的源IP, 与目的端口+目的IP 一起, 组合起来可以唯一确定一条TCP连接
-
序号(Sequence Number):占32位, 在发送端发出的字节流中, 传输报文中的数据部分的每一个字节都有它的编号.
序号(Sequence Number)的语义与SYN控制标志位的值有关. 根据SYN的值是否为1, 序号表达不同的含义:
-
SYN=1时: 当前为三次握手建立连接阶段, 此时的序号为初始序号ISN(Initial Sequence Number), 通过算法来随机生成ISN.
-
SYN=0时: 数据传输阶段, 第一个报文的序号为ISN+1, 后面的报文序号, 为前一个报文的序号值+TCP数据大小(不包含TCP首部).
-
-
确认序号(Acknowledgement Number): 占32位, 如果设置了ACK控制标志位, 确认序号的值就是接收方期望下一接收到的数据包的序列号: 假设主机A已经收到了来自主机B序号为0~133的所有数据, 则主机A将要发送给主机B的报文中确认序号的值为134.
-
报文首部长度: 占4位, 该字段以4字节为单位, 也就是最大值为60字节. 由图可知: 默认最小报头长度为20字节(选项字段为0), 则报文首部字段默认为0101.
-
标志位共有六个比特位, 每个比特位对于一个标志位: URG, ACK, PSH, RST, SYN, FIN. 这些标志用于控制TCP的不同行为, 例如: 建立连接(SYN), 确认应答(ACK), 指示数据急迫性(URG) 等.
-
URG: 紧急标志, 为1表示当前报文字段中存在被发送端上层置为"紧急"的数据. 接收方应当优先处理这些数据. 紧急指针(16位)字段 指出了这部分紧急数据的结束位置.
-
ACK: 确认应答, 为1标识确认序号(32位)字段有效, 该报文段中包含对方已经成功接收报文段的确认.
-
PSH: 为1指示接收方应该尽快将数据交付给应用层
-
RST: 为1表示连接出现错误, 要求数据报接收方终止连接, 并重新建立连接.
-
SYN: 用于双方建立连接. TCP三次握手中的前两次中SYN=1.
-
FIN: 发送方已经没有需要发送的数据, 想要断开连接.
-
-
窗口大小(Window Size): 占16位, 告诉发送方当前接收方剩余缓冲区的大小, 以避免接收方缓冲区溢出, 数据丢包.
-
校验和(Checksum): 占16位, 用于检查TCP报文段的错误.
-
紧急指针(Urgent Pointer): 占16位, 当URG标志位为1时, 表明从当前序列号开始的紧急数据的字节偏移量.
ISN为什么要随机初始化✨
保证网络安全, 防止黑客攻击:三次握手的其中一个重要功能就是双方交换ISN(初始化序号), 以便让对方知道接下来该如何将接收到的数据按照序列号进行组装. 如果ISN是固定的, 黑客很容易获取到ISN, 并且伪造序列号进行攻击.
为什么要设计序号和确认序号两个字段?
-
TCP的数据传输是全双工的: 即在接收的时候也可以发送, 发送的时候也可以接收, 两者并不冲突.
-
在确认应答机制中,为了提高效率, 采用的捎带应答机制, 即在请求报文中携带ACK应答数据.
综上: 需要两个不同的字段来进行数据的传输
三次握手和四次挥手✨
接下来, 通过男女朋友交往和分手的例子形象理解一下三次握手和四次挥手的过程.
三次握手:
张三-->小美: 你长得很漂亮, 做我女朋友吧!
小美-->张三: 其实我也很欣赏你, 我答应你!
张三-->小美:太棒了, 咱们一起去旅游吧!
之后俩人开始了亲密的交往~
四次挥手:
张三-->小美: 你太懒了, 我要和你分手!
小美-->张三: 好, 臭男人, 等我把我的东西收拾完!
小美-->张三: 臭男人, 我的东西收拾好了, 分手吧!
张三-->小美: 好的再见 (内心挣扎一段时间等待对方回心转意)
从此双方形同陌路人...
三次握手过程解析
刚开始Client处于Closed的状态, Server处于Listen状态.
-
第一次握手: Client给Server发送SYN报文, 其中包含Client的初始化序号ISN(C). Client进入
SYN_SEND
状态. -
第二次握手:Server收到Client的SYN报文后, 也会发送自己的SYN报文作为响应, 其中包含Server的初始化序号ISN(S). 并且Server会将Client发送的ISN(C)+1, 作为ACK发送给Client. Server进入
SYN_RCVD
(半连接)状态. -
第三次握手:Client收到Server的SYN报文后, 会将Server发送的ISN(S)+1, 作为ACK发送给Server, 此时Client处于
ESTABLISHED
状态. 当Server收到来自Client的ACK报文后, 也进入ESTABLISHED
状态. 双方建立连接成功.
为什么是三次握手,两次四次行吗?
三次握手是确认通信双方都具有发送和接收能力的最小握手次数.
第一次握手,当Server收到Client的SYN请求后, Server端可以确定: Server的接收能力正常, Client的发生能力正常.
第二次握手, Client收到来自Server的应答, Client可以确定: Client的发送和接收能力正常, Server的发送和接收能力正常. 不过因为此时Server并没有收到来自Client的ACK, 因此无法确定自己的发送能力和Client的接收能力是否正常.
第三次握手后, Server收到了ACK, 可以确认自己的发送能力以及对方的接收能力没问题. 此时双方都进入ESTABLISHED
状态.
两次握手可能引发的问题
-
Server端无法确认自己的发送能力以及Client端的接收能力是否正常
-
SYN-Flood攻击:
假设TCP是两次握手,客户端在短时间内不断的向服务端发起SYN请求, 使得服务端进入
ESTABLISH
状态,而客户端将服务端发送来的ACK报文直接丢弃, 这样双方建立连接的成本嫁接到了服务端: 服务端需要维护大量的连接, 而客户端却不用. 如此:在两次握手即可建立连接的情况下, 即使是一个单片机也可以造成服务器大量资源浪费.在三次握手的机制下, 攻击者也可能会发起SYN洪水攻击, 导致服务端生成大量半连接(SYN_RCVD),从而消耗系统资源, 目标系统运行缓慢,无法提供正常的服务. 但是客户端也需要维护一定数量的连接. 相对来说这样服务端不容易受到攻击.
什么是半连接队列?
半连接状态: 客户端向服务端发起SYN连接, 服务端进行了回应, 进入SYN_RCVD
状态, 此时服务端处于半连接状态.
服务器会把此种状态的请求连接放入一个队列中, 也就是半连接队列.
如果一直收不到客户端的ACK会发生什么?
每个半连接都设有一个定时器, 超过时间未收到ACK, 服务端会重传SYN-ACK消息, 重传次数达到系统规定的最大重传次数, 系统会将该半连接信息从队列中删除.
三次握手过程中可以携带数据吗?
第一次和第二次不可以携带数据.
防止黑客恶意攻击:黑客可以在首次的SYN报文中放入大量数据, 然后疯狂重复发SYN报文, 这样服务端需要花费很多时间, 内存空间来处理这些数据.
第三次握手可以携带数据: 客户端已经处于ESTABLISHED
状态, 并且客户端已经知道服务端的发送和接收能力正常.
四次挥手过程解析
-
第一次挥手:Client向Server发送FIN, Seq=K. 用于关闭从Client到Server的数据传送, Client进入
FIN_WAIT_1
状态. -
第二次挥手:Server收到FIN后, 发生ACK(K+1)作为应答, Server进入
CLOSE_WAIT
状态. -
第三次挥手:Server向Client发送FIN, Seq=L. 用于关闭从Server到Client的数据传送, Server进入
LAST_ACK
状态. -
第四次挥手:Client收到FIN后, 发送ACK(L+1)作为应答, 并进入
TIME_WAIT
状态, 等待2MSL(2倍的最大报文存活时长), 确保ACK被Server端接收到了, 后进入CLOSED
状态. 四次挥手结束.
为什么是四次挥手?
在三次握手时: 服务端的ACK和SYN可以一起发送; 因为ACK报文是用于应答的, SYN报文是用于同步的, 二者由内核直接发送.
在四次挥手时: FIN信号是由于应用层调用close所以才发送的, 而服务端在收到FIN报文后, 可能还有需要向客户端发送的报文, 所以只能先回复一个ACK报文, 告诉客户端"你发的报文我收到了". 当服务端报文发送完了, 才会发起FIN请求, 因此不能一起发送.
TIME_WAIT状态和CLOSE_WAIT状态
TIME_WAIT状态
-
主动关闭连接的一方在发送最后一个ACK报文之后,进入TIME_WAIT状态.
-
TIME_WAIT状态的持续时间为2MSL(2倍的最大报文存活时间).
-
在TIME_WAIT状态期间, 该连接处于等待状态, 以确保网络中的任何未完成或延迟的分节都能到达目的地(确保服务器已经成功收到并且处理了ACK报文).
-
在TIME_WAIT状态期间, 这个套接字不会分配给其他连接使用, 因此会占用一定的系统资源.
CLOSE_WAIT状态
-
被动关闭连接的一方在收到关闭连接请求并发送ACK报文后,进入CLOSE_WAIT状态
-
被动关闭连接一方如果没有发送FIN报文, 则CLOSE_WAIT状态会一直持续下去, 导致资源泄露.
为什么需要TIME_WAIT状态?
-
保证可靠的关闭连接:理论上, 四个报文发送完毕, 就可以直接进入
CLOSED
状态, 但是可能网络是不可靠的, 最后一个ACK报文可能丢失, 此时对端会重传FIN报文. 所以TIME_WAIT
状态是用来重发可能丢失的ACK报文的. -
避免连接复用问题:确保本次连接所产生的所有数据段从网络中消失, 防止新连接收到之前旧连接的延迟数据包, 避免数据包混乱.
为什么等待时间是2MSL?
客户端无法知道ACK是否被服务端成功接收, 因此需要等待; 假设ACK没有到达服务端, 服务端会超时重传FIN报文(timeout retransmit), 客户端收到新的FIN报文, 再次发送ACK. 这个等待时间至少是: 服务端的timeout+FIN送达客户端时间; 为了保证可靠性, 采用更加保守的等待时间2MSL.
客户端发送ACK, 等待ACK到达对端需要MSL, 等待对方的FIN报文到达也是MSL. 所以, 在2MSL时间内没有收到FIN, 说明服务端已经成功收到ACK.
TIME_WAIT状态引发的问题?
TIME_WAIT状态下的套接字暂时不会关闭, 端口依然被占用.
-
服务端短时间内关闭大量Client连接, 会导致服务端出现大量的TIME_WAIT连接, 严重消耗服务器资源.
-
客户端短时间内关闭大量连接, TIME_WAIT状态连接的端口依然被占用, 端口资源被耗尽, 则一段时间内无法发起新的连接
什么情况下会出现大量的CLOSE_WAIT状态?
服务端没有进行第三次挥手, 没有发送FIN结束报文. 也就是没有正确关闭连接所对应的文件描述符.
大量的CLOSE_WAIT状态会导致资源泄露, 可能到最后没有可分配的文件描述符, 从而使得服务崩溃.
可靠性
TCP协议提供可靠的端到端的数据传输通信; 那么哪些情况是不可靠的呢? 例如: 数据丢包, 乱序, 数据重复发送, 数据发送太快导致接收端来不及处理等等.
建立连接
通信双方通过三次握手建立连接, 可以预先确定对方的接收能力和发送能力没有问题.
序号机制
在TCP建立连接初期, 双方各自随机选择一个初始化序列号, 随后传输的每个报文的序号基于初始值递增, 增量为报文的数据字节大小, 这样可以确保数据的有序传输和重组.
假设主机A需要向主机B发送一个1000字节的数据流, 每次传输的报文段长度为100字节, 则数据流的首字节编号为0; 将该数据流构建出10个报文段, 第一个报文段的序号0, 第二个报文段的序号为100, 第三个200, 以此类推. 报文的序号被写入TCP报头中的32位序列号字段中.
确认应答
当对端收到了发送的消息报文后, 会发送过来ACK应答报文,ACK标志位为1, 确认序号的值为期待下次收到的报文序号. (PS: 为了提高通信效率, 一般会采用捎带应答,累计确认等机制)
超时重传
当发送方发送数据后, 如果在预定时间内未收到接收方的ACK确认报文, 发送方会假设该数据段丢失, 并且重新发送该数据段.假如一个数据段经过多次重发也没有收到对端的确认报文, 那么就会认为接收端异常, 强制关闭该连接.
数据校验
TCP报头包含校验和字段, 通过校验和的方式, 接收端可以检测出数据是否有差错和异常, 假如有差错就会直接丢弃TCP报文, 让发送端重新发送.
流量控制
当接收方来不及处理发送方的数据时, 可以通过滑动窗口机制, 告诉发送方降低发送速率, 防止数据包丢失.流量控制同时也可以提升TCP数据传输的效率, 因此在下文的效率篇会重点讲解.
拥塞控制✨
拥塞控制可以避免因为网络拥堵造成的丢包, 主要包括: 慢启动, 拥塞避免, 超时重传, 快速恢复四种策略.
在某段时间内, 若对网络中的某一资源的需求超过了该资源所能提供的可用部分, 网络性能就要变坏, 这种情况就叫做网络拥塞; 如果在网络状态已经比较拥堵的情况下, 贸然发送大量数据, 不仅仅会加重网络的负荷, 同时也会造成大量数据包丢失.
-
慢启动: 连接建立后将拥塞窗口的初始大小cwnd(congestion window)设置为一倍的MSS(Maximum Segment Size最大报文段长度), 即cwnd=1*MSS. 为了便于分析, 省略MSS, 称初始cwnd为1, 下文同理.
在慢启动阶段, 每收到一个ACK, cwnd翻倍, 这一阶段窗口大小呈指数增长.
-
拥塞避免: 当cwnd达到慢启动阈值ssthresh(Slow Start Threshold)时, 进入拥塞避免阶段. 这时每收到一个ACK, cwnd+1;
-
超时重传: 随着窗口的增长, 网络中传输的数据越来越多, 最终超出带宽限制, 出现丢包. 发送方会对数据进行超时重传, 将ssthresh调整为当前cwnd的一半, 然后将cwnd重置为1, 重新开始慢启动阶段.
-
快速恢复: 当发送方收到三个重复的ACK时, 判定相应的报文丢失, 立即重传, 将ssthresh调整为当前cwnd的一半, cwnd不必从1开始, 而是和新的ssthresh相等, 重新开始拥塞避免阶段.
拥塞窗口大小为什么先指数增加后线性增长?
窗口大小首先以指数递增用来探测网络的拥塞程度, 执行拥塞避免算法后, 拥塞窗口线性缓慢增大, 防止网络过早出现拥塞.
效率性
流量控制✨
接收端处理数据的速度是有限的, 如果发送端发的太快, 导致接收端的缓冲区被填满, 这个时候如果发送端继续发送数据, 就会造成数据丢失和资源浪费.
因此TCP支持根据[接收端]的处理能力, 来决定[发送端]的发送速度, 这个机制就叫做流量控制.
流量控制是通过滑动窗口机制来实现的.
发送方的滑动窗口
下图是发送方的缓冲区数据, 根据被处理的情况分为四个部分, 其中蓝色方框是发送窗口, 橙色方框是可用窗口.
当发送方将可发送数据全部发出去后, 可用窗口大小就变为0了, 在未收到ACK之前, 发送方无法继续发送数据了.
当发送方接收到之前发送数据22~24
字节的ACK报文后, 滑动窗口向右边移动3字节, 则后续就可以发送34~36
字节的数据.
接收方的滑动窗口
接收方的滑动窗口比较简单. 可以划分为3部分.
以下是流量控制的动态图
由拥塞控制以及流量控制可知: 发送方的发送窗口大小不仅仅取决与接收方的接收窗口大小, 也取决于网络的拥塞程度. 因此: 发送窗口的最大值=min(接收窗口, 拥塞窗口).( 也可以写作 swnd=min(rwnd,cwnd) ).
快速重传
当发送方连续收到3个重复的ACK时, 判定相应的报文丢失, 立即重传. 这样可以在不等待超时的情况下重传丢失的报文段, 避免了数据丢失时的长期等待, 提示传输效率.
累计确认
TCP的累计确认是指接收方发送的ACK报文中的确认号表示的是接收方期望接收到的下一个字节的序列号. 这意味着所有比这个确认号小的字节都已经被成功接收.
捎带应答
在TCP通信过程中, 数据发送方和接收方需要通过确认应答ACK来确保数据的可靠传输. 捎带应答技术允许在数据传输过程中, 将确认应答信息"捎带"在数据包中一起发送, 而不是单独发送一个ACK包.
延迟应答
接收方在接收到每个报文后, 不会立即发送ACK报文, 而是会等待一段时间.
-
等待网络中的其他报文段到达, 这样接收方可以将多个确认合并为一个ACK报文, 减少ACK报文的数量, 从而降低网络开销
-
等待应用进程读取数据, 使得滑动窗口变大, 并在下次的报文中告知数据发送方, 从而增大数据传输量, 提升传输效率.
基于字节流✨
TCP协议与UDP协议的区别之一就是: TCP将数据视为一连串的字节流, 不关心数据包的边界; 而UDP报文中有UDP报文长度字段, 因此可以确定其边界.
没有边界, 如何理解呢? 就是上层不知道这次读取上来的是几个TCP数据包, 可能是一个, 半个, 也可能是好几个.
而没有边界就会使数据包粘在一起,就像一个一个的粘包一样.
粘包问题
解决粘包问题的思路核心: 明确两个包之间的边界.
-
在接收端接收的时候采用定长的方式接收
-
数据包的尾部加上明确的分隔符
-
在报头加上数据包总长度字段
-
使用应用层协议对边界进行区分
基于TCP的应用层协议
协议 | 默认端口 |
---|---|
HTTP(超文本传输协议) | 80 |
FTP(文件传输协议) | 20用于传输数据, 21用于传输控制信息 |
SMTP(简单邮件传输协议) | 25 |
TELNET(网络电传) | 23 |
SSH(安全外壳协议) | 22 |
感谢铁汁萌花费时间来看我写的文章, 希望上面的内容可以对你有所帮助~
相关文章:
一文详解TCP协议 [图文并茂, 明了易懂]
欢迎来到啊妮莫的学习小屋! 目录 什么是TCP协议 TCP协议特点✨ TCP报文格式 三次握手和四次挥手✨ 可靠性 效率性 基于字节流✨ 基于TCP的应用层协议 什么是TCP协议 TCP(传输控制协议, Transmission Control Protocol) 是一种面向连接的, 可靠的, 基于字节流的传输层通…...
js后端开发之Next.js、Nuxt.js 与 Express.js
后端js之Next.js、Nuxt.js 与 Express.js 在现代 Web 开发中,JavaScript 已经成为前后端通用的编程语言,而选择合适的后端框架则是构建高效、可扩展应用程序的关键。本文将带你深入了解三个流行的 JavaScript 后端框架:Next.js、Nuxt.js 和 …...
人工智能概要
目录 前言1.什么是人工智能(Artificial Intelligence, AI)2.人工智能发展的三次浪潮2.1 人工智能发展的第一次浪潮2.2 人工智能发展的第二次浪潮2.3 人工智能发展的第三次浪潮 3.人工智能发展的必备三要素3.1 数据3.2 算法(algorithm…...
spring boot 3集成swagger
Spring Boot 3 集成 Swagger 的过程与之前版本相比有一些变化,主要是因为 springfox 库已经停止更新,并且不再支持新的 Spring Boot 版本。因此,对于 Spring Boot 3 来说,推荐使用 springdoc-openapi 作为集成 Swagger 的解决方案…...
【PlantUML系列】状态图(六)
一、状态图的组成部分 状态:对象在其生命周期内可能处于的条件或情形,使用 state "State Name" as Statename 表示。初始状态:表示对象生命周期的开始,使用 [*] 表示。最终状态:表示对象生命周期的结束&…...
前端缓存页面处理方法
当前一个前端应用新发布时,重新编译后,原来引用的资源文件名都会有变化。如果这个应用的页面在前端浏览器中有缓存,则会导致加载资源失败。怎样去除这种缓存,同时也能尽可能的保证前端访问的性能 ChatGPT said: ChatGPT 这是一个经…...
每日一题 284. 窥视迭代器
284. 窥视迭代器 想要提前知道下一个内容,就需要缓存 class PeekingIterator : public Iterator { public:PeekingIterator(const vector<int>& nums) : Iterator(nums) {// Initialize any member here.// **DO NOT** save a copy of nums and manipula…...
Cesium-(Primitive)-(BoxGeometry)
含实现代码 GISer世界 效果: 以下是 BoxGeometry 类的构造函数属性,以表格形式展示: 属性名类型默认值描述minimumCartesian3盒子的最小 x, y, 和 z 坐标。maximumCartesian3盒子的最大 x, y, 和 z 坐标。vertexFormatVertexFormatVertexFormat.DEFAULT要计算的顶点属性。以下…...
CSS元素宽高特点、类型转化、显式和隐藏(display)
元素的宽高特点 块级元素 可以设置宽高,不可以和其他元素在一行设置宽高时,元素的宽高为设置的值没有设置宽高时,宽度和父级宽高一样,高度由元素内容决定 行级元素 不可以设置宽高,可以和其他元素在一行元素的宽高…...
上市公司投资效率Biddle模型数据(包括最终数据、原始数据及构造说明)2003-2022年
一、计算方式:参考《Journal of accounting and economics》Biddle G C,构建Biddle模型使用企业投资对成长机会的回归模型来估计企业的投资效率,这里成长机会用销售增长率来衡量。回归模型如下图所示: 二、资料范围:包括原始数据…...
矩阵的乘(包括乘方)和除
矩阵的乘分为两种: 一种是高等代数中对矩阵的乘的定义:可以去这里看看包含矩阵的乘。总的来说,若矩阵 A s ∗ n A_{s*n} As∗n列数和矩阵 B n ∗ t B_{n*t} Bn∗t的行数相等,则 A A A和 B B B可相乘,得到一个矩阵 …...
Spring Security6.3 自定义AuthorizationManager问题
项目环境: Springboot3.3.5, 对应的SpringFrameWork6.1,Security为6.3 问题:我想自定义AuthorizationManager接口实现类,在里面判断如果角色为amdin则放行请求; 在AdminAuthorizationManager类的check()方法中pass变量…...
第一部分:基础知识 9 . 视图 --[MySQL轻松入门教程]
在MySQL中,视图(View)是一个命名的SQL查询,它被存储在数据库目录中。视图可以包含来自一个或多个表的数据,并且可以像真实表一样被查询。下面是对MySQL视图的详细讲解: 创建视图 使用 CREATE VIEW 语句来创建视图。语法如下: CREATE [OR REPLACE] [ALGORITHM = {UNDEFIN…...
用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配?用GPT开发嵌入式
用GPT零负担学单片机之点亮一颗cpu 第3节 训练or特征匹配?AI写代码 大家好,我是小杰学长 如果你是大学生 遇到电子技术 学习 成长 入行难题 我曾经通过大学比赛赚钱 从事嵌入式AI 航天军工 用特别的学习和求职方法线下半年带50+学弟学妹入行开发 主页佳喔威信,给你提供一定资…...
2.6、vue2中侦听属性的变化
2.6.1、侦听属性作用侦听属性的变化其实就是监视某个属性的变化。当被监视的属性一旦发生改变时,执行某段代码。2.6.2、watch配置项监视属性变化时需要使用watch配置项 可以监视多个属性,监视哪个属性,请把这个属性的名字拿过来即可。 i.可以监视Vue的原有属性 ii.如果监视的…...
enable_shared_from_this
用途 struct S {shared_ptr<S> dangerous(){return shared_ptr<S>(this); // dont do this!} };int main() {shared_ptr<S> sp1(new S);shared_ptr<S> sp2 sp1->dangerous();return 0; }考虑以上代码,从一个被shared_ptr管理的struc…...
重生之我在异世界学智力题(2)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言智力题:逃离孤岛智力题&a…...
深入解析下oracle的number底层存储格式
oracle数据库中,number数据类型用来存储数值数据,它既可以存储负数数值,也可以存储正数数值。相对于其他类型数据,number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。 一、环境搭建 1.…...
prometheus
1.安装,tar包,解压即用 tar xf prometheus-2.33.3.linux-amd64.tar.gz -C /app/tools/ 2.创建软链接 ln -s prometheus-2.33.3.linux-amd64/ /app/tools/prometheus 3.进入目录 cd /app/tools/prometheus 4.运行 ./prometheus 5.此时࿰…...
C# 23种设计模式(1)单例模式(单件模式)
一、单例模式介绍 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这个模式在需要一个对象被共享且全局唯一的情况下非常有用,比如配置对象、日志对象、数据库连接…...
Javaweb:HTML、CSS
学习 资源1 学习资源 2 黑马javaweb HTML 1、基础标签、样式 图片标签:<img> src:绝对路径、相对路径(绝对磁盘路径,网络路径;./当前目录)width:宽度(百分比)height:高度(百分比&…...
SmartDV将SDIO系列IP授权给RANiX开发车联网(V2X)产品
双方的合作将增强符合ISO 26262标准的车联网(V2X)系统的通信和连接能力,加速实现更安全、更智能的汽车系统和车辆创新 加利福尼亚州圣何塞市,2024年12月——灵活、高度可配置、可定制化的半导体设计知识产权(IP&#…...
【Android】创建型设计模式—单例模式、工厂模式、建造者模式
单例模式 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。 单例模式类图: #mermaid-svg-kzf6IdXdYeNOHtP0 {font-family:"trebuchet ms",verdana,arial,sa…...
ida9pro压缩包
资源类型的博客大部分都是为了自己某天换新机了用 下载链接2:ida9.zip 下载链接1:https://mega.nz/folder/yiAiVDAa#T0kogEE7ufqy0x0EpCuOLQ 主目录下该文件为证书文件 ida9中选择它,就可以了...
前端入门之VUE--vue组件化编程
前言 VUE是前端用的最多的框架;这篇文章是本人大一上学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。 文章目录 2、Vue组件化编程2.1、组件2.2、基本使用2.2.1、VueComponent 2、Vue组件化编程 2.1、组件 组件:用来实现…...
C++是如何工作的?
首先来看一个最基本的C程序段。 #include <iostream>int main() {std::cout << "HelloWorld" << std::endl;std::cin.get(); } 第一行 #include 的含义是预处理的意思,这条语句的作用是将一个名为iostream的文件拷贝到源代码中这个…...
JavaScript中的this, 究竟指向什么?
在JavaScript代码的不同位置中,this所指向的数据是不一样的。比如大部分同学都知道,在对象的函数属性方法中,this指向对象本身;在构造函数中,this指向要生成的新对象。事实上,this指向的逻辑不止这几种&…...
JavaWeb学习(3)(Servlet详细、Servlet的三种实现方式(面试)、Servlet的生命周期、传统web.xml配置Servlet(了解))
目录 一、Servlet详细。 (1)基本介绍。 (2)基本作用。 1、接收客户端请求数据。 2、处理请求。 3、完成响应结果。 二、Servlet的三种实现方式。 (1)实现javax.servlet.Servlet接口。 1、基本介绍。 2、代码…...
【图像去雾数据集】URHI数据集介绍
URHI数据集对应论文:RESIDE: A Benchmark for Single Image Dehazing(2017) URHI数据集下载链接:https://sites.google.com/site/boyilics/website-builder/reside 为便于下载,将上述官方提供的链接中百度云链接粘贴如…...
Playwright中Page类的方法
导航和页面操作 goto(url: str, **kwargs: Any): 导航到一个URL。 reload(**kwargs: Any): 重新加载当前页面。 go_back(**kwargs: Any): 导航到会话历史记录中的前一个页面。 go_forward(**kwargs: Any): 导航到会话历史记录中的下一个页面。 set_default_navigation_tim…...
算力介绍与解析
算力(Computing Power)是指计算机系统在单位时间内处理数据和执行计算任务的能力。算力是衡量计算机性能的重要指标,直接影响计算任务的速度和效率。 算力的分类和单位 a. 基础算力:以CPU的计算能力为主。适用于各个领域的计算。…...
CentOS 上如何查看 SSH 服务使用的端口号?
我们知道,linux操作系统中的SSH默认情况下,端口是使用22,但是有些线上服务器并不是使用的默认端口,那么这个时候,我们应该如何快速知道SSH使用的哪个端口呢? 1、通过配置文件查看 cat /etc/ssh/sshd_confi…...
每日算法Day03
1.19.删除链表的倒数第N个节点 算法链接: 19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 类型: 链表 难度: 中等 思路:采用双指针法,控制两个指针之间的距离为n个节点 易错点:返回节点的确定和头节点的处理&…...
【漏洞复现】Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216)
🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 【漏洞复现】Apache Solr 身份认证绕过导致任意文件读取漏洞复现(CVE-2024-45216) 一、漏洞概述1.1漏洞简介1.2组件描述1.3漏洞描述二、漏洞复现2.1 应用协议2.2 环境…...
若依将数据库更改为SQLite
文章目录 1. 添加依赖项2. 更新配置文件 application-druid.yml2.1. 配置数据源2.2. 配置连接验证 3. 更新 MybatisPlusConfig4. 解决 mapper 中使用 sysdate() 的问题4.1. 修改 BaseEntity4.2. 修改 Mapper 5. 更新 YML 配置 正文开始: 前提条件:在您的…...
ubuntu远程桌面开启opengl渲染权限
背景 最近用windows的【远程桌面连接】登录ubuntu后(xrdp协议),发现gl环境是集显的,但是本地登录ubuntu桌面后是独显(英伟达),想要在远程桌面上也用独显渲染环境。 一、查看是独显还是集显环境…...
Scala的泛型
需求:定义一个名为getMiddleEle 的方法用它来获取当前的列表的中间位置的值中间位置的下标 长度/2目标:getMiddleEle(List(1,2,3,4,5)) > 5/2 2 > 下标为2的元素是:3 getMiddleEle(List(1,2,3,4)) > 4/2 2 > 下标为2的元素是:3格式如下: 定义一个函数的格式:def…...
每隔一秒单片机向电脑发送一个16进制递增数据
SCON0x50 SM00 SM11(工作方式为方式一) REN1允许单片机从电脑接收数据 TB8 RB8 SM2是方式2和方式3直接配置为0 TI为发送中断请求标志位 由硬件配置为1 必须由 软件复位为0,RI为接收中断请求标志位,同理TI UART.c #include &l…...
轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)
前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统,与其他日志系统不同的是,Loki最初设计的理念是为了为日志建立标签索引,而非将原日志内容进行索引。 现在目前成熟的方案基本上都是:L…...
React和Vue.js的相似性和差异性是什么?
React和Vue.js都是现代前端开发中广泛使用的JavaScript框架,它们都旨在提高开发效率和组件化开发。以下是他们的一些相似性和差异性: 相似性 组件化:两者都支持组件化开发,允许开发者将UI拆分成独立的、可复用的组件。虚拟DOM&a…...
跨域 Cookie 共享
跨域请求经常遇到需要携带 cookie 的场景,为了确保跨域请求能够携带用户的认证信息或其他状态,浏览器提供了 withCredentials 这个属性。 如何在 Axios 中使用 withCredentials 为了在跨域请求中携带 cookie,需要在 Axios 配置中设置 withCr…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之计数器与累加器(一)
学习背景: 在现实生活中一些需要计数的场景下我们会用到计数器,如空姐手里记录乘客的计数器,跳绳手柄上的计数器等。累加器是累加器求和,以得到最后的结果。计数器和累加器它们虽然是基础知识,但是应用广泛࿰…...
红黑树(Red-Black Tree)
一、概念 红黑树(Red Black Tree)是一种自平衡的二叉搜索树,通过添加颜色信息来确保在进行插入和删除操作时,树的高度保持在对数级别,从而保证了查找、插入和删除操作的时间复杂度为 O(log n)。这种树可以很好地解决普…...
火电厂可视化助力提升运维效率
图扑智慧火电厂综合管理平台实现对火电厂关键设备和系统的实时监控和数据分析。图扑可视化不仅优化了运维流程,还增强了安全管理,有效提升了电厂整体运营效率。...
application.yml 和 bootstrap.yml
在 Spring Boot 中,application.yml 和 bootstrap.yml 都是用来配置应用程序的属性文件,通常用于环境配置、服务配置等。但是,它们有一些不同的用途和加载顺序。以下是它们之间的主要区别: 1. application.yml: 主要…...
电子应用设计方案-49:智能拖把系统方案设计
智能拖把系统方案设计 一、引言 随着人们生活水平的提高和对清洁效率的追求,智能拖把作为一种创新的清洁工具应运而生。本方案旨在设计一款功能强大、操作便捷、清洁效果出色的智能拖把系统。 二、系统概述 1. 系统目标 - 实现自动清洁地面,减轻用户劳…...
Model Context Protocol 精选资源列表
Model Context Protocol 精选资源列表 Model Context Protocol 精选资源列表什么是MCP?教程社区说明服务器实现📂 浏览器自动化☁️ 云平台💬 社交👤 数据平台🗄️ 数据库💻 开发者工具🧮 数据科…...
Windows 11 12 月补丁星期二修复了 72 个漏洞和一个零日漏洞
微软于 2024 年 12 月为 Windows 11 发布的补丁星期二修复了其产品生态系统中的 72 个漏洞,包括 Windows 通用日志文件系统驱动程序中一个被积极利用的零日漏洞。 这个严重漏洞可以通过基于堆的缓冲区溢出授予攻击者系统权限,使其成为此版本中优先级最高…...
Python毕业设计选题:基于Hadoop 的国产电影数据分析与可视化_django+spider
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 免费电影管理 在线论坛 留言反馈 看板展示 系统…...
蓝桥杯我来了
最近蓝桥杯报名快要截止了,我们学校开始收费了,我们学校没有校赛,一旦报名缴费就是省赛,虽然一早就在官网上报名了,但是一直在纠结,和家人沟通,和朋友交流,其实只是想寻求外界的支持…...