传输控制协议(TCP)和用户数据报协议(UDP)

news2025/4/19 21:50:35

一、传输控制协议(TCP)

传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。

它通过三次握手建立连接,确保数据的可靠传输,并提供顺序控制、流量控制和拥塞控制等功能‌。

在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP 层是位于 IP 层之上,应用层之下的中间层。

1.TCP的特点

  1. TCP 是面向连接(虚连接)的传输层协议。
  2. 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的。
  3. TCP 提供可靠交付的服务,无差错、不丢失、不重复、按序到达。
  4. TCP 提供全双工通信
  5. TCP 面向字节流

2.TCP报文

在这里插入图片描述

  • 源端口(Source Port):16 bits,通过一个端口号告诉 TCP 报文来自于哪个进程。
  • 目标端口(Destination Port):16 bits,通过一个端口号告诉 TCP 报文要发给哪个进程。
  • 序号(Sequence Number,seq):32 bits,在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号 。
  • 确认号(Acknowledgment Number,ack):32 bits, 期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
  • 数据偏移(Data Offset,DOffset) :4 bits,TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,以4B位单位,即1个数值是4B。
  • 保留(Reserved ,Rsrvd):6 bits,须置0。
  • 控制位(Flags):6 bits,
    • 紧急位 URG:URG=1 时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
    • 复位 RST:RST=1 时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
    • 确认位 ACK:ACK=1 时确认号有效,在连接建立后所有传送的报文段都必须把 ACK 置为 1。
    • 推送位 PSH:PSH=1 时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
    • 同步位 SYN:SYN=1 时,表明是一个连接请求/连接接受报文。
    • 终止位 FIN:FIN=1 时,表明此报文段发送方数据已发完,要求释放连接。
  • 窗口(Window,WIN):16 bits,指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
  • 检验和(Checksum):16 bits,检验首部+数据,检验时要加上 12B 伪首部,第四个字段为6。
  • 紧急指针(Options) :16 bits,URG=1 时才有意义,指出本报文段中紧急数据的字节数。
  • 选项(Options ) :最多40 bits,最大报文段长度MSS、窗口扩大、时间戳、选择确认…

3.TCP连接过程

TCP 是面向连接的,客户端与服务器要建立连接才能进行通信,通信后需要断开连接。

(1)三次握手建立连接

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户 TCP,他想建立一个与服务器上某个进程之间的连接,客户中的 TCP 会用以下步骤与服务器中的 TCP 建立一条 TCP 连接:

  1. 第一次握手:客户端把 SYN 标志位置为1,随机初始化 “序列号” seq=x 的数据包到服务器,并进入 SYN-SENT 状态;服务器由 SYN=1 知道,客户端要求建立联机,此时服务器进入 LISTEN 状态;
  2. 第二次握手:服务器收到请求后,随机初始化自己的“序列号” seq=y,“确认应答号” ack=x+1,把 SYNACK 标志位置为1,把该报文发给客户端,此时服务器进入进入 SYN-RECEIVED 状态。
  3. 第三次握手:客户端收到服务端报文后,将 ACK 标志位置为1,“确认应答号” ack=y+1,“序列号” seq=x+1,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端和服务器处于 ESTABLISHED 状态。

在这里插入图片描述

(2)四次挥手关闭连接

参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。

  1. 第一次挥手:客户端发送一个 FIN=1,seq=u 的数据包到服务端,用来关闭客户端到服务器的数据传送。然后客户端进入 FIN-WAIT-1 状态。
  2. 第二次挥手:服务器收到这个数据包,它发送一个 ACK标志为1,ack=u+1,seq=v 的数据包到客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  3. 第三次挥手:服务端发送一个 FIN=1,ACK=1,seq=w,ack=u+1 的数据包到客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
  4. 第四次挥手:客户端发送 ACK=1,ack=w+1 的数据包到服务端,然后客户端进入TIME-WAIT 状态,服务端在收到数据包后进入 CLOSE 状态。

此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

在这里插入图片描述

4.滑动窗口

在TCP通信中,每次发送数据都需要等待一次确认应答,如果在等待前一个数据包的确认时才发送下一个数据包,通信效率会变得很低。

