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

TCP 传输控制协议——详细

目录

 1 TCP 

1.1 TCP 最主要的特点

1.2 TCP 的连接

TCP 连接,IP 地址,套接字

1.3 可靠传输的工作原理

1.3.1 停止等待协议

(1)无差错情况

(2)出现差错

(3)确认丢失和确认迟到

(4)信道利用率

停止等待协议要点

1.3.2 连续 ARQ 协议

1.4 TCP 报文段的首部格式

1.5 TCP 可靠传输的实现

1.5.1 以字节为单位的滑动窗口

1.5.2 超时重传时间的选择

1.5.3 选择确认 SACK

1.6 TCP 的流量控制

1.6.1 利用滑动窗口实现流量控制

1.7 TCP 的拥塞控制

1.7.1 TCP 的拥塞控制方法

1.8 TCP 的运输连接管理

1.8.1 TCP 的连接建立——三次握手

1.8.2 TCP 的连接释放——四次挥手

1.9 TCP 的有限状态机


 1 TCP 

1.1 TCP 最主要的特点

1.TCP 是面向连接的运输层协议。

2.每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)。

3.TCP 提供可靠交付的服务。

4.TCP 提供全双工通信。

5.面向字节流

        ·TCP 中的“流”(stream) 指的是流入或流出进程的字节序列

        ·面向字节流:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流

TCP 面向流的概念:

        ·TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。

        ·但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样

1.2 TCP 的连接

·TCP 把连接作为最基本的抽象

套接字 (socket):

TCP 连接,IP 地址,套接字

·TCP 连接就是由协议软件所提供的一种抽象

·TCP 连接的端点是抽象的套接字,即(IP 地址:端口号)。

·同一个 IP 地址可以有多个不同的 TCP 连接。

·同一个端口号也可以出现在多个不同的 TCP 连接中。

Socket 有多种不同的意思:

·应用编程接口  API  称为 socket API, 简称为 socket。

·socket API 中使用的一个函数名也叫作 socket。

·调用 socket 函数的端点称为 socket。

·调用 socket 函数时其返回值称为 socket 描述符,可简称为 socket。

·在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。

1.3 可靠传输的工作原理

IP 网络提供的是不可靠的传输。

·在理想传输条件下,不需要采取任何措施就能够实现可靠传输。

·但实际网络都不具备理想传输条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输。->停止等待协议、连续 ARQ 协议

1.3.1 停止等待协议

·每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

·全双工通信的双方既是发送方也是接收方。

·假设仅考虑 A 发送数据,而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。

发送方

        1.发送数据              

        2.计时    

        3.确认发送下一包  :未超时              

        4.重传数据:超时      

        5.丢弃重复的确认信息

接收方

        1.接收数据

        2.检错                  

        3.发送确认信息(无错)

        4.丢弃数据(数据位错误,重复数据)

(1)无差错情况

(2)出现差错

两种情况:

        ·B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。

        ·M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。

·在这两种情况下,B 都不会发送任何信息

问题:A 如何知道 B 是否正确收到了 M1 呢?

解决方法超时重传

        1.A 为每一个已发送的分组设置一个超时计时器。

        2.A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。

        3.若 A 在超时计时器规定时间内没有收到 B 的确认,就认为分组错误或丢失,就重发该分组。

(3)确认丢失和确认迟到

确认丢失

        1.若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内将不会收到确认,因此 A 在超时计时器到期后重传 M1。

        2.假定 B 正确收到了 A 重传的分组 M1。这时 B 应采取两个行动:

                (1) 丢弃这个重复的分组 M1,不向上层交付。

                (2) 向 A 发送确认

确认迟到

        1.B 对分组 M1 的确认迟到了,因此 A 在超时计时器到期后重传 M1。

        2.B 会收到重复的 M1,丢弃重复的 M1,并重传确认分组。

        3.A 会收到重复的确认。对重复的确认的处理:丢弃

(4)信道利用率

优点:简单。缺点:信道利用率太低。

停止等待协议要点

·停止等待。发送方每次只发送一个分组。在收到确认后再发送下一个分组。

·暂存:在发送完一个分组后,发送方必须暂存已发送的分组的副本,以备重发。

·编号。对发送的每个分组和确认都进行编号。

