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

TCP 序列和确认号说明 | seq 和 ack 号计算方法

注:本文为 “TCP 序列” 相关文章合辑

英文引文机翻未校。


TCP Sequence and Acknowledgement Numbers Explained

TCP 序列和确认编号说明

TCP Sequence (seq) and Acknowledgement (ack) numbers help enable ordered reliable data transfer for TCP streams. The seq number is sent by the TCP client, indicating how much data has been sent for the session (also known as the byte-order number). The ack number is sent by the TCP server, indicating that is has received cumulated data and is ready for the next segment.

TCP 序列 (seq) 和确认 (ack) 编号有助于为 TCP 流实现有序可靠的数据传输。seq 编号由 TCP 客户端发送,指示已为会话发送的数据量(也称为字节顺序号)。ack 编号由 TCP 服务器发送,表示已收到累积数据,并已准备好进行下一段。

The TCP seq and ack numbers are coordinated with one another and are key values during the TCP handshake, TCP close, and, of course, while data is transferred between the client and server.

TCP seq 和 ack 编号相互协调,是 TCP 握手、TCP 关闭期间的关键值,当然,在客户端和服务器之间传输数据时也是如此。

[By default, Wireshark converts all sequence and acknowledgement numbers into relative numbers. This means that all SEQ and ACK numbers always start at 0 for the first packet seen in each conversation.]