为解决这个问题,TCP 引入了滑动窗口这个概念。它允许发送方在不接收确认应答的情况下持续发送数据,并根据接收方的反馈及时调整数据发送速率。即使在往返时间较长的情况下,它也不会降低网络通信的效率。

TCP 报文里有一个字段叫窗口(Window,WIN),记录着窗口大小的信息窗口大小。
这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收
端的处理能力来发送数据,而不会导致接收端处理不过来。

发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。所以,通常窗口的大小是由接收方的窗口大小来决定的。

(1)发送窗口的工作原理

发送窗口的工作空间,根据处理的情况分成四个部分:
已发送并收到 ACK确认的数据、已发送但未收到 ACK确认的数据、未发送但总大小在接收方处理范围内(接收方还有空间)、未发送但总大小超过接收方处理范围(接收方没有空间)

其中已发送但未收到 ACK确认的数据的部分方框是发送窗口,未发送但总大小在接收方处理范围内(接收方还有空间)的部分是可用窗口。

下面是发送窗口工作原理的示意图,在下图中,蓝色部分为已发送并收到 ACK确认的数据的子节,绿色部分为已发送但未收到 ACK确认的数据,黄色部分为未发送但总大小在接收方处理范围内的数据,白色部分为未发送但总大小超过接收方处理范围。

下图以滑动窗口大小为 8 为例子:

(a):
在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 13字节,共3个字节;
已发送但未收到 ACK确认的数据:0个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:14 ~ 21字节,共8个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:22字节以后。

(b):
在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 13字节,共3个字节;
已发送但未收到 ACK确认的数据:14 ~ 16字节,共3个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:17 ~ 21字节,共5个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:22字节以后。

(c):
在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 15字节,共5个字节;
已发送但未收到 ACK确认的数据:26 ~ 23字节,共8个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:0个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:28字节以后。

(d):

在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 19字节,共9个字节;
已发送但未收到 ACK确认的数据:20 ~ 23字节,共4个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:24 ~ 27字节,共4个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:28字节以后。

(2)接收窗口的工作原理

接收窗口根据处理的情况划分成三个部分: 已成功接收并确认的数据(等待应用进程读取)、 未收到数据但可以接收的数据、未收到数据并不可以接收的数据;

上面发送窗口的图d情况中,接收窗口的示意图如下:
在这里插入图片描述
已成功接收并确认等待应用进程读取)数据:11 ~ 19字节,共9个字节;
未收到数据但可以接收的数据:20 ~ 27字节,共8个字节;
未收到数据并不可以接收的数据:28字节以后。

二、TCP 保证可靠性机制

可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。

前文提到 TCP 是可靠的,那么 TCP 靠着哪些机制保证了可靠性呢?

TCP 主要通过连接管理、序列号、确认应答、重传机制、流量控制、拥塞控制四个机制来保证可靠性的。

1.序列号与确认应答机制

在TCP中,通过序列号与确认应答来实现数据的可靠传输。

TCP将每个字节的数据都进行了编号,这就是序列号,序列号能够保证可靠性和有序性。

接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况这就是确认应答

序列号与确认应答机制就是,在发送端将数据传输到接收主机时,接收主机会根据收到消息的序列号,发送一个确认应答消息以表示已成功接收到数据。
在这里插入图片描述

2. 重传机制

在错综复杂的网络,数据在传输过程中是有可能丢失的,所以 TCP 针对数据包丢失的情况,会用重传机制解决。

(1)超时重传

发送方在发送数据时,设定一个定时器,使用一个保守估计的时间作为收到 ACK 确认应答报文的超时上限。如果超过这个上限仍未收到对方的 ACK 确认应答报文,发送方将重传这个数据包。每当发送方收到确认包后,会重置这个重传定时器。
在这里插入图片描述
TCP 会在以下两种情况发生超时重传:数据包丢失、确认应答丢失。

超时重传时间怎么确定

  • RTT(Round Trip Time):往返时间,指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。
  • RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。

RTO 的确定是一个关键问题,因为它直接影响到 TCP 的性能和效率。当超时时间 RTO 较大时,重发就慢,丢了老半天才重发,没有效率,性能差; 当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
因此,RTO 应该根据网络的实际状况,动态地进行调整。

TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间 RTT 。TCP保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间,S表示 Smoothed。因为进行的是加权平均,因此得出的结果更加平滑)。每当第一次测量到 RTT 样本时,RTT值就取为所测量到的 RTT 样本值。但以后每测量到一个新的 RTT样本,就按下式重新计算一次 RTTS:
(1)首次计算RTO时:

R T T S = R 1 RTT_S=R1 RTTS=R1

R T T d e v = R 1 / 2 RTT_{dev}=R1/2 RTTdev=R1/2

R T O = μ × R T T S + ∂ × R T T d e v = μ × R 1 + ∂ × R 1 / 2 RTO = μ \times RTT_S+∂ \times RTT_{dev}=μ \times R1+∂ \times R1/2 RTO=μ×RTTS+×RTTdev=μ×R1+×R1/2

其中:R1 是第一次测量的 RTT

(2)迭代计算RTO时:

R T T S = R T T S + α × ( R T T − R T T S ) = R T T S + α × ( R 2 − R 1 ) RTT_S=RTT_S+ α \times(RTT-RTT_S)=RTT_S+ α \times(R2 - R1) RTTS=RTTS+α×(RTTRTTS)=RTTS+α×(R2R1)

R T T d e v = ( 1 − β ) × R T T d e v + β × ( R T T − R T T S ) RTT_{dev}=(1-β) \times RTT_{dev}+β \times (RTT-RTT_S) RTTdev=(1β)×RTTdev+β×(RTTRTTS)

R T O = μ × R T T S + ∂ × R T T d e v RTO = μ \times RTT_S+∂ \times RTT_{dev} RTO=μ×RTTS+×RTTdev

其中:R2 是新测量的 RTT
RTTS 是计算平滑的 RTTRTTdev 是计算平滑的 RTT 与 最新 RTT 的差距。
在 Linux 下, α = 0.125 α = 0.125 α=0.125 β = 0.25 β = 0.25 β=0.25 μ = 1 μ = 1 μ=1 ∂ = 4 ∂ = 4 =4。是大量实验中调出来的。

(2)快速重传

TCP 还有另外⼀种快速重传(Fast Retransmit)机制,它基于接收端的反馈信息来引发重传,而非重传计时器超时。
在这里插入图片描述
在上图,发送方发出了 1,2,3,4,5 份数据:

第一份 seq1 先送到了,于是就 ack 回 2;
结果 seq2 因为某些原因没收到,seq3 到达了,于是还是 ack 回 2;
后面的 seq4 和 seq5 都到了,但还是ack 回 2,因为 seq2 还是没有收到;
发送端收到了三个 ack = 2 的确认,知道了 seq2 还没有收到,就会在定时器过期之前,重传丢失的 seq2。
最后,收到了 seq2,此时因为 seq3,seq4,seq5 都收到了,于是ack 回 6 。
所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。

快速重传机制解决了超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传一个,还是重传所有的问题。

(3)选择确认重传 SACK

改进的方法就是 SACK(Selective Acknowledgment)。

在TCP头部的**选项(Options)**字段中,添加了选择性确认(SACK)选项。通过SACK,接收方可以返回最近收到的报文段的序列号范围,使发送方能够准确知道哪些数据包已经成功接收,哪些数据包尚未到达。

有了这些信息,发送端只需重传丢失的数据包,而不是整个数据流,从而提高了重传的精确性和效率。

举例:
现在先后发送了1 ~ 5,5个数据包的数据,如果此时发送第2个数据包时数据丢失,而其余4个数据包都收到了接收方的确认信息,那么此时根据SACK可以判断出只有第二个数据包丢失,而1、3、4、5数据包已被接收,此时可以只重新发送第2个数据包。

(4)DSACK

DSACK,即重复 SACK(Duplicate Selective Acknowledgment),这个机制是在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了。DSACK 的目的是帮助发送方判断,是否发生了包失序、ACK 丢失、包重复或伪重传。让 TCP 可以更好的做网络流控。

3. 流量控制

为避免触发重发机制和避免网络流量浪费,发送方需要考虑接收方的处理能力。如果发送方持续发送数据给接收方而后者无法及时处理,将导致重发机制触发,进而浪费网络资源。为此,TCP引入了流量控制机制。

通过流量控制,发送方可以根据接收方当前的接收能力来动态调整发送的数据量,避免过载接收方而导致数据丢失或延迟,从而优化整个网络通信的效率和可靠性。

