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

计算机网络-运输层

重点内容:

运输层 是整个网络体系结构中的关键层次之一。一定要弄清以下一些重要概念:
(1) 运输层为相互通信的应用进程提供逻辑通信。
(2) 端口和套接字的意义。
(3) 无连接的 UDP 的特点。
(4) 面向连接的 TCP 的特点。
(5) 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和 ARQ 协议。
(6) TCP 的滑动窗口、流量控制、拥塞控制和连接管理。

目录

重点内容:

一.运输层协议概述

1.1进程间的通行

1.2运输层的两个主要协议

1.3运输层端口

端口号分类

二.用户数据报协议UDP 

2.1UDP的特点

2.2UDP的首部格式

三.传输控制协议TCP

3.1TCP的特点

套接字

3.2TCP首部格式

 

3.3可靠传输的工作原理

3.3.1停止等待协议

3.3.2连续ARQ协议

3.4可靠传输的实现

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

3.4.2超时重传时间的选择

3.4.3选择确认SACK

3.5流量控制

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

3.5.2TCP传输效率

3.6拥塞控制

3.6.1拥塞控制基础概念和对比了解

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

 3.6.2拥塞控制算法

1.慢开始和拥塞避免

慢开始

拥塞避免算法

快重传

​3.6.3主动队列管理AQM

3.7TCP运输连接管理

3.7.1TCP连接建立

3.7.2TCP连接释放


一.运输层协议概述

1.1进程间的通行

通信是:这台主机中的一个进程 和另一台主机中的一个 进程 在交换数据。
        IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程
        所以,
同时,

1.2运输层的两个主要协议

TCP/IP 运输层的两个主要协议都是互联网的正式标准,即:
(1) 用户数据报协议 UDP (User Datagram Protocol) [RFC 768]
(2) 传输控制协议 TCP (Transmission Control Protocol) [RFC 793]

 

1.3运输层端口

复用:应用层所有的应用进程都可以通过运输层再传送到 IP 层(网络层)
分用:运输层从 IP 层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程

那么我们已经知道运输层需要将数据交付至应用进程,怎么做呢?

1.使用PID计算机操作系统所指派的这种进程标识符来标志 X

——互联网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。(不同操作系统格式不同)

2.把一个特定机器上运行的特定进程,指明为互联网上通信的最后终点 X

——这是因为进程的创建和撤销都是动态的,通信的一方几乎无法识别对方机器上的进程。

最终解决方案:在运输层使用协议端口号(protocol port number),或通常简称为端口(port)

硬件端口和软件端口的区别:
硬件端口 不同硬件设备 进行交互的接口,而 软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的 IP 地址(为了找到对方的计算机),而且要知道对方的端口号。

端口号分类

二.用户数据报协议UDP 

用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用分用的功能以及差错检测的功能。

2.1UDP的特点

(1) UDP 无连接 ,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2) UDP 使用 尽最大努力交付 ,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。
(3) UDP 面向报文 的。对于应用层交下来的报文既不合并,也不拆分,即一次交付一个完整的报文

(4) UDP 没有拥塞控制(相对于TCP来说),因此网络出现的拥塞不会使源主机的发送速率降低。 

(5) UDP 支持一对一、一对多、多对一和多对多的交互通信。
(6) UDP 的首部开销小 ,只有 8 个字节,比 TCP 20 个字节的首部要短。

2.2UDP的首部格式

        伪首部——只是在计算检验和时,临时添加,伪首部既不向下传送,也不向上递交,而仅仅是为了计算检验和。

        UDP计算检验和的方法和计算 IP 数据报首部检验和的方法相似(都是用二进制反码计算求和)。但是IP 数据报的检验和只检验 IP 数据报的首部,但 UDP 的检验和是把首部和数据部分一起都检验

UDP校验和计算:

若 UDP 用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字节不发送)。

伪首部的第 3 字段是全零;第 4 字段是 IP 首部中的协议字段的值。对于 UDP ,此协议字段值为 17 ;第 5 字段是 UDP 用户数据报的长度。因此,这样的检验和,既检查了 UDP 用户数据报的源端口号和目的端口号以及 UDP 用户数据报的数据部分,又检查了 IP 数据报的源 IP 地址和目的地址。