·超时重传。发送方为发送的每个分组设置一个超时计时器。若超时计时器超时位收到确认,发送方会自动超时重传分组。  

·超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些,防止不必要的重传。

·简单,但信道利用率太低

1.3.2 连续 ARQ 协议

·通常 A 最终总是可以收到对所有发出的分组的确认。如果 A 不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。

·使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。

·像上述的这种可靠传输协议常称为自动重传请求 ARQ  (Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

发送窗口:发送方维持一个发送窗口,位于发送窗口内的分组都可被连续发送出去,而不需要等待对方的确认。

发送窗口滑动:发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置

累积确认:接收方对按序到达最后一个分组发送确认,表示:到这个分组为止的所有分组都已正确收到了。

        -优点:容易实现,即使确认丢失也不必重传。

        -缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。(例如不按序到达的)

连续 ARQ 协议采用 Go-back-N(回退N)。

Go-back-N(回退N):表示需要再退回重传已发送过的 N 个分组。 当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。

1.4 TCP 报文段的首部格式

·TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。

·一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。

·TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节

·源端口目的端口各占 2 字节。端口是运输层与应用层的服务接口。 运输层的复用和分用功能通过端口实现。

·序号:占 4 字节。TCP 连接中传送的数据流中的每一个字节都有一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

·确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。

        -若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。

·数据偏移(即首部长度):占 4 位,指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。单位是 32 位字(以 4 字节为计算单位)。 

·保留:占 6 位,保留为今后使用,但目前应置为 0。

·紧急 URG:控制位。当 URG = 1 时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据)。

·确认 ACK:控制位。只有当 ACK =1 时,确认号字段才有效。当 ACK =0 时,确认号无效。

·推送 PSH (PuSH) :控制位。接收 TCP 收到 PSH = 1 的报文段后,就尽快(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满后再交付。

·复位 RST (ReSeT) :控制位。当 RST=1 时,表明 TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

·同步 SYN (SYNchronization) :控制位。 同步 SYN = 1 表示这是一个连接请求或连接接受报文。

        当 SYN = 1,ACK = 0 时,表明这是一个连接请求报文段。

        当 SYN = 1,ACK = 1 时,表明这是一个连接接受报文段。

·终止 FIN (FINish) :控制位。用来释放一个连接。 FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

·窗口:占 2 字节。 窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。

        -窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化

·检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。 在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部

        在计算检验和时,临时把 12 字节的“伪首部”和 TCP 报文段连接在一起。伪首部仅仅是为了计算检验和。

·紧急指针:占 2 字节。在 URG = 1时,指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),指出了紧急数据的末尾在报文段中的位置。

·选项:长度可变,最长可达 40 字节。

        —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”

·填充:使整个 TCP 首部长度是 4 字节的整数倍。

MSS (Maximum Segment Size) 是 TCP 报文段中的数据字段的最大长度。 数据字段加上 TCP 首部才等于整个的 TCP 报文段。 所以,MSS是“TCP 报文段长度减去 TCP 首部长度”。

选项(2):最大报文段长度 MSS。最大报文段长度 MSS  (Maximum Segment Size) 是每个 TCP 报文段中的数据字段的最大长度。

与接收窗口值没有关系。

选项(3):窗口扩大。TCP 窗口字段长度= 16 位,最大窗口大小 = 64 K 字节。 对于传播时延和带宽都很大的网络,为获得高吞吐率较,需要更大的窗口。

·窗口扩大选项:占 3 字节,其中一个字节表示移位值 S

·新的窗口值位数从 16 增大到 (16 + S),相当于把窗口值向左移动 S 位

·移位值允许使用的最大值是 14,窗口最大值增大到 2^{(16+14)} – 1 = 2^{30}– 1。 窗口扩大选项可以在双方初始建立 TCP 连接时进行协商。

选项(8):时间戳。

·占 10 字节。最主要的 2 个字段:     

        时间戳值字段(4字节)和时间戳回送回答字段(4字节)。

·2 个主要功能:

        1.计算往返时间 RTT

        2.防止序号绕回 PAWS (Protect Against Wrapped Sequence numbers)。

         -序号重复时,为了使接收方能够把新报文段和迟到很久的旧报文段区分开,可以在报文段中加上时间戳。