一句话总结一下,流量控制就是:让发送方慢点 ,要让接收方来得及接收。

(1)流量控制

TCP利用 滑动窗口 机制实现流量控制。

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方) ,发送方的发送窗口接收窗口 rwnd 和拥塞窗口cwnd 的最小值。

例子如下:

A向B发送数据,连接建立时,B告诉A:“我的rwnd=400(字节)”,设每一个报文段100B,报文段序号初始值为1
在这里插入图片描述

(2)窗口关闭

TCP 通过让接收方指明滑动窗口的大小来进行流量控制。如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。

当窗口关闭时,接收方在处理完数据后会发送一个非0窗口大小的ACK报文通知发送方。然而,如果这个通告窗口的ACK报文在网络中丢失,可能会导致问题。发送方会继续等待ACK确认,无法发送新的数据。如不采取措施,这种相互等待的过程,会造成了死锁的现象。

为了解决上述的死锁问题,TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器
若持续计时器设置的时间到期,就发送一个**零窗口探测 ( Window probe )**报文段 。接收方收到探测报文段时给出现在的窗口值。

若窗口仍然是0,那么发送方就重新设置持续计时器;如果不是0,则发送方可以根据窗口的大小继续发送数据,死锁的局面就被打破了。

这样通过定时地进行探测,就可以避免死锁的产生。

4. 拥塞控制

在网络拥堵时,若持续发送大量数据包,可能导致数据包时延和丢失。TCP会进行重传,然而重传会增加网络负担,导致更大的延迟和丢包。这会形成恶性循环,不断放大问题。

为了解决此问题,就有了拥塞控制的概念,拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。

拥塞控制是通过拥塞拥塞窗口实现的。

拥塞窗口(cwnd)是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。只要网络中没有出现拥塞,cwnd 就会增大; 但网络中出现了拥塞,cwnd 就减少。

常见的拥塞控制算法有慢启动拥塞避免快速恢复

(1)慢启动

在 TCP 刚刚连接好并开始发送TCP报文段时,先令拥塞窗口 cwnd=1,即一个最大报文段长度 MSS。每收到一个对新报文段的确认后,将 cwnd 加1,即增大一个 MSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可使分组注入网络的速率更加合理。

例如:
A 向 B发送数据,发送时 A的拥塞窗口为 1,那么A一次可以发送1个 TCP 报文段,经过一个RTT后(也称一个传输轮次),A收到B对刚才1个报文的确认,于是把拥塞窗口调整为 2,下一次发送时就可一次发送2个报文段。
第二轮数据发送时,发送时 A的拥塞窗口为 2,那么A一次可以发送2个 TCP 报文段,经过一个RTT后(也称一个传输轮次),A收到B对刚才2个报文的确认,于是把拥塞窗口调整为 4,下一次发送时就可一次发送4个报文段。
在这里插入图片描述

(2)拥塞避免

慢启动算法,发包的个数是指数性的增长,这样拥塞窗口的增长速度会过快,所以需要拥塞避免算法来降低拥塞窗口的增长速度。

拥塞避免算法的做法如下:

发送端的拥塞窗口 cwnd 每经过一个往返时延 RTT就增加1个 MSS的大小,而不是加倍,使cwnd 按线性规律缓慢增长(即加法增大)。

可以通过 慢启动门限 ssthresh(slow start threshold)状态变量,来决定慢启动算法和拥塞避免算法的使用。

  • 当 cwnd<ssthresh 时,使用慢开始算法。
  • 当 cwnd>ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  • 当cwnd= ssthresh 时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)。

在这里插入图片描述

(3)拥塞发生的处理

网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(未按时收到确认,重传计时器超时),就要把慢开始门限ssthresh 设置为出现拥塞时的发送方的 cwnd 值的一半(但不能小于 2)。然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。

这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。

拥塞避免并不能完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

在这里插入图片描述

(4)快速重传与快速恢复

当拥塞发生时,如果将拥塞窗口直接设置为1,并重新开始慢启动,是会突然减少数据流的。但是这种方式太激进了,反应也很强烈,会造成网络卡顿。

所以提出了快速恢复算法。

在这里插入图片描述

三、用户数据报协议(UDP)