[默认情况下,Wireshark 将所有序列和确认编号转换为相对编号。这意味着对于每个会话中看到的第一个数据包,所有 SEQ 和 ACK 编号始终从 0 开始。

The picture below shows a real example of TCP sequence and acknowledgment numbers in a TCP flow diagram. The key variable is the TCP segment length for each TCP segment sent in the session.
下图显示了 TCP 流程图中 TCP 序列和确认编号的真实示例。key 变量是会话中发送的每个 TCP 分段的 TCP 分段长度。

img

The client sends the first segment with seq=1 and the length of the segment is 669 bytes. The server responds with an ack=670 which tells the client that the next expected segment will have a sequence number is 670.
客户端发送 seq=1 的第一个分段,该分段的长度为 669 字节。服务器以 ack=670 响应,这告诉客户端下一个预期的 segment 将具有 670 的序列号。

The next segment the client sends has seq=670 and the len is now 1460 bytes. In turn, the server responds with ack=2130 (670 + 1460). This cycle continues until the end of the TCP session.
客户端发送的下一个分段具有 seq=670,len 现在是 1460 字节。反过来,服务器以 ack=2130 (670 + 1460) 响应。此循环将持续到 TCP 会话结束。

Again, note that the length value is from the TCP segment length, not the Layer 2 frame length nor the IP packet length.
同样,请注意,length 值来自 TCP 分段长度,而不是第 2 层帧长度或 IP 数据包长度。

Seq and Ack in Wireshark

Wireshark 中的 Seq 和 Ack

Client sends seq=1 and tcp segment length=669

客户端发送 seq=1 且 tcp 段长度 = 669

img

Server responds with ack=670

服务器响应 ack=670

img

Client sends segment with seq=670 and length=1460

客户端发送 seq=670 且 length=1460 的 segment

img

Server responds with ack=2130
服务器响应 ack=2130

img

This is just a simple example to get the basics of TCP sequence and acknowledgement numbers.
这只是一个获取 TCP 序列和确认编号基础知识的简单示例。


TCP 包的 seq 和 ack 号计算方法

huaishu 已于 2022-04-26 10:37:16 修改

img

序号(seq) 用来标识从 TCP 发端向 TCP 收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用序号对每个字节进行计数。序号是 32bit 的无符号数,序号到达 2 32 - 1 2^{32}-1 2321 后又从 0 开始。

当建立一个新的连接时,SYN 标志变 1。序号字段包含由这个主机选择的该连接的初始序号 ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个 ISN 加 1,因为 SYN 标志消耗了一个序号。既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号(ack) 应当是上次已成功收到数据字节序号加 1。只有 ACK 标志(下面介绍)为 1 时确认序号字段才有效。

发送 ACK 无需任何代价,因为 32bit 的确认序号字段和 ACK 标志一样,总是 TCP 首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK 标志也总是被设置为 1。

TCP 为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。

  • sequence number:表示的是我方(发送方)这边,这个 packet 的数据部分的第一位应该在整个 data stream 中所在的位置。(注意这里使用的是 “应该”。因为对于没有数据的传输,如 ACK,虽然它有一个 seq,但是这次传输在整个 data stream 中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送 ACK 的数据包的 seq 开始)
  • acknowledge number:表示的是期望的对方(接收方)的下一次 sequence number 是多少。
  • 注意,SYN/FIN 的传输虽然没有 data,但是会让下一次传输的 packet seq 增加 1,但是,ACK 的传输,不会让下一次的传输 packet 加 1。

三次握手过程

TCP 连接的建立是通过三次握手来实现的

序号方向seqackSYNACK
1A->B10000 (ISN)010
2A<-B20000 (ISN)10000+1=1000111
3A->B10000120000+1=2000101

解释:

1:(A) –> [SYN] –> (B)

A 向 B 发起连接请求,以一个随机数初始化 A 的 seq, 这里假设为 10000,此时 ACK=0

2:(A) <– [SYN/ACK] <–(B)

B 收到 A 的连接请求后,也以一个随机数初始化 B 的 seq,这里假设为 20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B 的 ACK 是 A 的 seq 加 1,即 10000+1=10001

3:(A) –> [ACK] –> (B)
A 收到 B 的回复后,它的 seq 是它的上个请求的 seq 加 1,即 10000+1=100001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A 此时的 ACK 是 B 的 seq 加 1,即 20000+1=20001

数据传输过程

序号方向seqack数据长度数据包长度
23A->B400007000014601514
24A<-B7000040000+1514-54=41460054
25A->B4146070000+54-54=7000014601514
26A<-B7000041460+1514-54=42920054

解释

23:B 接收到 A 发来的 seq=40000,ack=70000,size=1514 的数据包

24:于是 B 向 A 也发一个数据包,告诉 A,你的上个包我收到了。A 的 seq 就以它收到的数据包的 ack 填充,ack 是它收到的数据包的 seq 加上数据包的大小 (不包括:以太网协议头 = 14 字节,IP 头 = 20 字节,TCP 头 = 20 字节),以证实 B 发过来的数据全收到了。

25:A 在收到 B 发过来的 ack 为 41460 的数据包时,一看到 41460,正好是它的上个数据包的 seq 加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给 B。

26:B->A 这个正在发送的数据包的 seq 也以它收到的数据包的 ack 填充,ack 就以它收到的数据包的 seq (70000) 加上包的 size (54) 填充,即 ack=70000+54-54 (全是头长,没数据项)。通过 tcpdump 发现确认包 ack,确认传输过程中最后字节长度。

减去 54 的原因 ,以太网封装格式(链路层使用的是 Ethernet II 格式,这个格式有 14 字节以太网首部 + 4 字节以太网尾部):
应用数据 = size-14-20-20=size-54。(假设 IP 首部和 TCP 首部都没有可选选项)
 
为什么不减去以太网尾部的 4 字节呢?
 
因为在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行 CRC 检验,如果帧校验和错,就丢弃此帧。
 
如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交 “设备驱动程序” 做进一步处理。
 
这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS 之外的数据。

四次挥手过程

序号方向seqackFINACK
1A->B800009000011
2A<-B9000080000+1=8000101
3A<-B900008000111
4A->B8000190000+1=9000101

1:(A) –> [FIN/ACK] –> (B)

客户端 A 没有要发送给服务端 B 的数据了,想要关闭链接,则发送一个 FIN=1,ACK=1 的包,告诉 B 可以关闭连接了,我没有什么数据要给你了。

2:(A) <– [ACK] <– (B)

然后 B 会发送 ACK=1 的包给 A,告诉 A 我知道你没有什么想给我的了,但是我还有数据要给你,你先等下,我先不想 FINISH 呢。

3:(A) <– [FIN/ACK] <– (B)

等 B 把数据都发送给 A 之后,B 会再次发送一个包,这次 FIN=1,表示我这边也想关闭了,咱俩一起关把。在 2 和 3 之间,可能还会有很多 B->A 的传递,ack 均为 80001。

4:(A) –> [ACK] –> (B)

然后 A 回应一个 ACK,表示我知道了,一起关吧。B 收到这个 ACK 后,就会 CLOSE。但是实际上 A 不会直接 CLOSE,还会进入一个等待时间状态 TIME_WAIT,持续 2 倍的 MSL(Maximum Segment Lifetime,报文段在网络上能存活的最大时间)。过了这个状态,才会 CLOSE。

为什么要等待一段时间?原因有二:

(1)保证 TCP 的全双工连接能够可靠关闭

假如 A 发送的最后一次 ACK 丢包了,没有被 B 收到,那 B 超时之后,会再次发送一个 FIN 包,然后这个包被处于 TIME_WAIT 状态的 A 收到,A 会再次发送一个 ACK 包,并重新开始计时,一直循环这个过程,直到 A 在 TIME_WAIT 的整个过程中都没有收到 B 发过来的 FIN 包,这说明 B 已经收到了 A 的 ACK 包并 CLOSE 了,因此 A 这时候才可以安心 CLOSE。如果 A 没有 TIME_WAIT 状态而是直接 close,那么当 ACK 丢包之后,B 会再次发送一个 FIN 包,但是这个包不会被 A 回应,因此 B 最终会收到 RST,误以为是连接错误,不符合可靠连接的要求。因此需要等待 ACK 报文到达 B+BRST 是 TCP 数据报中 6 个控制位之一,6 个控制位的作用如下:

URG 紧急:当 URG=1 时,它告诉系统此报文中有紧急数据,应优先传送 (比如紧急关闭),这要与紧急指针字段配合使用。

ACK 确认:仅当 ACK=1 时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。

PSH 推送:若 TCP 连接的一端希望另一端立即响应,PSH 字段便可以 “催促” 对方,不再等到缓存区填满才发送。

RST 复位:若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。

SYN 同步:用于建立和释放连接,稍后会详细介绍。

FIN 终止:用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放 TCP 连接。

(2)保证这次连接的重复数据段从网络中消失

如果 A 直接 close 了,然后向 B 发起了一个新的 TCP 连接,可能两个连接的端口号相同。一般不会有什么问题,但是如果旧的连接有一些数据堵塞了,没有达到 B 呢,新的握手连接就已经到 B 了,那么这时,由于区分不同 TCP 连接是依据套接字,因此 B 会将这批迟到的数据认为是新的连接的数据,导致数据混乱(源 IP 地址和目的 IP 地址以及源端口号和目的端口号的组合称为 套接字,新旧连接的套接字很有可能相同)如果我们终止一个客户程序,并立即重新启动这个客户程序,则这个新客户程序将不能重用相同的本地端口。服务端处于被动关闭,不会出现该状态。

总结:

通常 TCP 在接收到数据时并不立即发送 ACK;相反,它推迟发送,以便将 ACK 与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带 ACK)。