1.5 TCP 可靠传输的实现

1.5.1 以字节为单位的滑动窗口

·TCP 使用流水线传输和滑动窗口协议实现高效、可靠的传输。

·TCP 的滑动窗口是以字节为单位的。

·发送方 A 和接收方 B 分别维持一个发送窗口和一个接收窗口

·发送窗口:在没有收到确认的情况下,发送方可以连续把窗口内的数据全部发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。

·接收窗口:只允许接收落入窗口内的数据。

 第一,发送窗口是根据接收窗口设置的,但在同一时刻,发送窗口并不总是和接收窗口一样大(因为有一定的时间滞后)。

第二,TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。

第三,TCP 要求接收方必须有累积确认的功能,以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。但接收方不应过分推迟发送确认,否则会导致发送方不必要的重传,捎带确认实际上并不经常发生。

1.5.2 超时重传时间的选择

·TCP 发送方在规定的时间内没有收到确认就要重传已发送的报文段。

·但重传时间的选择是 TCP 最复杂的问题之一。

·互联网环境复杂,IP 数据报所选择的路由变化很大,导致运输层的往返时间 (RTT) 的变化也很大。

TCP 超时重传时间设置:

·不能太短,否则会引起很多报文段的不必要的重传,使网络负荷增大。

·不能过长,会使网络的空闲时间增大,降低了传输效率。

TCP 采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间。 这两个时间之差就是报文段的往返时间 RTT。

1.5.3 选择确认 SACK

问题:若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?

解决:选择确认 SACK  (Selective ACK)。

RFC 2018 对 SACK 的规定:

·如果要使用选择确认,在建立 TCP 连接时,要在 TCP 首部的选项中加上允许 SACK 选项,且双方必须事先商定好。

·如果使用选择确认,原来首部中的确认号的用法仍然不变(累积确认)。只是在 TCP 首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。

1.6 TCP 的流量控制

1.6.1 利用滑动窗口实现流量控制

·流量控制 (flow control) :让发送方的发送速率不要太快,使接收方来得及接收。

·利用滑动窗口机制可以很方便地在 TCP 连接上实现对发送方的流量控制。

   利用可变窗口进行流量控制举例

死锁的解决办法——持续计时器

·持续计时器  (persistence timer):只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器。

        ·若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),对方在确认这个探测报文段时给出当前窗口值。

        ·若窗口仍然是零,收到这个报文段的一方就重新设置持续计时器。

        ·若窗口不是零,则死锁的僵局就可以打破了。 

1.7 TCP 的拥塞控制

拥塞产生的原因

由许多因素引起。例如:

        节点缓存容量太小;

        链路容量不足;

        处理机处理速率太慢;

        拥塞本身会进一步加剧拥塞;

出现网络拥塞的条件:∑ 对资源需求  > 可用资源。

增加资源能解决拥塞吗?

        不能,而且还可能使网络的性能更坏。

        例如:

        增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,解决不了网络拥塞;

        提高处理机处理的速率会将瓶颈转移到其他地方;

        拥塞引起的重传并不会缓解网络的拥塞,反而会加剧网络的拥塞。

 拥塞控制与流量控制的区别

  

拥塞控制的一般原理:

        拥塞控制的前提:网络能够承受现有的网络负荷。

        实践证明,拥塞控制是很难设计的,因为它是一个动态问题。

        分组的丢失是网络发生拥塞的征兆,而不是原因。

        在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化、甚至发生死锁的原因。

1.7.1 TCP 的拥塞控制方法

·TCP 采用基于滑动窗口的方法进行拥塞控制,属于闭环控制方法。

·TCP 发送方维持一个拥塞窗口 cwnd (Congestion Window)。

·拥塞窗口的大小取决于网络的拥塞程度,并且是动态变化的。

·发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。

·发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况。

·真正的发送窗口值 = Min (接收方通知的窗口值,拥塞窗口值)。

控制拥塞窗口变化的原则:

·只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,提高网络的利用率。

·但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,缓解网络出现的拥塞。

TCP 拥塞控制算法:

四种拥塞控制算法( RFC 5681) :

        ·慢开始 (slow-start)

        ·拥塞避免 (congestion avoidance)

        ·快重传 (fast retransmit)

        ·快恢复 (fast recovery)