三.传输控制协议TCP

3.1TCP的特点

(1) TCP 面向连接的运输层协议 。(UDP面向报文)
(2) 每一条 TCP 连接只能有两个 端点 (endpoint) ,每一条 TCP 连接只能是 点对点 的(一对一)。
(3) TCP 提供 可靠交付 的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达
(4) TCP 提供 全双工通信 。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
(5) 面向字节流。TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
TCP 并不关心应用进程一次把多长的报文发送到 TCP 的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。【 流量控制、拥塞控制

套接字

TCP 连接的端点叫做套接字 (socket)

3.2TCP首部格式

(1) 源端口目的端口,各2B,分用的实现

(2) 序号,4B,序号使用 mod 2^{32}运算。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。

(3) 确认号,4B,是 期望收到对方下一个报文段的第一个数据字节的序号
若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。

 (4) 数据偏移,4bit, 指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。所以首部最长为60B

(5) 保留, 6 位,保留为今后使用,但目前应置为 0
(6) 紧急 URG (URGent),1bit,  URG = 1 时,表明紧急指针字段有效。
URG 1 时,TCP 就把紧急数据插入到本报文段数据的 最前面。

(7) 紧急指针,2B,紧急指针仅在 URG = 1 时才有意义。指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)

(8) 确认 ACK (ACKnowledgment),1bit,仅当 ACK = 1 时确认号字段才有效。当 ACK = 0时,确认号无效。TCP 规定, 在连接建立后所有传送的报文段都必须把 ACK 置 1
(9) 推送 PSH (PuSH),1bit,PSH位为1时尽快地(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
(10) 复位 RST (ReSeT),1bit,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因), 必须释放连接,然后再重新建立运输连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个连接。RST 也可称为重建位或重置位。
(11) 同步 SYN (SYNchronization),1bit,SYN 置为 1 就表示这是一个连接请求或连接接受报文。
(12) 终止 FIN (FINis ,意思是“完”、“终” ) 用来释放一个连接。
(13) 窗口, 1bit, 可以理解为当前接收方可使用的缓存大小(以字节为单位)
(14) 检验和,2B, 同样需要构建伪首部
(15) 选项 长度可变,最长可达 40 字节。
可选的典型选项
1.窗口扩大选项
2. 时间戳选项,
3.SACK,选择确认选项,指定数据重传范围

3.3可靠传输的工作原理

但是实际网络无法满足以上两个条件,这样一来我们就需要。

3.3.1停止等待协议

即收到接收方确认后才继续发送下一个分组。

 那么要是没有收到确认,则超时重传

如果接收方的确认丢失或是延迟了,导致超时重传

则接收方在接受到重复分组的时候将其丢弃,并再次发送确认

从信道利用率角度来说, 

3.3.2连续ARQ协议

维护一个发送窗口,采用累计确认的方式

3.4可靠传输的实现

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

现假定 A 收到了 B 发来 的确认报文段,其中窗口是 20 字节,而确认号是 31 (这表明 B 期望收到的下一个序号是 31 ,而序号 30 为止的数据已经收到了)。根据这两个数据,A 就构造出自己的发送窗口

~凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。 

~发送方的发送窗口大小还要受到当时网络拥塞程度的制约

~发送窗口后沿不可能向后移动,因为不能撤销掉已收到的确认。但是发送窗口前沿也有可能向后收缩

举例说明

假定 A 发送了序号为 31 ~ 41 的数据,

要描述一个发送窗口的状态需要三个指针:P1,P2 和 P3

发送窗口通常只是发送缓存的一部分。已被确认的数据应当从发送缓存中删除,因此发送缓存和发送窗口的后沿是重合的。(后沿指最左边)

3.4.2超时重传时间的选择