挥手关闭过程中,处于半关闭状态,被动关闭状态传输的数据 ack 都是一致的。

类型握手 (SYN) 或终止 (FIN)传输数据包为 0
seq (自己发送)上次发送 seq+1上次发送 seq + 数据长度上次发送 seq
ack (接收对方)上次接收 seq+1上次接收 seq + 数据长度上次接收 seq

实战列表:

img

4、 seq:上一次发送时为【1】,【1】中 seq 为 0 且为 SYN 数据包,所以这一次的 seq 为 1(0 增加 1)。
ack:上次接收到时为【2】,【2】中 seq 为 0,且为 SYN 数据包,所以可预计,server 端下一次 seq 为 1(0 增加
1)。
 
5、 seq:上一次发送时为【2】,【2】中 seq 为 0,且为 SYN 数据包,所以这一次的 seq 为 1(0 增加 1)。
ack:上一次接收时为【4】,【4】中的 seq 为 1,数据包的长度为 725,所以可以预计,下一次 client 端的 seq 为
726(1+725)。
 
6、 seq:上一次发送时为【5】,【5】中 seq 为 1,但【5】为 ACK 数据包,所以数据长度为 0 且不会驱使 seq 加
1,所以这一次的 seq 为 1(1+0)。 ack:上一次接收时为【4】,【4】中的 seq 为 1,数据包的长度为
725,所以可以预计,下一次 client 端的 seq 为 726(1+725)。