用户数据报协议(User Datagram Protocol,UDP)又称用户数据包协议,是一个简单的是一种无连接的、不保证可靠的、面向数据包的传输层通信协议,位于OSI模型的传输层。

该协议由 David P. Reed 在1980年设计且在RFC 768中被规范。典型网络上的众多使用 UDP 协议的关键应用在一定程度上是相似的。

在 TCP/IP 模型中,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据包协议)。UDP 在 IP 数据包的头部仅仅加入了复用和数据校验字段。

1. UDP 的特点

  1. UDP是无连接的,减少开销和发送数据之前的时延。
  2. UDP使用最大努力交付,即不保证可靠交付
  3. UDP是面向报文的,适合一次性传输少量数据的网络应用。
  4. UDP无拥塞控制,适合很多实时应用。
  5. UDP首部开销小,8B,TCP20B。

2. UDP 报文

在这里插入图片描述

  • 源端口(Source Port):16 bits,通过一个端口号告诉 TCP报文来自于哪个进程。
  • 目标端口(Destination Port):16 bits,通过一个端口号告诉 TCP报文要发给哪个进程。
  • 包长度(Length):16 bits,该字段保存了 UDP 首部的长度跟数据的长度之和。
  • 校验和(Checksum):16 bits,校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包。

四、TCP 与 UDP 区别

1.TCP 与 UDP 区别

  1. 面向连接:TCP 是面向连接的传输层协议,传输数据前先要建立连接。UDP 是不需要连接,即刻传输数据;
  2. 服务对象:TCP 是一对一的两点服务,即一条连接只有两个端点。UDP 支持一对一、一对多、多对多的交互通信;
  3. 可靠传输:TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。UDP 是尽最大努力交付,不保证可靠交付数据,但是我们可以基于 UDP 传输协议实现一个可靠的传输协议,QUIC 协议;
  4. 拥塞控制、流量控制:TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率;
  5. 传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多;
  6. 首部开销:TCP首部开销20字节。UDP首部开销8字节;
  7. 传输方式:TCP 是流式传输,没有边界,但保证顺序和可靠。UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。

2.TCP 与 UDP 应用场景

  • 由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于: FTP 文件传输; HTTP / HTTPS;
  • 由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于: 包总量较少的通信,如 DNS 、SNMP 等; 视频、音频等多媒体通信; 广播通信;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++初阶(十五)--STL--list 的深度解析与全面应用

文章目录 一、头文件与基本概念 二、构造函数和析构函数 1.构造函数 2.析构函数 三、元素访问 front back 四、迭代器相关函数 begin end rebegin&#xff08;反向迭代器&#xff09; rend&#xff08;反向迭代器&#xff09; 五、容量相关函数 empty size max…

企业数智化新纪元,安全体系保驾护航

随着云计算、大数据、人工智能等技术的不断发展成熟&#xff0c;企业数智化建设进入到了深水区&#xff0c;网络安全已经成为企业发展最重要的基石。企业如何更好地拥抱先进生产力、构建强大的安全体系、重塑企业核心竞争力&#xff0c;是每一位技术决策者需要认真思考和解决的…

学Linux的第九天--磁盘管理

目录 一、磁盘简介 &#xff08;一&#xff09;、认知磁盘 &#xff08;1&#xff09;结构 &#xff08;2&#xff09;物理设备的命名规则 &#xff08;二&#xff09;、磁盘分区方式 MBR分区 MBR分区类型 扩展 GPT格式 lsblk命令 使用fdisk管理分区 使用gdisk管理分…

QT实现拷贝复制文件操作 QT5.12.3环境 C++实现

案例需求&#xff1a;利用QT线程操作&#xff0c;实现拷贝复制文件操作 代码&#xff1a; myfile.h #ifndef MYFILE_H #define MYFILE_H#include <QObject> #include <QDebug> #include <QThread> #include <QFile> #include <QtWidgets> class…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea&#xff0c;找到连接中 文件&#xff0c;卸载即可。

Jenkins-Git Parameter 插件实现指定版本的发布和回滚

在上一篇文章的基础设置上进行 1. 机器准备 开发10.0.0.204gitlab10.0.0.201jenkins10.0.0.200web10.0.0.202 2. 开发主机 在开发机器上修改不同版本的前端页面&#xff0c;并打上标签 第一次修改 [rootdev wheel]#vim index.html [rootdev wheel]#git commit -am "1…

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