慢开始和拥塞避免算法的实现举例

·当 TCP 连接进行初始化时,将拥塞窗口置为 1(窗口单位不使用字节而使用报文段)。

·将慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。

·开始执行慢开始算法时,拥塞窗口 cwnd=1,发送第一个报文段。

·发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,因此拥塞窗口 cwnd 随着往返时延 RTT 按指数规律增长。

·当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时,改为执行拥塞避免算法,拥塞窗口按线性规律增长。

·当拥塞窗口 cwnd = 24 时,网络出现了超时,发送方判断为网络拥塞。调整门限值 ssthresh = cwnd / 2 = 12,同时设置拥塞窗口 cwnd = 1,进入慢开始阶段。

·按照慢开始算法,发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1。当拥塞窗口 cwnd = ssthresh = 12 时,改为执行拥塞避免算法,拥塞窗口按线性规律增大。

·当拥塞窗口 cwnd = 16 时,发送方连续收到 3 个对同一个报文段的重复确认(记为 3-ACK)。发送方改为执行快重传和快恢复算法。

·执行快重传和快恢复算法:发送方调整门限值 ssthresh = cwnd / 2 = 8,设置拥塞窗口 cwnd = ssthresh = 8,开始执行拥塞避免算法。

TCP 拥塞控制流程图

发送窗口的上限值 = Min [rwnd, cwnd] .

当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值。

当 cwnd < rwnd 时,是网络拥塞限制发送窗口的最大值。

1.8 TCP 的运输连接管理

·TCP 是面向连接的协议。

·TCP 连接有三个阶段: 连接建立 数据传送 连接释放

·TCP 的连接管理就是使 TCP 连接的建立和释放都能正常地进行。

TCP 连接建立过程中要解决的三个问题

1.要使每一方能够确知对方的存在。

2.要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。

3.能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

TCP 连接的建立采用客户服务器方式

主动发起连接建立的应用进程叫做客户 (client)。

被动等待连接建立的应用进程叫做服务器 (server)。

1.8.1 TCP 的连接建立——三次握手

·TCP 建立连接的过程叫做握手。

·采用三报文握手:在客户和服务器之间交换三个 TCP 报文段,以防止已失效的连接请求报文段突然又传送到了,因而产生 TCP 连接建立错误。

·B 的 TCP 服务器进程先创建传输控制块 TCB,准备接受客户进程的连接请求。

·A 的 TCP 向 B 主动发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。

TCP规定,SYN 报文段(即SYN = 1的报文段)不能携带数据,但要消耗掉一个序号。

·B 的 TCP 收到连接请求报文段后,如同意,则发回确认。 B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号 ack = x + 1,自己选择的序号 seq = y。

·A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y + 1。 A 的 TCP 通知上层应用进程,连接已经建立。

TCP 标准规定:ACK 报文段可以携带数据。 但如果不携带数据,则不消耗序号。下一个数据报文段的序号仍是 seq = x + 1。

·B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。双方可以开始数据传送。 

1.8.2 TCP 的连接释放——四次挥手

·TCP 连接释放过程比较复杂。

·数据传输结束后,通信的双方都可释放连接。

·TCP 连接释放过程是四报文握手

·A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。

TCP规定:FIN 报文段即使不携带数据,也消耗掉一个序号。

·B 发出确认,ACK=1,确认号 ack = u+1,这个报文段的序号 seq = v。 TCP 服务器进程通知高层应用进程。 从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭 (half-close) 状态。B 若发送数据,A 仍要接收。

·若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。 FIN=1,ACK=1,确认号 ack = u+1。

·A 收到连接释放报文段后,必须发出确认。  ACK=1,确认号 ack=w+1,自己的序号 seq = u + 1。

·请注意:此时 TCP 连接还没有释放掉。必须经过时间等待计时器 (TIME-WAIT timer) 设置的时间 2MSL 后,A 才释放 TCP 连接。

必须等待 2MSL 的时间:

第一,保证发送的最后一个 ACK 报文段能够到达 B。

第二,防止“已失效的连接请求报文段”出现在本连接中。

保活计时器

·用来防止在 TCP 连接出现长时期空闲。

·通常设置为 2 小时 。