为什么三次握手的时候 ack=seq+1

oldfish_C 于 2020-03-27 21:40:17 发布

估计很多人都知道三次握手和四次挥手的过程,但这其中有一个问题困扰了我一会(其实是 TM 很久)

按照定义,seq 是要发送的第一个字节的序号,ack 等于他收到的 seq 序列号加上字节流数据的长度,他代表期望收到的下一个字节的序号,同时他也代表这个序号前的字节我都已经收到了。

那么为什么三次握手过程中,比如第一次握手,A 向 B 发了 seq=x,B 给 A 回的 ack 是 = x+1 呢?如果有数据的话,那理应等于 x+LEN,

如果没有数据,那就应该保持不动就等于 x 才对。

答案是在三次握手过程中:

The server responds to the client with a sequence number of zero, as this is its first packet in this TCP session, and a relative acknowledgement number of 1. The acknowledgement number is set to 1 to indicate the receipt of the client’s SYN flag in packet #1.
 
Notice that the acknowledgement number has been increased by 1 although no payload data has yet been sent by the client. This is because the presence of the SYN or FIN flag in a received packet triggers an increase of 1 in the sequence. (This does not interfere with the accounting of payload data, because packets with the SYN or FIN flag set do not carry a payload.)

服务器端回复的这个 + 1,是代表他收到了 SYN 标示。

也就是说由于 SYN 或者 FIN 的存在,即使没有数据传输,但服务器端仍然需要通过 + 1 来回应一句 “我收到了”。因此握手过程中 seq=x 的话,ack = x+1。其他几次握手挥手也是同样道理。

P.S:SYN 和 FIN 这种标示只占 1bit

附上参考的文章

  • 网络 | 对ACK一点疑惑 | Aryb1n’s notebook
    https://aryb1n.github.io/2018/05/03/网络-对ACK一点疑惑/

  • “三次握手,四次挥手”你真的懂吗? - 知乎 Stefno 编辑于 2020-08-21 17:37
    https://zhuanlan.zhihu.com/p/53374516


via:

  • TCP Sequence and Acknowledgement Numbers Explained – MadPackets
    https://madpackets.com/2018/04/25/tcp-sequence-and-acknowledgement-numbers-explained/

  • TCP 包的 seq 和 ack 号计算方法_tcp seq-CSDN 博客 huaishu 已于 2022-04-26 10:37:16 修改
    https://blog.csdn.net/huaishu/article/details/93739446

  • TCP 协议中的 seq/ack 序号是如何变化的? - 简书
    https://www.jianshu.com/p/15754b4e9458

  • TCP 的 seq 和 ack 号计算方法_HappyRocking 的博客 - CSDN 博客_ack 号是怎么计算的
    https://blog.csdn.net/happyrocking/article/details/78198776

  • 使用 tcpdump 分析 TCP 三次握手与四次挥手_huaishu 的博客 - CSDN 博客
    https://blog.csdn.net/huaishu/article/details/71475007

  • 为什么三次握手的时候 ack=seq+1_为什么三次握手,返回时,ack 值是 seq 加 1 (ack = x+1)-CSDN 博客 oldfish_C
    于 2020-03-27 21:40:17 发布

    https://blog.csdn.net/oldfish_C/article/details/105150516

  • 网络 | 对ACK一点疑惑 | Aryb1n’s notebook
    https://aryb1n.github.io/2018/05/03/网络-对ACK一点疑惑/

  • “三次握手,四次挥手”你真的懂吗? - 知乎 Stefno 编辑于 2020-08-21 17:37
    https://zhuanlan.zhihu.com/p/53374516