《剖析 Spring 原理:深入源码的旅程(二)》

六、Spring 的 Bean 注入与装配 Spring 的 Bean 注入与装配的方式有很多种&#xff0c;可以通过 xml、get set 方式、构造函数或者注解等。简单易用的方式就是使用 Spring 的注解&#xff0c;Spring 提供了大量的注解方式&#xff0c;如 Autowired、Qualifier 等。Spring 还支持…

Git的使用_仓库管理_CI/CD介绍

文章目录 一、Git的基础知识一-1、什么是GitLinux命令行的git的简易安装Git项目的组成Git的基本工作流程Git文件的三种状态 一-2、存储库远程存储库与本地存储库创建存储库git init命令的使用方法1. 初始化一个新的 Git 仓库2. 在指定目录初始化一个新的 Git 仓库3. 初始化一个…

Android 实现悬浮球的功能

Android 实现悬浮球的功能 在 Android 中&#xff0c;实现悬浮球可以通过以下方式实现&#xff0c;常见的方法是使用 WindowManager 创建一个悬浮窗口。以下是具体的实现步骤&#xff1a; 1. 配置权限 在 AndroidManifest.xml 中添加悬浮窗权限&#xff1a; <uses-permis…

C语言数据结构学习:循环队列

C语言 数据结构学习 汇总入口&#xff1a; C语言数据结构学习&#xff1a;[汇总] 1. 循环队列 队列的博客&#xff1a;C语言数据结构学习&#xff1a;队列 循环队列会预先定义最大队列空间&#xff0c;然后定义一个数组&#xff0c;通过队列头和队列尾指针分别指向开头和结尾&…

Java教程:SE进阶【十万字详解】(下)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

37_U-Net网络详解

1.U-Net 网络概述 U-Net 是一种深度学习模型&#xff0c;广泛用于图像的语义分割任务。U-Net 网络的结构特别适合医学影像分割&#xff0c;尤其在少量训练数据的情况下表现优异。该网络由一个编码器-解码器架构组成&#xff0c;具有对称的“U”形结构&#xff0c;因此得名为 U…

mysql-分析MVCC原理

一、MVCC简介 MVCC是一种用来解决读写冲读的无锁并发控制&#xff0c;也就是为事务分配单增长的时间戳&#xff0c;为每个修改保存一个版本&#xff0c;版本与事务时间戳关联&#xff0c;读操作只读该事务开始前的数据库的快照&#xff0c;所以MVCC可以为数据库解决一些问题。…

【CSP CCF记录】201812-2第15次认证 小明放学

题目 样例1输入 30 3 30 8 0 10 1 5 0 11 2 2 0 6 0 3 3 10 0 3 样例1输出 30 3 30 8 0 10 1 5 0 11 2 2 0 6 0 3 3 10 0 3 思路 参考&#xff1a;CCF小白刷题之路---201812-2 小明放学&#xff08;C/C 100分&#xff09;_小明放学测试数据-CSDN博客 我们使用一个for循环计算…

Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

计算机网络-VPN虚拟专用网络概述

前面我们学习了在企业内部的二层交换机网络、三层路由网络包括静态路由、OSPF、IS-IS、NAT等&#xff0c;现在开始学习下VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网络&#xff09;&#xff0c;其实VPN可能很多人听到第一反应就是梯子&#xff0c;但是其实这…

《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍

经过近一周的USART学习&#xff0c;我深刻体会到通信对单片机的重要性。它就像人类的手脚和大脑&#xff0c;只有掌握了通信技术&#xff0c;单片机才能与外界交互&#xff0c;展现出丰富多彩的功能&#xff0c;变得更加强大和实用。 单片机最基础的“语言”是二进制。可惜&am…

【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 蓝桥杯C/C 文章目录 &#x1f4af;前言&#x1f4af;C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 &#x1f4af; std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::s…

初识Linux—— 基本指令(下)

前言&#xff1a; 本篇继续来学习Linux的基础指令&#xff0c;继续加油&#xff01;&#xff01;&#xff01; 本篇文章对于图片即内容详解&#xff0c;已同步到本人gitee&#xff1a;Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat ​ cat 查看文件…