·若服务器过了 2 小时还没有收到客户的信息,它就发送探测报文段。

·若发送了 10 个探测报文段(每一个相隔 75 秒)还没有响应,就假定客户出了故障,因而就终止该连接。 

1.9 TCP 的有限状态机

欢迎一起学习~

相关文章:

TCP 传输控制协议——详细

目录 1 TCP 1.1 TCP 最主要的特点 1.2 TCP 的连接 TCP 连接&#xff0c;IP 地址&#xff0c;套接字 1.3 可靠传输的工作原理 1.3.1 停止等待协议 &#xff08;1&#xff09;无差错情况 &#xff08;2&#xff09;出现差错 &#xff08;3&#xff09;确认丢失和确认迟到…...

ArcGIS学习(六)地理数据库

ArcGIS学习(六)地理数据库 上个任务我们讲了一个非常重要的知识点一一坐标系。这个任务我们带来另外一个很重要的知识点一一地理数据库。 地理数据库的内容相比于坐标系简单很多! 首先,先让我们来学习下地理数据库的理论。 ArcGIS 中的地理数据库(Geodatabase)是一个用…...

保研机试算法训练个人记录笔记(四)——哈希算法

目录 两数之和 字母异位词分组 最长连续序列 力扣热题100——哈希算法 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答…...

ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot

文章目录 ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot一、Code Copilot AI编程助手二、制作代码生成器2.1 定义生成器框架2.2 从现有代码提取代码模板三、进行代码优化ChatGPT实战100例 - (14) 打造AI编程助手 Code Copilot 一、Code Copilot AI编程助手 Code Copi…...

表单标记(html)

前言 发现input的type属性还是有挺多的&#xff0c;这里把一些常用的总结一下。 HTML 输入类型 (w3school.com.cn)https://www.w3school.com.cn/html/html_form_input_types.asp text-文本 文本输入,如果文字太长&#xff0c;超出的部分就不会显示。 定义供文本输入的单行…...

Linux文件和目录管理

目录基础 Linux操作系统以目录的方式来组织和管理系统中的所有文件。所谓的目录&#xff0c;就是将所有文件的说明信息采用树状结构组织起来。每个目录节点之下会有文件和子目录。 所有一切都从 ‘根’ 开始&#xff0c;用 ‘/’ 代表, 并且延伸到子目录。 bin&#xff1a;B…...

【go】gorm\xorm\ent事务处理

文章目录 1 gorm1.1 开启事务1.2 执行操作1.3 提交或回滚 2 xorm2.1 开启事务2.2 执行操作2.3 提交或回滚 3 ent3.1 开启事务3.2 执行操作3.3 提交或回滚 前言&#xff1a;本文介绍golang三种orm框架对数据库事务的操作 1 gorm Begin开启事务 tx *gorm.DB 1.1 开启事务 tx :…...

【数据分享】1929-2023年全球站点的逐月平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…...

IP地址详解

IP地址是互联网协议&#xff08;Internet Protocol&#xff09;用于标识并定位网络中主机&#xff08;如计算机、服务器、路由器等&#xff09;的一串数字。它是一个32位的二进制数&#xff0c;通常以四个数字&#xff08;每个数字范围为0-255&#xff09;的形式显示&#xff0…...

Python爬虫http基本原理#2

Python爬虫逆向系列&#xff08;更新中&#xff09;&#xff1a;http://t.csdnimg.cn/5gvI3 HTTP 基本原理 在本节中&#xff0c;我们会详细了解 HTTP 的基本原理&#xff0c;了解在浏览器中敲入 URL 到获取网页内容之间发生了什么。了解了这些内容&#xff0c;有助于我们进一…...

Web Services 服务 是不是过时了?创建 Web Services 服务实例

Web Services 是不是过时了&#xff1f; 今天是兔年最后一天&#xff0c;先给大家拜个早年 。 昨天上午视频面试一家公司需要开发Web Services 服务&#xff0c;这个也没有什么&#xff0c;但还需要用 VB.net 开发。这个是多古老的语言了&#xff0c;让我想起来了 10年 前 写 …...

redis单线程还快的原因