相关文章:

TCP 序列和确认号说明 | seq 和 ack 号计算方法

注&#xff1a;本文为 “TCP 序列” 相关文章合辑。 英文引文机翻未校。 TCP Sequence and Acknowledgement Numbers Explained TCP 序列和确认编号说明 TCP Sequence (seq) and Acknowledgement (ack) numbers help enable ordered reliable data transfer for TCP streams…...

【Linux】Mysql部署步骤

一、JDK安装配置 在home目录下执行命令&#xff1a;mkdir Jdk 1.将JDK 上传至该文件夹&#xff0c;有些终端工具可以直接上传文件&#xff0c;比如&#xff1a;MobaXterm 可以看到安装包已经上传上来了 2.直接安装 命令&#xff1a;rpm -ivh jdk-8u311-linux-x64.rpm 3.安装成…...

【算法】枚举

枚举 普通枚举1.铺地毯2.回文日期3.扫雷 二进制枚举1.子集2.费解的开关3.Even Parity 顾名思义&#xff0c;就是把所有情况全都罗列出来&#xff0c;然后找出符合题目要求的那一个。因此&#xff0c;枚举是一种纯暴力的算法。一般情况下&#xff0c;枚举策略都是会超时的。此时…...

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…...

力扣刷题汇总

动态规划 1 . 最大子序和 (Maximum Subarray Sum) Leetcode 53. 最大子数组和 经典dp 问题描述&#xff1a;给定一个整数数组&#xff0c;求其中和最大的连续子数组的和。 状态定义&#xff1a;dp[i] 表示以第 i 个元素结尾的最大子序和。 2 . 最长公共子序列 (Longest Commo…...

Ansible自动化运维:基础与实践

在当今的IT运维领域&#xff0c;Ansible作为一款强大的自动化运维工具&#xff0c;正发挥着日益重要的作用。本文将详细介绍Ansible的相关知识&#xff0c;包括其作用、特点、安装配置以及常用模块的使用方法&#xff0c;旨在帮助读者快速上手并熟练运用Ansible进行自动化运维工…...

微信小程序在使用页面栈保存页面信息时,如何避免数据丢失?

微信小程序在使用页面栈保存页面信息时避免数据丢失的方法&#xff1a; 一、使用全局变量存储关键数据&#xff1a; 定义一个全局变量&#xff0c;例如在 app.js 中&#xff0c;用于存储页面的重要信息。在页面的 onHide 或 onUnload 生命周期中&#xff0c;将需要保存的数据…...

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到&#xff0c;2024 年我国全年新增通航企业 145 家、通用机场 26 个&#xff0c;颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架&#xff0c;无人机运营单位总数超过 2 万家&#xff0c;累计完成无人机飞行 2666 万小时&#x…...

vue3+vite+ts+router4+Pinia+Axios+sass 从0到1搭建

1、使用vite构建项目 npm create vitelatest 填写项目名的时候不能大写 2、跑起来之后配置下 import { defineConfig } from vite import vue from vitejs/plugin-vue import { resolve } from path // https://vite.dev/config/ export default defineConfig({plugins: [vue…...

C语言:-三子棋游戏代码:分支-循环-数组-函数集合

