【计网】TCP 协议详解 与 常见面试题
三次握手、四次挥手的常见面试题
不用死记,只需要清楚三次握手,四次挥手的流程,回答的时候心里要记住,假设网络是不可靠的
问题(1):为什么关闭连接时需要四次挥手,而建立连接却只要三次握手?
关闭连接时,被动断开方在收到对方的FIN结束请求报文时很可能没有发送完业务数据,并不能立即关闭连接,被动方只能先回复一个ACK响应报文,告诉主动断开方:“你发的FIN报文我收到了,只有等到我所有的业务报文都发送完了,我才能真正结束,在结束之前,我会发给你FIN+ACK报文的,你先等着”。所以,被动断开方的确认报文需要拆成两步,故总共需要四次挥手。
在建立连接场景中,Server的应答可以稍微简单一些。当Server收到Client的SYN连接请求报文后,其中ACK报文表示对请求报文的应答,SYN报文表示服务端的连接也已经同步开启了,而ACK报文和SYN报文之间不会有其他报文需要发送,故而可以合二为一,可以直接发送一个SYN+ACK报文。所以,在建立连接时,只需要三次握手即可。
问题(2):为什么连接建立的时候是三次握手,可以改成两次握手吗?
三次握手完成两个重要的功能:一是双方都做好发送数据的准备工作,而且双方都知道对方已准备好;二是双方完成初始SN序列号的协商,双方的SN序列号在握手过程中被发送和确认。如果把三次握手改成两次握手,可能发生死锁。两次握手的话,缺失了Client的二次确认ACK帧,假想的TCP建立连接时的二次挥手可以如图所示。
在假想的TCP建立连接时的二次握手过程中,Client给Server发送一个SYN请求帧,Server收到后发送确认应答SYN+ACK帧。按照两次握手的协定,Server认为连接已经成功地建立,可以开始发送数据帧。在这个过程中,如果确认应答SYN+ACK帧在传输中被丢失,Client没有收到,Client将不知道Server是否已准备好,也不知道Server的SN序列号,Client认为连接还未建立成功,将忽略Server发来的任何数据分组,会一直等待Server的SYN+ACK确认应答帧。Server在发出的数据帧后,一直没有收到对应的ACK确认后就会产生超时,重复发送同样的数据帧。这样就形成了死锁。
问题(3):为什么主动断开方在TIME-WAIT状态必须等待2MSL?
原因之一:主动断开方等待2MSL的时间是为了确保两端都能最终关闭。假设网络是不可靠的,被动断开方发送FIN+ACK报文后,其主动方的ACK响应报文有可能丢失,这时的被动断开方处于LAST-ACK状态,由于收不到ACK确认被动方一直不能正常地进入CLOSED状态。在这种场景下,被动断开方会超时重传FIN+ACK断开响应报文,如果主动断开方在2MSL时间内收到这个重传的FIN+ACK报文,就会重传一次ACK报文,然后再一次重新启动2MSL计时等待,这样就能确保被动断开方能收到ACK报文,从而能确保被动方顺利进入CLOSED状态。只有这样,双方才都能够确保关闭。反过来说,如果主动断开方在发送完ACK响应报文后不是进入TIME_WAIT状态去等待2MSL时间,而是立即释放连接,则将无法收到被动方重传的FIN+ACK报文,所以不会再发送一次ACK确认报文,此时处于LAST-ACK状态的被动断开方无法正常进入CLOSED状态。
原因之二:防止“旧连接已失效的数据报文”出现在新连接中。主动断开方在发送完最后一个ACK报文后再经过2MSL才能最终关闭和释放端口。这就意味着,相同端口的新TCP新连接需要在2MSL的时间之后才能够正常建立。2MSL这段时间内,旧连接所产生的所有数据报文都已经从网络中消失了,从而确保下一个新的连接中不会出现这种旧连接请求报文。
问题(4):如果已经建立了连接,但是Client端突然出现故障了怎么办?
TCP还设有一个保活计时器,Client如果出现故障,Server不能一直等下去,这样会浪费系统资源。每收到一次Client的数据帧后,Server的保活计时器都会复位。计时器的超时时间通常设置为2小时,若2小时还没有收到Client的任何数据帧,Server就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没有反应,Server就认为Client出了故障,接着关闭连接。如果觉得保活计时器的两个多小时的间隔太长,可以自行调整TCP连接的保活参数。
OSI、TCP/IP模型
国际标准化组织ISO为了使网络应用更为普及,推出了OSI参考模型,即开放式系统互联(Open System Interconnect)模型,一般都叫OSI参考模型。OSI参考模型是ISO组织在1985年发布的网络互连模型,其含义就是为所有公司使用一个统一的规范来控制网络,这样所有公司遵循相同的通信规范,网络就能互联互通了。
OSI模型定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),每一层实现各自的功能和协议,并完成与相邻层的接口通信。
下面是常见的协议
TCP/IP协议是互联网最基本的协议,在一定程度上参考了七层ISO模型,有些复杂,所以在TCP/IP协议中七层被简化为四个层次。TCP/IP模型中的各种协议依功能不同被归属到四层之中,常被视为简化后的七层OSI模型。
TCP/IP 应用层
应用层包括所有和应用程序协同工作并利用基础网络交换应用程序的业务数据的协议。一些特定的程序被认为运行在这个层上,该层协议所提供的服务能直接支持用户应用。应用层协议包括HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登录)、DNS(域名解析)以及许多其他协议。
TCP/IP 传输层
传输层的协议解决了端到端可靠性等问题,能确保数据可靠地到达目的地,甚至能保证数据按照正确的顺序到达目的地。传输层的主要功能大致如下:
(1)为端到端连接提供传输服务。
(2)这种传输服务分为可靠和不可靠的,其中TCP是典型的可靠传输、UDP是不可靠传输。
(3)为端到端连接提供流量控制、差错控制、服务质量(Quality of Service, QoS)等管理服务。
传输层主要有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)。
TCP是一个面向连接的、可靠的传输协议,提供一种可靠的字节流,能保证数据完整、无损并且按序到达。TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。另外,TCP试图将数据按照规定的顺序发送。
UDP是一个无连接的数据报协议,是一个“尽力传递”和“不可靠”协议,不会对数据包是否已经到达目的地进行检查,并且不保证数据包按顺序到达。
TCP/IP协议的网络层
TCP/IP协议网络层的作用是在复杂的网络环境中为要发送的数据报找到一个合适的路径进行传输。简单来说,网络层负责将数据传输到目标地址,目标地址可以是多个网络通过路由器连接而成的某一个地址。另外,网络层负责寻找合适的路径到达对方计算机,并把数据帧传送给对方,网络层还可以实现拥塞控制、网际互联等功能。网络层协议的代表包括ICMP、IP、IGMP等。
TCP/IP协议的链路层
链路层有时也称作数据链路层或网络接口层,用来处理连接网络的硬件部分。该层既包括操作系统硬件的设备驱动、NIC(网卡)、光纤等物理可见部分,也包括连接器等一切传输媒介。在这一层中,数据的传输单位为比特。其主要协议有ARP、RARP等。
HTTP报文传输原理
利用TCP/IP进行网络通信时,数据包会按照分层顺序与对方进行通信。发送端从应用层往下走,接收端从链路层往上走。从客户端到服务器的数据,每一帧的传输顺序都为应用层→传输层→网络层→链路层→链路层→网络层→传输层→应用层。
在数据封装时,数据经过每个层都会打上该层特定标识,添加上头部。
TCP/IP除了与OSI在分层模块上稍有区别外,更重要的区别是:OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。
OSI更像是一位通信系统架构师,考虑的是"为了完成端到端通信,从理论上需要哪些功能模块
TCP/IP更像是一位软件工程师,考虑的是"要开发什么样的程序才能让计算机实现网络通信
实际上,在传输过程中,数据报文会在不同的物理网络之间传递。还是以一个HTTP请求的传输为例,请求在不同物理网络之间的传输过程大致如图
TCP 协议
报文格式
在TCP/IP协议栈中,IP层只关心如何使数据能够跨越本地网络边界的问题,而不关心数据如何传输。TCP/IP协议栈配合起来解决数据如何通过许许多多个点对点通路顺利传输到目的地。一个点对点通路被称为一“跳”(hop),通过TCP/IP协议栈,网络成员能够在许多“跳”的基础上建立相互的数据通路。
一个传输层TCP的数据帧大致包含以下字段:
1. 源端口号 (Source Port)
- 占16位,表示报文的发送端口
- 源端口号与源IP地址组合,共同标识报文的发送地址
- 作用:标识数据来源的应用程序
2. 目的端口号 (Destination Port)
- 占16位,表示报文的接收端口
- 目的端口号与目的IP地址组合,共同标识报文的接收地址
- 重要概念:TCP连接由四元组唯一确定:“源端口号+源IP"与"目的端口号+目的IP”
3. 序号 (Sequence Number, SN)
-
占32位,用于标识发送的数据字节流位置
-
序号的含义取决于SYN控制标志的值:
- 当SYN=1时:表示连接建立阶段,序号为初始序号ISN(Initial Sequence Number),通过算法随机生成
- 当SYN=0时:在正常数据传输阶段
- 第一个报文序号为ISN+1
- 后续报文序号 = 前一个报文的SN值 + 前一个报文的净荷字节数
-
序号计算示例:
- 若发送的TCP帧净荷为12字节,序号为5
- 则下一个数据包的序号应为:5 + 12 = 17
-
序号的作用:
- 发送端跟踪已发送的数据量
- 接收端识别重复包并丢弃
- 对乱序数据包进行重排序
- 为上层提供有序的数据流
4. 确认序号 (Acknowledgment Number, ACK)
- 占32位,标识报文接收端期望接收的下一个字节序列号
- 仅当ACK控制位设置时有效
- 确认序号指向的是接收端下一个期望接收的数据包序列号
- 表示接收端已成功接收了序号小于确认序号的所有字节
这四个字段共同构成了TCP可靠传输的基础,确保了数据传输的有序性和可靠性。
举个例子,假设发送端(如Client)发送3个净荷为1000B、起始SN序号为1的数据包给服务端,服务端每收到一个包之后,需要回复一个ACK响应确认数据包给客户端。ACK响应数据包的ACK Number值为每个客户端包的SN+包净荷,除了表示服务端已经确认收到的字节数,还表示期望接收到的下一个客户端发送包的SN序号。具体的ACK值如图10-9左边的正常传输部分所示。
服务端第1个ACK包的ACK Number值为1001,是通过客户端第1个包的SN+包净荷(1+1000)计算得到,表示期望第2个客户端包的SN序号为1001;服务端第2个ACK包的ACK Number值为2001,为客户端第2个包的SN+包净荷(2000+1),表示期望第3个服务端包的SN为2001,以此类推。
如果发生错误,假设服务端在处理客户端的第二个发送包时发生异常,服务端仍然回复一个ACK Number值为1001的确认包,则客户端的第二个数据包需要重复发送,具体的ACK值如图右边的正常传输部分所示。
只有控制标志的ACK标志为1时,数据帧中的确认序号ACK Number才有效。TCP规定,连接建立后,所有发送报文的ACK必须为1,即建立连接后所有报文的确认序号有效。如果是SYN类型的报文,其ACK标志为0,故没有确认序号。
5.控制标志
控制标志(Control Bits)共6位,具体的标志位为URG、ACK、PSH、RST、SYN、FIN,如表所示
在连接建立的三次握手过程中,若只是单个SYN置位,则表示的是建立连接请求。如果SYN和ACK同时置位为1,就表示建立连接之后的响应。
5.窗口
长度为16位,共2字节,用来进行流量控制。流量控制的单位为字节数,这个值是本端期望一次接收的字节数。
总体来说,TCP的可靠性主要通过以下几点来保障:
① 应用数据分割成TCP认为最适合发送的数据块。这部分是通过MSS(最大数据包长度)选项来控制的,通常被称为一种协商机制。MSS规定了TCP传往另一端的最大数据块的长度。值得注意的是,MSS只能出现在SYN报文段中,若一方不接收来自另一方的MSS值,则MSS就定为536字节。一般MSS值越大越好,以提高网络的利用率。
② 重传机制。设置定时器,等待确认包,如果定时器超时还没有收到确认包,则报文重传。
③ 对首部和数据进行校验。
④ 接收端对收到的数据进行排序,然后交给应用层。
⑤ 接收端丢弃重复的数据。
⑥ 提供流量控制,主要是通过滑动窗口来实现的。
三次握手
TCP连接建立时,双方需要经过三次握手,具体过程如下:
第一次握手
Client进入SYN_SENT状态,发送一个SYN帧来主动打开传输通道,该帧的SYN标志位被设置为1,同时会带上Client分配好的SN序列号,该SN是根据时间产生的一个随机值,通常情况下每间隔4ms(毫秒)会加1。除此之外,SYN帧还会带一个MSS(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。
第二次握手
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(最大报文段长度)表示的是Server的最大数据块长度。
第三次握手
Client在收到Server的第二次握手SYN+ACK确认帧之后,首先将自己的状态从SYN_SENT变成ESTABLISHED,表示自己方向的连接通道已经建立成功,Client可以发送数据给Server了。然后,Client发ACK帧给Server,该ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment Number)值被设置为Server的SN+1。还有一种情况,Client可能会将ACK帧和第一帧要发送的数据合并到一起发送给Server。
Server在收到Client的ACK帧之后会从SYN_RCVD状态进入ESTABLISHED状态。至此,Server方向的通道连接建立成功。Server可以发送数据给Client, TCP的全双工连接建立完成。
Client和Server完成了三次握手后,双方就进入数据传输阶段。数据传输完成后,连接将断开。连接断开的过程需要经历四次挥手。
四次挥手
第一次挥手
主动断开方(可以是客户端,也可以是服务端),向对方发送一个FIN结束请求报文,此报文的FIN位被设置为1,并且正确设置Sequence Number(序列号)和Acknowledgment Number(确认号)。发送完成后,主动断开方进入FIN_WAIT_1状态,表示主动断开方没有业务数据要发送给对方,准备关闭Socket连接了。
第二次挥手
正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledgment Number(确认号)值为断开请求报文的Sequence Number(序列号)加1,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了CLOSE-WAIT(关闭等待)状态,TCP服务会通知高层的应用进程,对方向本地方向的连接已经关闭,已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接收。被动断开方的CLOSE-WAIT(关闭等待)还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
主动断开方在收到了ACK报文后,由FIN_WAIT_1转换成FIN_WAIT_2状态。
第三次挥手
在发送完成ACK报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送完成或者CLOSE-WAIT(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK结束响应报文,表示被动断开方的数据都发送完了,然后被动断开方进入LAST_ACK状态。
第四次挥手
主动断开方收到FIN+ACK断开响应报文后,还需要进行最后的确认,向被动断开方发送一个ACK确认报文,然后自己就进入TIME_WAIT状态,等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方在等待完成2MSL的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。被动断开方在收到主动断开方的最后ACK报文以后,最终关闭连接,什么也不用管了。
处于TIME_WAIT状态的主动断开方在等待2MSL时间后才真正关闭连接通道。2MSL翻译过来就是两倍的MSL。MSL(Maximum Segment Lifetime)指的是一个TCP报文片段在网络中的最大存活时间,2MSL就是一次消息来回(一个发送和一个回复)所需的最大时间。如果直到2MSL主动断开方都没有再一次收到对方的报文(如FIN报文),则可以推断ACK已经被对方成功接收。此时,主动断开方将最终结束自己的TCP连接。所以,TCP的TIME_WAIT状态也称为2MSL等待状态。
相关文章:
【计网】TCP 协议详解 与 常见面试题
三次握手、四次挥手的常见面试题 不用死记,只需要清楚三次握手,四次挥手的流程,回答的时候心里要记住,假设网络是不可靠的 问题(1):为什么关闭连接时需要四次挥手,而建立连接却只要三次握手? 关…...
Docker介绍
Docker介绍 Docker 本身并不是容器,而是一个使用容器的工具。容器是 Linux 内核提供的技术,Docker 只是将这种技术的使用简便化了。Docker 的主要目标是 “Build,Ship and Run Any APP,Anywhere”(“一次封装,到处运行”…...
大模型推理--Qwen2.5-Omni在A100上的初体验
过去的一周Qwen2.5-Omni产生了很高的热度,吸引了很多人的目光。它的多模态确实很吸引人,放出来的demo体验还算尚可(语音对话的延迟还是太大),所以就在A100 PCIe上实地部署了一下,初步对其速度进行了测试&am…...
二分查找例题
本篇基于b站灵茶山艾府。 34. 在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你…...
新增一种线性回归的增量学习框架,已更新31个模型!Matlab回归预测大合集又更新啦!
目录 效果图基本介绍程序设计参考资料 效果图 基本介绍 一种线性回归的增量学习框架,程序研究的主要内容是线性回归模型的增量学习实现及其在房价预测中的应用,旨在通过分块处理数据逐步更新模型,以适应动态数据环境并减少计算资源消耗。 详…...
P1025 [NOIP 2001 提高组] 数的划分(DFS)
题目描述 将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如:n7,k3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1. 问有多少种不同的分法。 输入格式 n,k …...
SQL Server存储过程和触发器的使用
存储过程 (1)创建存储过程,使用Employees表中的员工人数来初始化一个局部变量,并调用这个存储过程。 1. Create PROCEDURE test number1 int output --输出参数,可以从程序中返回信息 2. As 3. begin 4. D…...
Elastic 的 OpenTelemetry 分发版(EDOT)现已正式发布:开源、可用于生产环境的 OTel
作者:来自 Elastic Miguel Luna 及 Bahubali Shetti Elastic 自豪地宣布正式发布 Elastic OpenTelemetry 分发版(Elastic Distributions of OpenTelemetry - EDOT),其中包含 Elastic 自定义版本的 OpenTelemetry Collector 以及多…...
springMVC-Json交互处理
什么是JSON JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。 采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也…...
MySQL中的索引
explain关键字, MySQL索引特性 索引的概念 MySQL 索引是一种用于提高数据库查询效率的数据结构 数据库表中存储的数据都是以记录为单位的,如果在查询数据时直接一条条遍历表中的数据记录,那么查询的时间复杂度将会是 O ( N )。索引的价值在…...
AI小白:JavaPython开发环境双轨制搭建指南
文章目录 1 Python深度学习环境配置1.1 Anaconda生态体系建设1.2 JupyterLab高效工作流魔法命令与可视化调试扩展插件配置指南 2 Java深度学习方案:DL4J实战2.1 企业级部署架构设计2.2 集成传统Java系统Spring Boot微服务封装模型性能优化技巧 1 Python深度学习环境…...
《比特城的机密邮件:加密、签名与防篡改的守护之战》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:风暴前的密令 比特城的议会大厅内,首席长老艾德文握着一卷足有半人高的羊皮纸,眉头紧锁。纸上是即将颁布的《新纪元法典》——这份文件不仅内…...
Redis之布隆过滤器
面试场景切入 针对于电话号码问题的痛点 布隆过滤器是什么? 由一个初值都为0的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素。 设计思想 本质就是判断具体数据是否存在于一个大的集合中。布隆过滤器是一种类似Set的数据结构&#…...
这是一份简单优雅的Prompt Engineering教程
Prompt Engineering(提示工程)是通过精心设计输入文本(prompt)来引导大型语言模型(LLM)生成更准确、相关且符合预期的输出的技术。其核心在于通过调整提问的措辞、结构、上下文和附加信息,优化模…...
Java基础 4.6
1.成员方法练习 //编写类A:判断一个数是奇数还是偶数,返回boolean //根据行、列、字符打印对应行数和列数的字符,比如:行4 列4 字符# 则打印相应的效果 public class MethodExercise01 {public static void main(String[] args) …...
DApp实战篇:前端技术栈一览
前言 在前面一系列内容中,我们由浅入深地了解了DApp的组成,从本小节开始我将带领大家如何完成一个完整的DApp。 本小节则先从前端开始。 前端技术栈 在前端开发者速入:DApp中的前端要干些什么?文中我说过,即便是在…...
C++中如何比较两个字符串的大小--compare()函数实现
一、现在有一个问题描述:有两个字符串,要按照字典顺序比较它们的大小(注意所有的小写字母都大于所有的大写字母 )。 二、代码 #include <bits/stdc.h> using namespace std;int main() {string str1 "apple";…...
c++中的auto关键字
在 C 中,auto 是一个类型推断关键字(C11 引入),允许编译器根据变量的初始化表达式自动推导其类型。它极大地简化了代码编写,尤其在涉及复杂类型或模板的场景中。以下是 auto 的详细说明: 1. 基本用法 1.1 …...
zk源码—1.数据节点与Watcher机制及权限二
大纲 1.ZooKeeper的数据模型、节点类型与应用 (1)数据模型之树形结构 (2)节点类型与特性(持久 临时 顺序 ) (3)节点的状态结构(各种zxid 各种version) (4)节点的版本(version cversion aversion) (5)使用ZooKeeper实现锁(悲观锁 乐观锁) 2.发布订阅模式࿱…...
交换机和集线器的区别
集线器(Hub)—— 大喇叭广播站 工作原理: 集线器像村里的“大喇叭”,收到任何消息都会广播给所有人。 比如A对B说“你好”,全村人(C、D、E)都能听到,但只有B会回…...
微服务系统记录
记录下曾经工作涉及到微服务的相关知识。 1. 架构设计与服务划分 关键内容 领域驱动设计(DDD): 利用领域模型和限界上下文(Bounded Context)拆分业务,明确服务边界。通过事件风暴(Event Storm…...
同花顺客户端公司财报抓取分析
目标客户端下载地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要难点在登陆,获取token中的 jgbsessid (每次重新登录这个字段都会立即失效,且有效期应该是15天的) 抓取jgbsessid 主要通过安装mitmproxy 使用 mitmdump + 下边的脚本实现监听接口…...
二叉树与红黑树核心知识点及面试重点
二叉树与红黑树核心知识点及面试重点 一、二叉树 (Binary Tree) 1. 基础概念 定义:每个节点最多有两个子节点(左子节点和右子节点) 术语: 根节点:最顶层的节点 叶子节点:没有子节点的节点 深度…...
Rocket-JWT鉴权
目录 一、概述 二、相关依赖 三、环境准备 3.1 创建项目 3.2 读取私钥信息 3.3 token数据负载 3.4 生成token 四、Web鉴权 4.1 验证载体 4.2 接收请求 五、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rocket-JWT鉴权] ❤博主广交技术好友,喜…...
2025 年网络安全终极指南
我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权,而是所有用户的共同责任。通过简单的行动,我们可以保护我们的数据、隐私和财务,降低成为…...
横扫SQL面试——PV、UV问题
📊 横扫SQL面试:UV/PV问题 🌟 什么是UV/PV? 在数据领域,UV(Unique Visitor,独立访客) 和 PV(Page View,页面访问量) 是最基础也最重要的指标&…...
ctf-show-杂项签到题
下载文件,解压需要密码,用010打开没看出什么 然后用Advanced Archive Password Recovery暴力破解,发现没用 怀疑是伪解密,解压出来发现加密受损用随波逐流修复加密文件 打开修复的加密文件直接得flag flag:flag{79d…...
对解释器模式的理解
对解释器模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1096)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用解释器模式1、代码2、“缺点” 三、采用解释器模式1、代码2、“优点” 四、思考1、解释器模式的意义…...
高频面试题(含笔试高频算法整理)基本总结回顾64
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
python入门之从安装python及vscode开始
本篇将解决三个问题: 1. 如何下载及安装官方python? 2. 如何下载及安装vscode? 3. 如何配置vscode的python环境? 一、python下载及安装 1.搜索python,找到官网并打开 2.找到download,按需选择版本下载 …...
OpenGL学习笔记(模型材质、光照贴图)
目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页:https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…...
视觉_transform
visual_transform 图像分块 (Patch Embedding) 假设输入图像为 x ∈ R ∗ H ∗ ∗ W ∗ ∗ C ∗ x∈R^{*H**W**C*} x∈R∗H∗∗W∗∗C∗ C 是图像的通道数(例如,RGB图像的 C3) 将图像分割成N个大小为P*CP的patch,每个patch的大…...
Redis的安装及通用命令
二. Redis 的安装及通用命令 1. Ubuntu 安装 Redis (1) 切换到 root 用户: su root(2) 搜索 Redis 软件包 apt search redis(3) 安装 Redis apt install redis(4) 查看 Redis netstat -anp | grep redis(5) 切换到 Redis 目录下 cd /etc/redis/(6) 修改 Redis 配置文件:…...
Python 实现的运筹优化系统代码详解(0-1规划背包问题)
一、引言 在数学建模与实际决策场景的交织领域中,诸多复杂问题亟待高效且精准的解决方案。0-1 规划作为一种特殊且极为重要的优化方法,宛如一把万能钥匙,能够巧妙开启众多棘手问题的解决之门。它专注于处理决策变量仅能取 0 或 1 这两种极端状…...
护网蓝初面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
音视频学习(三十二):VP8和VP9
VP8 简介 全称:Video Processing 8发布者:原 On2 Technologies(2010 被 Google 收购)定位:开源视频压缩标准,主要竞争对手是 H.264应用: WebRTC 视频通信HTML5 <video> 标签(…...
美国mlb与韩国mlb的关系·棒球9号位
MLB(Major League Baseball,美国职业棒球大联盟)作为全球最高水平的职业棒球联赛,与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系,但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景:…...
免费在线PUA测试工具:识别情感操控,守护情感健康
免费在线PUA测试工具:识别情感操控,守护情感健康 你是否曾经在感情中感到困惑、不安,甚至怀疑自己?今天为大家推荐一个专业的PUA测试工具,帮助你识别是否正在经历情感操控。 测试工具链接:PUA测试工具 什么…...
nginx中的try_files指令
try_files 是 Nginx 中一个非常有用的指令,用于按顺序检查文件是否存在,并返回第一个找到的文件。如果所有指定的文件都不存在,则执行回退逻辑,如重定向到一个指定的 URI 或返回一个错误代码。 作用 文件查找:按顺序检…...
[特殊字符] 驱动开发硬核特训 · Day 4
主题:从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析 I2C(Inter-Integrated Circuit)总线是一种广泛用于嵌入式设备的串行通信协议,因其低成本、简单布线和多从设备支持,成为连接各种传感器(温…...
Python 实现玻璃期货数据处理、入库与分析:从代码到应用
Python 实现期货数据处理与分析:从代码到应用 引言 在金融市场中,期货数据的处理和分析对于投资者和分析师来说至关重要。Python 凭借其丰富的库和简洁的语法,成为了处理和分析期货数据的强大工具。本文将详细解读一段用于处理期货持仓和行…...
神经网络之损失函数
引言:损失函数 (Loss Function)是机器学习和深度学习中非常重要的一个概念。用于衡量模型的预测值与真实值之间的差异,从而指导模型优化其参数以最小化这种差异。 一、损失函数作用 量化误差:损失函数是将预测值和真实…...
在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)
一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…...
printf
printf() 是 C 和 C 标准库中的一个输出函数,位于 <cstdio> 头文件中。下面为你详细介绍它的相关知识点。 1. 基本使用 printf() 函数的作用是按照指定格式将数据输出到标准输出设备(通常是控制台)。其基本语法如下: cpp …...
Leetcode 311 Sparse Matrix Multiplication 稀疏矩阵相乘
Problem Given two sparse matrices A and B, return the result of AB. You may assume that A’s column number is equal to B’s row number. Example: A [[ 1, 0, 0],[-1, 0, 3] ]B [[ 7, 0, 0 ],[ 0, 0, 0 ],[ 0, 0, 1 ] ]| 1 0 0 | | 7 0 0 | | 7 0 0 | AB …...
mysql和sqlite关于data数据的识别问题
<input type"date" name"birthday" value""> # 表单传入的日期 birthday request.form.get(birthday) # 获取日期 birthday Column(birthday, Date, comment出生日期, nullableTrue) # 数据库的数据字段模型 birthday_str request…...
2024 天梯赛——工业园区建设题解
思路 将点 i i i 视为固定点, 点 j j j 视为灵活点,其中 s i 1 s_{i} 1 si1, s j 0 s_{j} 0 sj0。维护四个队列,其中 q 0 q_{0} q0 和 q 1 q_{1} q1 分别维护还没有被选用的固定点 和 灵活点, Q 0 Q…...
亚马逊AI新功能上线:5大亮点解锁精准消费预测
在人工智能技术不断重塑跨境电商生态之际,全球电商巨头亚马逊(Amazon)再次迈出关键一步。近日,亚马逊正式对其卖家中心推出一系列基于AI的新功能,聚焦于消费数据预测、用户行为洞察、库存智能管理与个性化营销服务等方…...
opus+ffmpeg+c++实现录音
说明: opusffmpegc实现录音 效果图: step1:C:\Users\wangrusheng\source\repos\WindowsProject1\WindowsProject1\WindowsProject1.cpp // WindowsProject1.cpp : 定义应用程序的入口点。 //#include "framework.h" #include "Windows…...
ComfyUI的本地私有化部署使用Stable Diffusion文生图
什么是ComfyUI ? ComfyUI是一个基于节点流程的Stable Diffusion操作界面。以下是关于它的详细介绍: 特点与优势 高度可定制:提供丰富的节点类型,涵盖文本处理、图像处理、模型推理等功能。用户可根据需求自由组合节点࿰…...