1. 内存存储和高效数据结构&#xff1a; 内存存储&#xff1a; Redis将数据存储在内存中&#xff0c;因此可以实现非常高的读写速度&#xff0c;而无需频繁的磁盘I/O操作。 高效数据结构&#xff1a; Redis内置了丰富且高效的数据结构&#xff0c;如字符串、哈希表、列表、集合…...

【flutter】报错 cmdline-tools component is missing

在flutterSDK目录下&#xff0c;双击flutter_console.bat&#xff0c;调出命令行。 输入flutter doctor&#xff0c;如果第三个诊断为[x]&#xff0c;报cmdline-tools component is missing错&#xff08;我这已经修改好了&#xff0c;所以是勾了&#xff09;&#xff0c;那就可…...

以用户为中心,酷开科技荣获“消费者服务之星”

在企业顺应消费升级的道路中&#xff0c;企业自身不仅要着力强化对于消费者服务意识的提升&#xff0c;并且要树立诚信自律的行业示范带头作用&#xff0c;助力消费环境稳中向好&#xff0c;不断满足人民群众对美好生活的期待。企业的发展需要消费者的认可&#xff0c;酷开科技…...

Days 27 ElfBoard 板 AltiumDesigner 相同电路快速布局布线

在进行设计开发的时候&#xff0c;总会遇到相同的电路&#xff0c;或者模块&#xff0c;这些电路可以使用相同的布局和走线&#xff0c;例如 DC-DC 电源、网口 PHY 电路部分。这类型的电路&#xff0c;我们可以采用AltiumDesigner 中的 Room 进行布局和布线的快速复制&#xff…...

除夕快乐(前端小烟花)

家人们&#xff0c;新的一年好运常在&#xff0c;愿大家在新的一年里得偿所愿&#xff0c;发财暴富&#xff0c;愿大家找到属于自己的那个公主&#xff0c;下面就给大家展示一下给公主的烟花 前端烟花 新的一年&#xff0c;新的挑战&#xff0c;愿我们不忘初心&#xff0c;砥砺…...

fast.ai 深度学习笔记(二)

深度学习 2&#xff1a;第 1 部分第 4 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-4-2048a26d58aa 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…...

风行智能电视G32Y 强制刷机升级方法,附刷机升级数据MstarUpgrade.bin

升级步骤&#xff1a; 1、下载刷机数据&#xff0c;如是压缩包&#xff0c;需要先解压&#xff0c;然后将刷机bin格式的文件重命名为MstarUpgrade.bin 2、将此文件放到U盘根目录 &#xff08;U盘格式FAT32&#xff0c;单分区&#xff0c;建议4G的优盘刷机成功率高&#xff09;…...

tsgctf-2021-lkgit-无锁竞争-userfaultfd

启动脚本 qemu-system-x86_64 \-kernel ./bzImage \-initrd ./rootfs.cpio \-nographic \-monitor /dev/null \-cpu kvm64,smep,smap \-append "consolettyS0 kaslr oopspanic panic1 quiet" \-no-reboot \-m 256M题目 lkgit_hash_object #define HASH_SIZE …...

物联网数据隐私保护技术

在物联网&#xff08;IoT&#xff09;的世界中&#xff0c;无数的设备通过互联网连接在一起&#xff0c;不断地收集、传输和处理数据。这些数据有助于提高生产效率、优化用户体验并创造新的服务模式。然而&#xff0c;随着数据量的剧增&#xff0c;数据隐私保护成为了一个不能忽…...

RabbitMQ-1.介绍与安装

介绍与安装 1.RabbitMQ1.0.技术选型1.1.安装1.2.收发消息1.2.1.交换机1.2.2.队列1.2.3.绑定关系1.2.4.发送消息 1.2.数据隔离1.2.1.用户管理1.2.3.virtual host 1.RabbitMQ 1.0.技术选型 消息Broker&#xff0c;目前常见的实现方案就是消息队列&#xff08;MessageQueue&…...

CSS高级技巧

一、 精灵图 1.1 为什么需要精灵图&#xff1f; 1.2 精灵图&#xff08;sprites&#xff09;的使用 二、 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 icomoom字库 http://icomoon.io 阿里iconfont字库 http://www.iconfont.cn/ 2.4 字体图标的引用…...

Redis的数据类型Hash使用场景实战