思路分析&#xff1a; 1、写菜单 2、菜单之后进入游戏的操作 3、写函数 实现游戏 3.1、初始化棋盘函数&#xff0c;使数组元素都为空格 3.2、打印棋盘 棋盘的大概样子 3.3、玩家出棋 3.3.1、限制玩家要下的坐标位置 3.3.2、判断玩家要下的位置是否由棋子 3.4、电脑出棋 3.4.1、…...

前端调试遇到的无限debugger的原理与绕过

背景 debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字,只要遇到它,JavaScript 的执行便会在此处中断,进入调试模式。有了 debugger 这个关键字,我们就可以非常方便地对 JavaScript 代码进行调试,比如使用 JavaScript Hook 时,我们可以加入 debugger 关键字…...

Java负载均衡

Java中的负载均衡原理是指通过合理分配网络请求或计算任务的方式&#xff0c;将工作负载分配到多个服务器、处理单元或服务实例上&#xff0c;从而提高系统的性能、可扩展性和可用性。负载均衡不仅可以分散请求压力&#xff0c;还能增强系统的容错能力&#xff0c;避免单点故障…...

spark,读取和写入同一张表问题

读取a表&#xff0c;写入a表 1.写入的是分区表&#xff0c;不报错 2.读取上来之后&#xff0c;创建为临时视图temp&#xff0c;然后先写入a表&#xff0c;再使用temp&#xff0c;就会报错 解决办法&#xff1a;可以先使用temp&#xff0c;再写入a表 3.写入的不是分区表&…...

用gpg和sha256验证ubuntu.iso

链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说&#xff0c;命令的各个部分含义如下&#xff1a; …...

HIVE技术

本文章基于黑马免费资料编写。 hive介绍 简介 hive架构 hive需要启动的配置 执行元数据库初始化命令 使用hive必须启动的服务 ./schematool -initSchema -dbType mysql -verbos启动 Hive 创建一个 hive 的日志文件夹 mkdir /export/server/hive/logs启动元数据管理服务 n…...

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…...

GPU 硬件原理架构(一)

这张费米管线架构图能看懂了&#xff0c;整个GPU的架构基本就熟了。市面上有很多GPU厂家&#xff0c;他们产品的架构各不相同&#xff0c;但是核心往往差不多&#xff0c;整明白一了个基本上就可以触类旁通了。下面这张图信息量很大&#xff0c;可以结合博客GPU 英伟达GPU架构回…...

[Qt]窗口-QMainWindow类-QMenuBar、QToolBar、QStatusBar、QDockWidget控件

目录 1.QMainWindow类介绍 2.菜单栏-QMenuBar控件 创建菜单栏 添加菜单和菜单选项 triggered信号 设置快捷键 添加分割线 添加图标 使用案例 3.工具栏-QToolBar控件 使用介绍 设置停靠位置 设置浮动属性 设置移动属性 使用案例 4.状态栏-QStatusBar控件 状…...

Linux命令行工具-使用方法

参考资料 Linux网络命令&#xff1a;网络工具socat详解-CSDN博客 arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别_aarch64-elf-gcc aarch64-linux-gnu-CSDN博客 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 热爱学习地派大星-CS…...

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…...

ASP.NET Core WebApi接口IP限流实践技术指南

在当今的Web开发中&#xff0c;接口的安全性和稳定性至关重要。面对恶意请求或频繁访问&#xff0c;我们需要采取有效的措施来保护我们的WebApi接口。IP限流是一种常见的技术手段&#xff0c;通过对来自同一IP地址的请求进行频率控制&#xff0c;可以有效地防止恶意攻击和过度消…...

SparkSQL数据模型综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序&#xff0c;查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…...

C++实现设计模式---外观模式 (Facade)

外观模式 (Facade) 外观模式 是一种结构型设计模式&#xff0c;为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口&#xff0c;使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口&#xff0c;屏蔽子系统的内部细节。 …...