由于 TCP 的下层是互联网环境,发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个 IP 数据报所选择的路由还可能不同。如果把超时重传时间设置得太短,就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大,降低了传输效率。
1.确定RTT(round trip time)
TCP 保留了 RTT 的一个 加权平均往返时间 RTT S (这又称为 平滑的往返时间 S 表示 Smoothed
显然,超时计时器设置的 超时重传时间 RTO (RetransmissionTime-Out) 应略大于上面得
出的加权平均往返时间 RTT S
2.计算RTO(RetransmissionTime-Out)
RTT_D 是 RTT 的偏差的加权平均值, 它与 RTT S 和新的 RTT 样本之差有关。
那么 RTT_D如何计算呢?
当第一次测量时, RTT_D 值取为测量到的 RTT 样本值的一半。
在以后的测量中,则使用下式计算加权平均的 RTT_D

现在我们已经知道了RTO的计算方法,但是这是在一切正常情况下(不出现确认丢失...)的理想方法 ,但如果出现超时重传的情况——如何判定此确认报文段是对先发送的报文段的确认,还是对后来重传的报文段的确认?

        
        由于重传的报文段和原来的报文段完全一样,因此源主机在收到确认后,就无法做出正确的判断,而正确的判断对确定加权平均 RTTS的值关系很大。
        若收到的确认是对重传报文段的确认,但被源主机当成是对原来的报文段的确认,则这样计算出的 RTTS 和超时重传时间 RTO 就会偏大。若后面再发送的报文段是经过重传后才收到确认报文段,则按此方法得出的超时重传时间 RTO 就越来越长
        
        同样,若收到的确认是对原来的报文段的确认,被当成是对重传报文段的确认,则
由此计算出的 RTT S RTO 都会偏小。这就必然导致报文段过多地重传。这样就有可能使
RTO 越来越短

3.4.3选择确认SACK

TCP 的接收方在接收对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块(如图 5-21 所示)。
如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确( 即不连续的左右边界 )地告诉发送方,使发送方不要再重复发送这些已收到的数据。

        但是,TCP 的首部没有哪个字段能够提供上述这些字节块的边界信息。所以只能够在首部的扩展选项中指明。但是首部最长60B,固定20B,剩下40B可用。

        

        RFC 2018 规定,如果要使用选择确认 SACK,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加 上“允许 SACK ”的选项,而双方必须都事先商定好
        由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节(因为序号有 32 位,需要使用 4 个字节表示),因此在选项中最多只能指明 4 字节块的边界信息。这是因为 4 个字节块共有 8 个边界,因而需要用 32 个字节来描述。另外还需要两个字节。一个字节用来指明是 SACK 选项,另一个字节是指明这个选项要占用多少字节。如果要报告五个字节块的边界信息,那么至少需要 42 个字节。

3.5流量控制

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

        一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制 (flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
实例:
rwnd是接收窗口,假设初始状态rwnd=400
        我们应注意到,接收方的主机 B 进行了三次流量控制。第一次把窗口减小到 rwnd = 300 ,第二次又减到 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。
        现在我们考虑一种情况。在图 5-22 中, B A 发送了零窗口的报文段后不久 B 的接收缓存又有了一些存储空间。于是 B A 发送了 rwnd = 400 的报文段。然而这个报文段在 传送过程中丢失了。A 一直等待收到 B 发送的非零窗口的通知,而 B 也一直等待 A 发送的 数据。如果没有其他措施,这种互相等待的 死锁 局面将一直延续下去。

3.5.2TCP传输效率

3.6拥塞控制

3.6.1拥塞控制基础概念和对比了解

在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞 (congestion)
拥塞控制和流量控制的区别

1. 作用目标不同

  • 流量控制
    流量控制的目标是解决发送方与接收方之间的速率匹配问题,防止发送方以过快的速度发送数据,从而超出接收方的处理能力。
    对象:发送方与接收方之间的通信。

  • 拥塞控制
    拥塞控制的目标是解决网络中整体资源的合理分配问题,防止网络中的路由器或链路发生拥塞(数据流量超过网络承载能力)。
    对象:整个网络环境中的流量调节。


2. 发生的原因不同

  • 流量控制的主要原因是:

    • 接收方的缓存容量有限,无法处理过多的接收数据。
    • 接收方处理数据的速度较慢,可能出现数据丢失或丢弃。
  • 拥塞控制的主要原因是:

    • 网络中链路带宽或路由器缓存不足,导致拥塞。
    • 多条数据流同时通过同一段链路,造成资源争夺和延迟增加

3. 解决机制不同

流量控制机制(点对点)

流量控制通常通过协议来调节发送方的发送速率,使其适应接收方的处理能力。常见的流量控制方法有:

  1. 停止-等待协议

    • 发送方每次发送一个数据段,等待接收方确认,只有收到确认后才能继续发送。
  2. 滑动窗口协议

    • 接收方会通知发送方一个窗口大小,表示当前能接收的数据量。发送方只能在窗口范围内发送数据,超过窗口大小的发送会被暂停。
  3. 显式反馈

    • 接收方主动向发送方发送控制信息,告知其当前的缓冲区状态和接受能力。

拥塞控制机制(全局范围)

拥塞控制的重点是调节整个网络中的流量,以防止链路和路由器拥塞。常见的拥塞控制方法有:

  1. TCP 拥塞窗口

    • TCP 使用一个**拥塞窗口(cwnd)**来限制发送方可以发送的数据量。
    • 拥塞窗口的大小动态调整,主要算法包括:
      • 慢启动:初始阶段窗口指数增长。
      • 拥塞避免:窗口线性增长,逐步探测网络容量。
      • 快速重传和快速恢复:丢包时快速减小窗口,避免严重拥塞。
  2. 主动队列管理(AQM)

    • 在路由器中,通过主动丢弃分组(如 RED 算法)来警告发送方减小发送速率。
  3. 显式拥塞通知(ECN)

    • 路由器检测到拥塞时,在数据包头中设置标志位,通知发送方减少流量。

4. 影响范围不同

  • 流量控制

    • 只在发送方和接收方之间起作用,属于点对点的局部控制。
  • 拥塞控制

    • 作用于整个网络,调整网络中所有流量发送方的速率,属于全局控制。

下面详细介绍如何进行拥塞控制:

 3.6.2拥塞控制算法

1.慢开始和拥塞避免
下面讨论的拥塞控制也叫做 基于窗口 的拥塞控制
发送方控制拥塞窗口的原则是:
        只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。
慢开始

由小到大逐渐增大拥塞窗口数值。

1.初始拥塞窗口设置

2.增加规则

实例:

但是现在又出现了一个问题,cwnd的过量增长导致网络拥塞。所以我们设置一个慢开始门限 ssthresh,并且结合拥塞避免算法。

拥塞避免算法

实例:

 初始阶段我们设置慢门限=16

并且在经过4号状态的时候,拥塞窗口并没有回到慢开始的初始状态,而是大于慢开始的初始窗口,这就涉及到了我们的快重传算法

快重传
采用快重传算法可以让发送方 尽早知道发生了个别报文段的丢失
        现假定接收方没有收到 M 3 但却收到了 M 4 。本来接收方可以什么都不做。但按照快重传算法,接收方必须立即发送对 M 2 的重复确认 ,以便让发送方及早知道接收方没有收到报文段 M 3 。发送方接着发送 M 5 M 6 。接收方收到后也仍要再次分别发出对 M 2 的重复确认。
        快重传算法规定, 发送方只要一连收到 3 个重复确认 就知道接收方确实没有收到报文段 M 3 因而应当立即进行重传(即“快重传”) ,这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。

 3.6.3主动队列管理AQM

上一节讨论的 TCP 拥塞控制并没有和网络层采取的策略联系起来。网络层的策略对 TCP 拥塞控制影响最大的就是路由器的分组丢弃策略

尾部丢弃策略——由于队列长度总是有限的,因此当队列已满时,以后再到达的所有分组(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃。
那么在这种策略下,当队列满的时候,如果有多个不同TCP连接的分组发送将会被丢弃,结果是分组没有发送导致确认超时,而超时后默认发生网络拥塞,调整慢开始门限,使这许多 TCP 连接在同一时间 突然都进入到慢开始状态。全局同步使得全网的通信量突然下降了很多(全局同步)
为了避免上述 全局同步的发生,通过 主动队列管理 AQM解决。
“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组。即主动丢弃分组,不多条让TCP线路同时降速。缓解总流量,但又不浪费总流量。
采用RED算法

3.7TCP运输连接管理

3.7.1TCP连接建立

简单来说,没有第三次握手可能会导致服务器资源被浪费,因为不知道客户端是否正常。

3.7.2TCP连接释放

 

B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。(四次握手的第三个报文) 。

A 在收到 B 的连接释放报文段后,必须对此发出确认。
并且A必须经过时间等待计时器(TIME-WAIT timer)设置的时间 2MSL 后,A 才进入到 CLOSED 状态。
清除“死客户端”,防止资源浪费。

相关文章:

计算机网络-运输层

重点内容: 运输层 是整个网络体系结构中的关键层次之一。一定要弄清以下一些重要概念: (1) 运输层为相互通信的应用进程提供逻辑通信。 (2) 端口和套接字的意义。 (3) 无连接的 UDP 的特点。 (4) 面向连接的 TCP 的特点。 (5) 在不可靠的网…...

TLF35584 基本介绍

1 概述 1)多电压电源芯片,包含6路输出电压。 LDO_Com:低降后调节器 5V/200mA 通信电源。LDO_C :低降后调节器 5V/600mA (TLF35584xxVS1)/3.3 V/600mA (TLF35584xxVS2) uC电源。Volt_Ref :参考电压5.0 V /- 1%/150mA …...

【Python】第四弹---深入理解Python控制流:从顺序到循环的全面解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、顺序语句 2、条件语句 2.1、什么是条件语句 2.2、语法格式 2.3、缩进和代码块 2.4、练习 2.5、空…...

PBFT算法

在我的博客中对于RAFT算法也有详细的介绍,raft算法包含三种角色,分别是:跟随者( follower ),候选人(candidate )和领导者( leader )。集群中的一个节点在某一…...

软件过程模型

软件过程概念 软件生命周期 软件过程 在工作产品构建过程中,所需完成的工作活动,动作和任务的集合。 软件过程模型 软件过程评估 能力成熟度模型(CMM) 传统软件过程模型 瀑布模型(第一个软件过程模型&#xff…...

【Ubuntu】安装SSH启用远程连接

【Ubuntu】安装OpenSSH启用远程连接 零、安装软件 使用如下代码安装OpenSSH服务端: sudo apt install openssh-server壹、启动服务 使用如下代码启动OpenSSH服务端: sudo systemctl start ssh贰、配置SSH(可跳过) 配置文件 …...

代码随想录算法【Day31】

Day31 56. 合并区间 class Solution { public://按照左边界&#xff0c;从小到大排序static bool cmp(const vector<int>& a, const vector<int>& b){return a[0] < b[0];} ​vector<vector<int>> merge(vector<vector<int>>…...

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;其安装后会默认开启ajp连接器&#xff0c;方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发…...

C#高级:常用的扩展方法大全

1.String public static class StringExtensions {/// <summary>/// 字符串转List&#xff08;中逗 英逗分隔&#xff09;/// </summary>public static List<string> SplitCommaToList(this string data){if (string.IsNullOrEmpty(data)){return new List&…...

麒麟操作系统基础知识保姆级教程(二十一)进入单用户模式

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在咱们运维工作中&#xff0c;服务器的密码长度&#xff0c;密码复杂度&#xff0c;修改时间&#xff0c;超时时间&#xff0c;用户权限管理&#xff0c;root直接远程连接&#xff0c;普通用户su到r…...

基于C语言的数组从入门到精通

简介:本篇文章主要介绍了一维数组,二维数组,字符数组的定义,数组的应用,数组的核心代码解析,适用于0基础的初学者. C语言数组 1.一维数组 1.1定义 1.1.1声明 语法:数据类型 数组名[数组大小];示例:int arr[5]; 1.1.2初始化 a.静态初始化 完全初始化&#xff1a;int arr[5] {1…...

CLOUDFLARE代理请求重定向你太多次

现象 使用CLOUDFLARE代理前请求正常&#xff0c;使用CLOUDFLARE代理请求后出现 原因分析 以下是我的猜测&#xff0c;在默认情况下 CLOUDFLARE代理&#xff0c;可能是直接请求我们服务器的IP&#xff0c;比如&#xff1a;http://1.1.1.1 而不是通过域名的方式&#xff08;如…...

算法随笔_21:字符的最短距离

上一篇:算法随笔_20:区间子数组个数 -CSDN博客 题目描述如下: 给你一个字符串 s 和一个字符 c &#xff0c;且 c 是 s 中出现过的字符。 返回一个整数数组 answer &#xff0c;其中 answer.length s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 …...

第19个项目:蛇年特别版贪吃蛇H5小游戏

下载地址:https://download.csdn.net/download/mosquito_lover1/90308956 游戏玩法: 点击"开始游戏"按钮开始 使用键盘方向键控制蛇的移动 吃到红色食物可以得分 撞到墙壁或自己会结束游戏 核心源码: class SnakeGame { constructor() { this.canvas = docum…...

Vue3 30天精进之旅:Day01 - 初识Vue.js的奇妙世界

引言 在前端开发领域&#xff0c;Vue.js是一款极具人气的JavaScript框架。它以其简单易用、灵活高效的特性&#xff0c;吸引了大量开发者。本文是“Vue 3之30天系列学习”的第一篇博客&#xff0c;旨在帮助大家快速了解Vue.js的基本概念和核心特性&#xff0c;为后续的深入学习…...

单值二叉树(C语言详解版)

一、摘要 今天要讲的是leetcode单值二叉树&#xff0c;这里用到的C语言&#xff0c;主要提供的是思路&#xff0c;大家看了我的思路之后可以点击链接自己试一下。 二、题目简介 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单…...

贵州端午黔粽探源:贵州味道与黔味文化与糯米的融合?

黔粽的由来? 黔粽的贵州味道?探索贵州“黔味文化”找寻答案! 黔粽的特色由来与贵州味道 贵州粽,简称黔粽。黔粽的主要特色是“酸辣”,以其独特的“酸辣”口味和地域特色,与浙粽、京粽、粤粽、川粽、云粽、闽粽、台湾粽并列为“全国八大粽子派别”之一,并与甜味粽、咸味粽共…...

【Project】CupFox电影网站数据爬取分析与可视化

数据采集清洗与数据存储流程如下图所示。 数据分析与数据可视化流程设计如下 1.使用pymongo从数据库中查询所需的数据。对数据进行处理和分析&#xff0c;进行统计、分类、聚合等操作&#xff0c;提取关键指标和洞察。分析结果可以通过编写Python代码进一步优化、筛选和整理&a…...

Spring Boot 后端跨域解决方案:解锁前后端通信的障碍

随着前后端分离架构的普及&#xff0c;跨域资源共享&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;问题成为了许多开发者必须面对的一个挑战。当Web浏览器尝试从一个源加载资源到另一个不同的源时&#xff0c;出于安全考虑&#xff0c;它会实施同源策略&#xf…...

Linux如何设置用户登录超时(/etc/profile)

Linux如何设置用户登录超时(/etc/profile) 1. 针对所有用户 # vi /etc/profile ... export TMOUT900 # 设置闲置时间为15分钟&#xff0c;单位为秒;如果没有此行则直接添加进去 ... vi /etc/profile TMOUT18000000000000 export QT_IM_MODULEfcitx readonly TMOUT expor…...

Elastic Cloud Serverless 获得主要合规认证

作者&#xff1a;来自 Elastic Oliver Mao 我们很高兴地宣布&#xff0c;Elastic Cloud Serverless 已获得多项重要的合规性认证。这一里程碑加强了我们对安全性、隐私性和法规遵从性的承诺。Elastic Cloud Serverless 现已通过以下行业领先框架的审核或认证&#xff1a;SOC 2 …...

渐变颜色怎么调?

渐变颜色的调整是设计中非常重要的一部分&#xff0c;尤其是在创建具有视觉吸引力和深度感的设计作品时。以下是一些在不同设计软件中调整渐变颜色的详细步骤和技巧&#xff1a; 一、Adobe Photoshop 1. 创建渐变 打开渐变工具&#xff1a; 选择工具栏中的“渐变工具”&#x…...

DDD该怎么去落地实现(1)关键是“关系”

DDD落地的关键是“关系” 这些年&#xff0c;我认为DDD走到了一个死胡同里了&#xff0c;因为落地实现过于困难。很多团队在经过一段时间的学习&#xff0c;清楚理解了DDD那些晦涩的概念&#xff0c;根据业务绘制出领域模型&#xff0c;这都不困难。但绘制领域模型不是我们最终…...

基于本地事务表+MQ实现分布式事务

基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、本地启动rocketmq4、代码实现及验证4.1、核心代码4.2、代码执行流程4.3、项目结构4.4、项目源码 引言 本地消息表的方案最初由ebay的工程师提出&#xff0c;核心思想是将分布式事务拆分成本地事务进行处理。…...

第17篇:python进阶:详解数据分析与处理

第17篇&#xff1a;数据分析与处理 内容简介 本篇文章将深入探讨数据分析与处理在Python中的应用。您将学习如何使用pandas库进行数据清洗与分析&#xff0c;掌握matplotlib和seaborn库进行数据可视化&#xff0c;以及处理大型数据集的技巧。通过丰富的代码示例和实战案例&am…...

S4 HANA Tax相关的定价过程

本文主要介绍在S4 HANA OP中Tax相关的定价过程相关设置。具体请参照如下内容&#xff1a; 目录 1. 定义定价过程(OBYZ) 2. 将定价过程分配给国家(OBBG)​编辑​编辑 3. 新增Transaction Key(OBCN) 1. 定义定价过程(OBYZ) 定价过程就是为了将“条件类型”和“事务”关联起来…...

Linux下php8安装phpredis扩展的方法

Linux下php8安装phpredis扩展的方法 下载redis扩展执行安装编辑php.ini文件重启php-fpmphpinfo 查看 下载redis扩展 前提是已经安装好redis服务了 php-redis下载地址 https://github.com/phpredis/phpredis 执行命令 git clone https://github.com/phpredis/phpredis.git执行…...

K8S 启动探测、就绪探测、存活探测

先来思考一个问题&#xff1a; 在 Deployment 执行滚动更新 web 应用的时候&#xff0c;总会出现一段时间&#xff0c;Pod 对外提供网络访问&#xff0c;但是页面访问却发生404&#xff0c;这个问题要如何解决呢&#xff1f;学完今天的内容&#xff0c;相信你会有自己的答案。 …...

rust学习-rust中的保留字

rust学习-rust中的保留字 已使用的保留字未来可能使用的保留字 保留字是语言中预定义的标识符&#xff0c;不能用作变量名、函数名或其他自定义标识符&#xff0c;Rust的保留字大致可以分为两类&#xff1a;已使用的保留字和未来可能使用的保留字 已使用的保留字 as&#xff1…...

-bash: ./uninstall.command: /bin/sh^M: 坏的解释器: 没有那个文件或目录

终端报错&#xff1a; -bash: ./uninstall.command: /bin/sh^M: 坏的解释器: 没有那个文件或目录原因&#xff1a;由于文件行尾符不匹配导致的。当脚本文件在Windows环境中创建或编辑后&#xff0c;行尾符为CRLF&#xff08;即回车和换行&#xff0c;\r\n&#xff09;&#xf…...

【C】memory 详解

<memory.h> 是一个 C 标准库头文件&#xff0c;提供了一组内存管理函数&#xff0c;用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块&#xff0c;是早期 C 编程中常用的内存操作工具。 尽管在现代 C 编程中更推荐使用<cstring>或<memory&…...

Android实训九 数据存储和访问

实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储&#xff0c; 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面&#xff0c;实现以下功能&#xff1a; 1&#xff…...

Redis vs. 其他数据库:深度解析,如何选择最适合的数据库?

一、如何为项目选择合适的数据库&#xff1f; 选择合适的数据库是一个复杂的过程&#xff0c;需要综合考虑多个因素。下面几个维度来详细阐述&#xff1a; 1.数据模型 关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;适用于高度结构化、关联性强的数据&#xff0c;如电…...

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…...

C++实现设计模式---桥接模式 (Bridge)

桥接模式 (Bridge) 桥接模式 是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。桥接模式的核心思想是使用组合&#xff08;而非继承&#xff09;来扩展功能。 意图 将抽象部分与实现部分分离&#xff0c;使它们都可以独立地变…...

LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统

单纯仅靠LLM会产生误导性的 “幻觉”&#xff0c;训练数据会过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generati…...

pycharm 运行远程环境问题 Error:Failed to prepare environment.

问题排查 拿到更详细的报错信息&#xff1a; Help > Diagnostic Tools > Debug Log Settings section: 添加下面的配置 com.intellij.execution.configurations.GeneralCommandLine 重显报错&#xff0c;我这里是再次运行代码打开 Help | Collect Logs and Diagnosti…...

Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250124

逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/1UWVY11Q1IOfME9itDN5aZA?pwdhgeg 提取码: hgeg Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交与逐笔委托的详细数据&#xff0c;这种以毫秒为单位的信息能揭示许多关键点&#xff0c;如庄家意图、误导性行为…...

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…...

【Address Overfitting】解决过拟合的三种方法

目录 1. 收集更多数据实践方法&#xff1a;适用场景&#xff1a;优缺点&#xff1a; 2. 特征选择方法介绍&#xff1a;实践示例&#xff1a;适用场景&#xff1a;优缺点&#xff1a; 3. 正则化&#xff08;Regularization&#xff09;正则化类型&#xff1a;实践示例&#xff1…...

【缘于J2ME】

我与 J2ME 的不解之缘 那年我 25 岁&#xff0c;如今已即将退休。 在那个娱乐生活并不丰富的年代&#xff0c;每每响起「小霸王其乐无穷啊」&#xff0c;小伙伴们就会摩拳擦掌、轮番上阵&#xff0c;而我却痴迷于 G-BASIC 编程。 最大的乐趣就是对着仅有的两页说明&#xff0c…...

c#使用log4Net配置日志文件

1.# 写一个通用类 LogHelper using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net;namespace WindowsFormsApplication22 {public class LogHelper{static ILog mylog LogManager.GetLogge…...

[ACTF2020 新生赛]Include1

题目 点击tips后&#xff1a; 使用PHP伪协议直接读取flag /?filephp://filter/readconvert.base64-encode/resourceflag.php base64解码 拿下flag flag{6cce5a3d-997a-4c8a-ba07-f6652ee462a9}...

【数据结构】树的基本:结点、度、高度与计算

树是数据结构中一种重要的非线性结构&#xff0c;广泛应用于计算机科学的各个领域&#xff0c;例如文件系统、数据库索引、编译器等。理解树的各种性质&#xff0c;如结点数、度、高度等&#xff0c;对于解决实际问题至关重要。 本文将会探讨树的基本概念&#xff0c;以及给出几…...

1.24 共享内存和信号灯集

使用共享内存信号灯集实现两个进程之间相互对话。 程序代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stst.h> #include <fcntl.h> #…...

正则表达式以及Qt中的使用

目录 一、正则表达式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .运算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重复次数&#xff1a; 2.4 量词{} 2.5 特征标群() 2.6 或运算符 2.7 \反斜线转码特殊字符 2.8 锚点 3、简写字符 4、零宽度断言 4.1 正…...

STM32简介

STM32简介 STM32是ST公司基于ARMCortex-M内核开发的32位微控制器 &#xff08;Microcontroller&#xff09; MCU微控制器、MPU微处理器、CPU中央处理器 1.应用领域 STM32常应用于嵌入式领域。 如智能车&#xff1a;循迹小车 读取光电传感器或者摄像头的数据&#xff0c;…...

【设计模式-行为型】访问者模式

一、什么是访问者模式 说起来访问者模式&#xff0c;其实很少用。我一直在思考该用什么样的例子把这个设计模式表述清晰&#xff0c;最近突然想到一个例子也许他就是访问者。港片有过很辉煌的年代&#xff0c;小的时候一直在看港片觉得拍的非常好&#xff0c;而且演员的演技也在…...

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一&#xff0e;市场情绪 市场全天冲高回落&#xff0c;深成指、创业板指午后翻绿。大金融板块全天强势&#xff0c;天茂集团…...

docker部署jenkins

环境&#xff1a; centos7.9 jenkins/jenkins:lts-jdk11 1、拉去jenkins镜像&#xff0c;请指明版本号 [rootlocalhost ~]# docker pull jenkins/jenkins:lts 开始拉取 拉取完成 [rootlocalhost ~]# docker pull jenkins/jenkins:lts lts: Pulling from jenkins/jenkins 0a9…...