Redis的数据类型Hash使用场景 常见面试题&#xff1a;redis在你们项目中是怎么用的&#xff0c;除了String数据类型还使用什么数据类型&#xff1f; 怎么保证缓存和数据一致性等问题… Hash模型使用场景 知识回顾&#xff1a; redisTemplate.opsForHash() 方法是 Redis 的 …...

HttpClient | 支持 HTTP 协议的客户端编程工具包

目录 1、简介 2、应用场景 3、导入 4、API 5、示例 5.1、GET请求 5.2、POST请求 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初…...

DP第一天:力扣● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

● 理论基础 DP大约五种问题&#xff1a; 动规基础&#xff08;斐波那契数列、爬楼梯&#xff09;&#xff1b;背包问题&#xff1b;股票问题&#xff1b;打家劫舍&#xff1b;子序列问题。 要搞清楚&#xff1a; DP数组及其下标的含义&#xff1b;DP数组如何初始化&#x…...

Android Studio 安装Flutter插件但是没法创建项目

Android Studio 安装Flutter插件但是没法创建项目 如果你在Android Studio已经安装了Dart、Flutter插件&#xff0c;但是不能创建Flutter项目。 原因是因为Android Studio的版本更新&#xff0c;Android APK Support这个插件没被选中。 一旦勾选这个插件之后&#xff0c;就能…...

新春快乐(烟花、春联)【附源码】

新春快乐 一&#xff1a; C语言 -- 烟花二&#xff1a;Python -- 春联三&#xff1a;Python -- 烟花四&#xff1a;HTML -- 烟花 一&#xff1a; C语言 – 烟花 运行效果&#xff1a; #include <graphics.h> #include <math.h> #include <time.h> #include…...

nextcloud 优化扩展

cd /config vi config.php #ONLYOFFICE allow_local_remote_servers > true, #应用商店加速 appstoreenabled > true, appstoreurl > https://www.orcy.net/ncapps/v2/, #nginx配置调优 add_header Strict-Transport-Security max-age15552000; add…...

【CSS】css如何实现字体大小小于12px?

【CSS】css如何实现字体大小小于12px? 问题解决方案transform: scale(0.5)&#xff08;常用&#xff09;SVG 矢量图设置text 问题 文字需要显示为12px&#xff0c;但是小于12px的&#xff0c;浏览器是显示不来的 解决方案 transform: scale(0.5)&#xff08;常用&#xff0…...

【Langchain+Streamlit】旅游聊天机器人

【LangchainStreamlit】打造一个旅游问答AI-CSDN博客 项目线上地址&#xff0c;无需openai秘钥可直接体验&#xff1a;http://101.33.225.241:8502/ github地址&#xff1a;GitHub - jerry1900/langchain_chatbot: langchainstreamlit打造的一个有memory的旅游聊天机器人&…...

〖大前端 - ES6篇②〗- let和const

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…...

JAVA设计模式之代理模式详解

代理模式 1 代理模式介绍 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代…...

vivo发布2023 年度科技创新;阿里全新AI代理,可模拟人类操作手机