计算机网络 (43)万维网WWW

前言 万维网&#xff08;World Wide Web&#xff0c;WWW&#xff09;是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义&#xff1a;万维网是一个分布式、联机式的信息存储空间&#xff0c;通过超文本链接的方式将分散的信息…...

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中&#xff0c;字体的选择和使用对最终作品的质量有着重要影响。然而&#xff0c;有时我们可能会遇到包含未知字体的PDF文件&#xff0c;这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题&#xff0c;让我们能够更好地处理这些文件。…...

Docker Desktop 中安装 MySQL 并开启远程访问的详细教程

是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程&#xff1a; 一、安装 MySQL 容器 拉取 MySQL 镜像&#xff1a; docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL&#xff0c;可以将 latest 替换为具体…...

沸点 | 聚焦嬴图Cloud V2.1:具备水平可扩展性+深度计算的云原生嬴图动力站!

近日&#xff0c;嬴图正式推出嬴图Cloud V2.1&#xff0c;此次发布专注于提供无与伦比的用户体验&#xff0c;包括具有水平可扩展性的嬴图Powerhouse的一键部署、具有灵活定制功能的管理控制台、VPC / 专用链接等&#xff0c;旨在满足用户不断变化需求的各项前沿功能&#xff0…...

西门子【Library of Basic Controls (LBC)基本控制库”(LBC) 提供基本控制功能】

AF架构中使用的库 文章目录 Table of contents Legal information ..............................................................................................................................2 1 Introduction ................................................…...

EMQX集群搭建

集群搭建 通过使用 EMQX 集群&#xff0c;您可以在一个或多个节点发生故障时仍然保持集群运行&#xff0c;从而享受到容错和高可用性的好处。 尽管没有严格的上限&#xff0c;但建议在 EMQX 开源版中将集群大小限制为三个节点。仅使用核心类型节点时&#xff0c;较小的集群规模…...

【Flink系列】10. Flink SQL

10. Flink SQL Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08…...

Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入

前言 之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理&#xff0c;那么今天我们就讲一下利用以及发现。 这里推荐两个专门研究java漏洞的靶场&#xff0c;本次也是根据这两个靶场来分析代码&#xff0c;两个靶场都是差不多的。 https://github.com/bewhale/JavaSec …...

TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG

注&#xff1a;本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态&#xff1a;SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层&#xff0c;有个 FLAGS 字段&#xff0c;这个字段有…...

OSPF的LSA的学习研究

OSPF常见1、2、3、4、5、7类LSA的研究 1、拓扑如图&#xff0c;按照地址表配置&#xff0c;激活OSPF划分相关区域并宣告相关网段 2、1类LSA&#xff0c;每台运行了OSPF的路由器都会产生&#xff0c;描述了路由器的直连接口状况和cost 可以看到R1产生了一条router lsa&#xff0…...

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里&#xff0c;阿杰正在他那充满科技感的实验室里&#xff0c;对着一堆奇奇怪怪的仪器发呆。突然&#xff0c;手机铃声如一道凌厉的剑气划破寂静&#xff0c;原来是工厂的赵厂长打来的紧急电话&#xff1a;“阿杰啊&#xff0c;咱们工厂新…...

wireshark 网络分析工具

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一、网络截获数据包的基础1、以太网…...

XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展

在当今企业数字化转型加速的时代背景下&#xff0c;任务调度在保障系统高效运行方面的关键作用日益凸显。XXL-JOB 正式加入 GitCode&#xff0c;成为 G-Star 优秀毕业项目&#xff0c;为分布式任务调度领域带来了新的契机与活力&#xff0c;助力企业应对复杂多变的业务需求。 X…...

Java Web开发进阶——WebSocket与实时通信

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;广泛应用于需要实时数据交换的应用程序中。它能够实现服务器与客户端之间的双向通信&#xff0c;避免了传统 HTTP 请求/响应的延迟。结合 Spring Boot&#xff0c;开发实时通信应用变得更加高效与简便。 1. …...

解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题

解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题 问题描述 本人在使用zotero中的zotero one&#xff08;青柠学术插件&#xff09;的时候&#xff0c;使用插件跳转obsidian中的对应笔记&#xff0c;出现上图情况。&#xff08;错误中提到的…...

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

分布式数据存储基础与HDFS操作实践(副本)

以下为作者本人撰写的报告&#xff0c;步骤略有繁琐&#xff0c;不建议作为参考内容&#xff0c;可以适当浏览&#xff0c;进一步理解。 一、实验目的 1、理解分布式文件系统的基本概念和工作原理。 2、掌握Hadoop分布式文件系统&#xff08;HDFS&#xff09;的基本操作。 …...

Rust:指针 `*T` 和引用 `T`的区别

在 Rust 编程语言中&#xff0c;*T 和 &T 是两种不同类型的指针&#xff0c;它们各自代表了不同的内存访问方式和所有权模型。 *T&#xff08;原始指针或裸指针&#xff09;&#xff1a; *T 是一个原始指针&#xff08;也称为裸指针或裸引用&#xff09;&#xff0c;它可以…...

【2025最新版】PCL点云处理算法汇总(C++长期更新版)

博客长期更新&#xff0c;最近一次更新时间为&#xff1a;2025年1月17日。 pcl::copyPointCloud(*cloud, indicesY, *cloud_yboundary);目录 配库常用数据免费下载链接一、点云滤波1、常用滤波器2、采样滤波3、裁剪滤波 二、KD树与八叉树1、KD树2、八叉树 三、点云配准粗配准精…...

换了城市ip属地会变吗?为什么换了城市IP属地不变

当我们跨越城市的界限&#xff0c;从一个地方迁移到另一个地方时&#xff0c;许多日常使用的网络服务和应用程序都会感知到这种变化&#xff0c;其中一个显著的现象就是IP属地的变化。IP属地&#xff0c;即IP地址所在的地理位置信息&#xff0c;它通常与互联网服务提供商&#…...

mysql 如何快速删除表数据

在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…...

Windows安装Jenkins——及修改主目录、配置简体中文、修改插件源

一、简介 Jenkinshttps://www.jenkins.io/zh/ Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 二、Windows安装配置Jenkins2.479 2.1、J...

【机器学习:二十二、机器学习项目开发的技巧】

机器学习项目开发的技巧 机器学习项目的开发不仅仅依赖于算法的选择和模型的调优&#xff0c;还需要良好的项目管理技巧和方法论。以下是机器学习项目开发中的关键技巧&#xff1a; 明确需求&#xff1a;在项目启动之前&#xff0c;明确问题定义和业务目标。例如&#xff0c;…...

用python实战excel和word自动化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现excel和word自动化--批量处理 前言--需求快要期末了需要&#xff0c;提交一个年级的学生成绩数据&#xff0c;也就是几百份。当前我们收集了一份excel表格&#xf…...

Conda的一些常用命令

以下是Conda的一些常用命令&#xff1a; pip freeze > requirements.txt pip install -r requirements.txt 基本信息查看类 查看conda版本&#xff1a; conda -V 或 conda --version 可以查看当前安装的conda版本。 查看conda帮助信息&#xff1a; conda -h 或 conda --he…...

ESP8266 AP模式 网页配网 arduino ide

ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过. 查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式 // 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据&#…...

《AI与鸿蒙Next:建筑设计可视化的革新力量》

在建筑设计领域&#xff0c;可视化对于呈现设计理念、与客户沟通以及指导施工等环节都至关重要。人工智能与鸿蒙Next图形渲染技术的发展&#xff0c;为建筑设计可视化带来了前所未有的变革与机遇。 人工智能在建筑设计可视化中的作用 快速生成设计方案&#xff1a;人工智能可以…...