vivo 发布 2023 年度十大产品技术创新 近日&#xff0c;vivo 发布了「2023 年度科技创新」十大产品技术创新榜单&#xff0c;并将这些技术分为了 4 个板块。 「四大蓝科技」为 vivo 在去年推出的全新技术品牌&#xff0c;涵盖蓝晶芯片技术栈、蓝海续航系统、蓝心大模型、蓝河操…...

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏15(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言实现树倒下的效果拾取圆木砍树消耗卡路里斧头手臂穿模问题处理源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&…...

python巧用定理判断素数

目录 判断一个数n是否是素数 求一个数的素因数个数 求大于等于指定数的最小素数 在数论中有三个非常重要的关于素数的定理 1、任何数都可以表示成若干个素数的乘积 2、任意数的素因子一个大于根号n的自然数&#xff0c;另一个与其对应的因子则必小于根号n。 3、除了2和3以…...

2023年总结

人们总说时间会改变一切&#xff0c;但事实上你得自己来。 今年开始给自己的时间读书、工作、生活都加上一个2.0的release版本号&#xff0c;相比过去的一年还是有很多进步的。 就跟git commit一样&#xff0c;一步一步提交优化&#xff0c;年底了发个版本。用李笑来的话说&am…...

Git中为常用指令配置别名

目录 1 前言 2 具体操作 2.1 创建.bashrc文件 2.2 添加指令 2.3 使其生效 2.4 测试 1 前言 在Git中有一些常用指令比较长&#xff0c;当我们直接输入&#xff0c;不仅费时费力&#xff0c;还容易出错。这时候&#xff0c;如果能给其取个简短的别名&#xff0c;那么事情就…...

STM32内部Flash

目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像&#xff1a; 1. 程序ROM的加载与执行空间 2. ROM空间分布表 一、内部Flash…...

html5 audio video

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用&#xff1a; 可用&#xff1a; Google Chrome Close AutoUpdate-CSDN博客...

LoveWall v2.0Pro社区型校园表白墙源码

校园表白墙&#xff0c;一个接近于社区类型的表白墙&#xff0c;LoveWall。 源码特色&#xff1b; 点赞&#xff0c; 发评论&#xff0c; 发弹幕&#xff0c; 多校区&#xff0c; 分享页&#xff0c; 涉及违禁物等名词进行检测&#xff01; 安装教程: 环境要求&#xff1b;…...

Flink cdc3.0动态变更表结构——源码解析

文章目录 前言源码解析1. 接收schema变更事件2. 发起schema变更请求3. schema变更请求具体处理4. 广播刷新事件并阻塞5. 处理FlushEvent6. 修改sink端schema 结尾 前言 上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题&#xff0c;本篇来看下新功能之一的动态变更表结…...

WWW 2024 | 时间序列(Time Series)和时空数据(Spatial-Temporal)论文总结

WWW 2024已经放榜&#xff0c;本次会议共提交了2008篇文章&#xff0c;research tracks共录用约400多篇论文&#xff0c;录用率为20.2%。本次会议将于2024年5月13日-17日在新加坡举办。 本文总结了WWW 2024有关时间序列&#xff08;Time Series&#xff09;和时空数据&#xf…...

代码随想录算法——数组

目录 1、二分查找法 2、移除元素 3、有序数组的平方 4、长度最小的子数组 5、螺旋矩阵II 1、二分查找法 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在…...

Linux第45步_通过搭建“DNS服务器”学习图形化配置工具

学习的意义&#xff1a;通过搭建“DNS服务器”&#xff0c;来学习“图形化配置工具”。“DNS服务器”&#xff0c;我们用不到&#xff0c;但为后期移植linux系统服务&#xff0c;因为在移植系统时&#xff0c;需要用到这个“图形化配置工具”。 1、“menuconfig图形化配置工具…...

【Linux取经路】探寻shell的实现原理

文章目录 一、打印命令行提示符二、读取键盘输入的指令三、指令切割四、普通命令的执行五、内建指令执行5.1 cd指令5.2 export指令5.3 echo指令 六、结语 一、打印命令行提示符 const char* getusername() // 获取用户名 {return getenv("USER"); }const char* geth…...

【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)

1.随机森林在神经网络的应用 当使用随机森林进行特征选择时&#xff0c;算法能够为每个特征提供一个重要性得分&#xff0c;从而帮助识别对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理…...

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块

047_http模块_获取请求行和请求头 hello&#xff0c;大家好&#xff0c;那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法&#xff0c;我在这个文档当中都已经记录好了&#xff0c;方便大家后续做一个快速的查阅。 …...

【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解

目录 2.4 队列1) 概述2) 链表实现3) 环形数组实现 2.4 队列 1) 概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。习惯来说&#xff0c;添加的一端称为尾&#xff0c;移除的一端称为头&#xf…...

(注解配置AOP)学习Spring的第十七天

基于注解配置的AOP 来看注解式开发 : 先把目标与通知放到Spring里管理 : Service("userService") public class UserServiceImpl implements UserService {Overridepublic void show1() {System.out.println("show1......");}Overridepublic void show2…...

[C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow

在OpenCV中&#xff0c;imshow函数默认情况下是不支持滚动条的。如果想要显示滚动条&#xff0c;可以考虑使用其他库或方法来进行实现。 一种方法是使用Qt库&#xff0c;使用该库可以创建一个带有滚动条的窗口&#xff0c;并在其中显示图像。具体步骤如下&#xff1a; 1&…...