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

【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP

本文介绍了面向连接的传输协议:TCP,首先介绍 TCP 报文段的结构以及如何设置超时定时器,接着介绍 TCP 如何实现可靠数据传输以及流量控制,最后介绍 TCP 中最重要的三次握手与四次挥手的连接建立与关闭过程。

1. TCP 概述与段结构

TCP(传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议,广泛应用于互联网中,支持诸如网页浏览、文件传输、电子邮件和远程登录等需要数据可靠性保证的应用程序。其基本特性如下:

  • 面向连接:TCP 在数据传输前必须先建立连接,通常采用三次握手(three-way handshake)来完成。建立连接后,通信双方进入全双工状态,即双方可以同时发送和接收数据。
  • 可靠传输:TCP 通过为数据字节分配序列号、使用确认应答(ACK)、重传丢失的数据、以及校验和等机制来确保数据正确、有序地传输。即使 IP 层只提供不可靠的包交换,TCP 也能保证端到端的可靠性。
  • 面向字节流:TCP 将应用层传来的数据视为一连串的无结构字节流,数据在发送端可能被拆分成多个报文段传输,接收端需要根据序号将这些字节重新组装成完整的数据流。
  • 流量控制与拥塞控制:为防止发送方过快的数据流淹没接收方,TCP 采用滑动窗口机制进行流量控制。另一方面,为了防止网络过载,TCP 还引入了拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复),动态调整数据发送速率。

1.1 TCP 报文段结构

在这里插入图片描述

TCP 报文段由首部和数据两部分构成,其中首部至少 20 字节,常见字段包括:

  • 源端口号和目的端口号:各占 16 位,用于标识通信双方的应用程序端口。
  • 序列号(Sequence Number):用于标记发送的数据字节(不是报文段)在整个数据流中的位置(偏移量)。连接建立时选取一个随机初始序号(ISN),后续每发送一个字节序号递增。
  • 确认号(Acknowledgment Number):表示期望接收的下一个字节的序号,确保数据的有序确认,例如接收方发送 ACK = 555 时说明已经收到了 554 及之前的字节。
  • 数据偏移(Data Offset):指明 TCP 首部的长度,以 4 字节为单位,使得选项字段长度可变。
  • 控制标志位:包括 URG(紧急指针有效)、ACK(确认号有效)、PSH(推送数据)、RST(复位连接)、SYN(同步序列号,用于建立连接)和 FIN(终止连接)。
  • 窗口大小(Window Size):表示接收方当前能接收的数据量,用于流量控制。
  • 校验和(Checksum):对 TCP 首部和数据进行错误检测,确保传输过程中数据未被损坏。
  • 紧急指针(Urgent Pointer):仅当 URG 标志为 1 时有效,指示紧急数据的末尾。
  • 选项(Options):如最大报文段长度(MSS)、窗口缩放、时间戳、SACK 等,用于扩展 TCP 功能和优化传输性能。

1.2 TCP 往返延时和超时

往返延时(Round-Trip Time,RTT)是指数据包从发送端发出,到接收端收到该包后返回确认(ACK)所经历的总时间。RTT 反映了数据在网络中传输的实际延时情况,是 TCP 计算重传定时器的重要依据。

当发送方发出一个数据包时,会记录当前的时间戳;当收到对应 ACK 时,计算出 RTT = 当前时间 - 发送时刻。由于网络延时可能受到拥塞、路由变化等因素影响,每次测量的 RTT 可能会有较大波动。

TCP 在数据传输中需要不断监测网络的延时情况,以便合理设置超时定时器(RTO,Retransmission Timeout),从而及时重传丢失的数据。如果定时器设置的太长,可能会导致对报文段丢失的反应太慢;如果设置的太短,则可能又会产生很多不必要的重传。

TCP 为每个未确认的数据段设置一个定时器。如果在 RTO 时间内没有收到相应的 ACK,定时器触发后,TCP 将重传该数据段。

直接使用单次 RTT 样本容易受到瞬间波动的影响,因此 TCP 采用加权移动平均的方法来计算平滑往返时延(Smoothed RTT,SRTT)。常用公式为:

SRTT = (1 - α) * SRTT + α * RTT_sample

其中 α \alpha α 通常取值为 0.125。

为了反映 RTT 样本与 SRTT 之间的波动程度,引入 RTT 偏差 RTTVAR,其计算公式为:

RTTVAR = (1 - β) * RTTVAR + β * |RTT_sample - SRTT|

其中 β \beta β 通常取值为 0.25。

根据 SRTT 和 RTTVAR,TCP 设置重传定时器的公式为:

RTO = SRTT + max(G, 4 * RTTVAR)

其中,G 为系统时钟粒度。这个公式确保 RTO 既考虑了平滑的延时估计,又对 RTT 的波动性进行了补偿,从而减少不必要的重传。

2. 可靠数据传输

TCP 将应用层数据视为一个连续的字节流,在发送时将数据划分成若干个报文段,每个报文段数据部分的第一个字节都被赋予一个序列号。接收方利用这个序列号对收到的报文段进行排序,并检测是否存在缺失或重复的部分。

接收方不会为每个报文段单独发送确认,而是发送累积确认(Cumulative ACK):例如,当接收方按序正确收到从序列号 0 到 999 的数据,它会发送 ACK 1000,表示它已成功接收了前 1000 个字节,并期望收到序号为 1000 的下一个字节。这种机制与 Go-Back-N 中的累积确认较为相似。

如果某个报文段丢失,但后续数据到达,接收方会重复发送相同的 ACK(通常重复 3 次以上),触发发送方的快速重传机制,立即重传认为丢失的那个报文段,从而避免等待超时。

现代 TCP 实现可选地支持 SACK(Selective Acknowledgment),这让接收方可以反馈非连续的、已经成功接收的数据块信息,使发送方仅重传丢失的数据,类似于 SR 的策略。这提高了性能,尤其在高带宽延时积(BDP)环境下能显著减少不必要的重传。在没有使用 SACK 选项时,TCP 的累积确认机制与 GBN 类似,即接收方只确认按序到达的最后一个字节,丢失一个报文段会导致发送方在超时后重传窗口内从该报文段开始的所有数据。

因此实际上 TCP 并非严格遵循 GBN 或 SR 的单一模型,而是一种混合方案:

  • 基础机制(累积确认、单一定时器)类似于 GBN;
  • 可选的 SACK 机制则使其具有 SR 的特性,可以进行更精细的重传。

TCP 重传流程如下图所示:

在这里插入图片描述

快速重传(Fast Retransmit)是 TCP 为了快速恢复因单个数据包丢失而引起的传输中断而设计的一项机制。在正常数据传输过程中,接收方采用累计确认的方式,只确认按序收到的最后一个字节。当某个数据包丢失时,后续数据包虽然到达了接收方,但接收方依然只能确认缺失数据前的那个序号,从而产生重复的 ACK(Duplicate ACK)。例如,假设发送的数据包序号依次为 40、50、60、70、80,当序号为 50 的数据包丢失时,接收方会连续收到序号 60、70、80 的数据包,但始终返回 ACK 50,提示它仍在等待序号 50 的数据。

在这里插入图片描述

当发送方连续收到三个(或更多)重复 ACK 后,就会认为数据包 50 已丢失,并立即重传数据包 50,而不必等待超时定时器到期。这种机制可以显著减少因单个数据包丢失而引起的延迟,提高网络吞吐量。发送方的快速重传算法用伪代码表示如下:

event: ACK received, with ACK field value of yif (y > SendBase) {SendBase = yif (there are currently not-yet-acknowledged segments)start timer} else {  // 重复确认increment count of dup ACKs received for yif (count of dup ACKs received for y == 3) {resend segment with sequence number y  // 快速重传}}

3. 流量控制

TCP 的流量控制主要是为了防止发送方发送数据的速率超过接收方的处理能力,避免接收方的缓冲区溢出,从而保证数据能够被正确接收和及时处理。流量控制是端到端的,它只涉及通信双方,而不考虑中间网络的拥塞情况(拥塞控制则专注于网络整体资源的保护)。

TCP 流量控制最核心的实现机制是滑动窗口。这一机制主要体现在 TCP 报文段头部的窗口大小(Window Size)字段中。具体包括以下几个方面:

  • 接收窗口的通告:当接收方接收到数据后,会检查自身接收缓冲区的剩余空间,并在发送 ACK 报文时,通过窗口大小字段告知发送方当前还能接收的数据量(以字节为单位)。例如,如果接收缓冲区还有 4000 字节未被占用,则接收到的 ACK 报文中的窗口字段就会设置为 4000。随着接收方应用程序不断读取缓冲区中的数据,缓冲区中的可用空间会增加;接收方在后续的 ACK 中会更新窗口大小,从而允许发送方发送更多数据。
  • 发送窗口的调整:发送方在发送数据时,不能发送超过“最小值”的数据量,其中这个最小值是接收窗口 rwnd 和拥塞窗口 cwnd 的较小值。流量控制主要保证 rwnd 部分,即接收方的处理能力不被超过,发送方会限制未确认的字节数小于等于 rwnd 值。
  • 零窗口和窗口探测:当接收方由于处理速度过慢或其他原因暂时无法接收更多数据时,会在 ACK 报文中将窗口大小通告为 0。这表示发送方必须停止发送数据,以避免进一步数据的丢失。当发送方收到零窗口通告后,会启动“保持定时器”(persist timer)。如果在该定时器到期后仍未收到非零窗口更新,发送方会发送零窗口探测(Zero Window Probe)报文,询问接收方是否有新的可用缓冲区。这有助于避免由于窗口信息丢失而导致发送方长时间停滞。

在这里插入图片描述

4. 连接管理

4.1 三次握手

TCP 的连接管理涵盖了建立、维护和终止连接的全过程,其中最为关键的部分是连接建立阶段的三次握手过程。

首先来看看如果只有两次握手会怎样?首先是连接的报文也可能会有延时,如果服务器同意建立连接的确认报文由于网络延迟等原因延迟到达,客户端超时又重发了一次连接建立请求,在通信终止后这个连接请求被服务器接收到,服务器可能错误地认为这是一个新的连接请求,于是最后只有自己建立了连接(半连接),进而占用系统资源,最终导致拒绝服务或连接资源浪费。

此外,如果只进行两次握手,旧连接的残留报文可能被误认为是新连接的数据。例如不仅建立连接的确认报文延迟了,客户端发送数据的确认报文也延迟了或者丢失了,那么客户端不仅重发了连接建立请求也重发了数据,在连接终止后服务器才收到连接建立请求和数据,此时服务器会错误地认为这是新连接和新数据。

在这里插入图片描述

TCP 的三次握手过程如下:

  • 第一次握手(SYN)
    • 动作:客户端向服务器发送一个 SYN 报文段。
    • 内容:该报文段包含客户端选择的一个初始序列号(ISN)。
    • 目的:通知服务器客户端希望建立连接,并将自己的初始序列号告知服务器。
  • 第二次握手(SYN + ACK)
    • 动作:服务器收到客户端的 SYN 后,回复一个 SYN + ACK 报文段。
    • 内容:
      • SYN:服务器为建立连接也选择一个初始序列号(ISN)。
      • ACK:服务器将客户端的 ISN 加 1 作为确认号,表示已经收到客户端的 SYN。
    • 目的:服务器确认客户端请求,并通知客户端自己也准备建立连接,同时双方初始序列号同步。
  • 第三次握手(ACK)
    • 动作:客户端收到服务器的 SYN + ACK 报文段后,向服务器发送 ACK 报文段。
    • 内容:ACK 报文中确认号为服务器的 ISN 加 1,表示客户端已经收到服务器的 SYN。
    • 目的:完成双方的同步,双方都进入 ESTABLISHED(已建立)状态,连接正式建立。

在这里插入图片描述

现在来看看三次握手如何解决半连接和接收老数据的问题。

在三次握手过程中,只有在客户端发送最终 ACK 后,服务器才认为连接完全建立。这样,即使有旧的、延迟到达的 SYN 报文或重复的 SYN + ACK 报文,服务器也只会接受第一次有效完成握手的连接,其它不匹配的握手会被丢弃或忽略。例如下图左侧服务器在接收延迟的建立请求后向客户端发送回应,但是客户端没有再次发送确认报文,因此服务器就不会建立起这个连接。

对于接收老数据的问题,三次握手中客户端和服务器各自选取随机的初始序列号,这样,新连接使用的序列号与旧连接极不可能重叠。由于新连接的序列号是全新的,如果老数据以旧的序列号到达,接收方会根据当前期望的序列号(即新连接的起始序号)将其丢弃,不会交付给应用层。

在这里插入图片描述

4.2 四次挥手

TCP 连接关闭采用的是四次挥手机制,以确保双方都能正确、完整地终止各自的数据传输通道,同时防止旧数据或延迟报文干扰新连接。

由于 TCP 是全双工通信协议,双方都可以独立地发送和接收数据。因此,连接的关闭必须分别关闭发送接收两个方向。例如,一方可能先不再发送数据(关闭发送通道),但仍继续接收;这种状态称为半关闭(half-closed)。

四次挥手过程如下:

  • 主动关闭方发送 FIN

    • 动作:当一端(如客户端)完成数据发送后,调用 close(),发送一个带有 FIN 标志的报文段。
    • 目的:通知对方“我这边的数据已经发送完毕,不再发送新数据”,但仍可以接收对方的数据。
    • 状态变化:主动关闭方进入 FIN_WAIT_1 状态。
  • 对方确认 FIN

    • 动作:服务器收到客户端的 FIN 后,立即发送一个 ACK 报文段,确认号为收到的 FIN 的序号加 1。
    • 目的:告诉客户端“我已经知道你不再发送数据了,我接收到你的关闭请求”。
    • 状态变化:
      • 服务器进入 CLOSE_WAIT 状态(表示它已收到关闭请求,但还可能有数据要发送)。
      • 客户端在收到 ACK 后进入 FIN_WAIT_2 状态,等待服务器关闭发送通道。
  • 对方发送 FIN 关闭发送通道

    • 动作:服务器在完成自己的数据发送后,也调用 close(),发送一个带 FIN 标志的报文段给客户端。
    • 目的:通知客户端“我这边的数据也发送完毕,现在我要关闭连接了”。
    • 状态变化:服务器进入 LAST_ACK 状态,等待客户端对这个 FIN 进行确认。
  • 主动关闭方确认 FIN 并进入 TIME_WAIT

    • 动作:客户端收到服务器的 FIN 后,发送一个 ACK 报文段作为确认,确认号为服务器 FIN 的序号加 1。
    • 目的:完成对服务器关闭请求的确认,确保对方知道其 FIN 已被接收。
    • 状态变化:
      • 客户端进入 TIME_WAIT 状态,等待 2 × MSL(最大报文段寿命)时间后,才彻底关闭连接。
      • 服务器在收到这个 ACK 后,进入 CLOSED 状态,释放资源。

    在这里插入图片描述

相关文章:

【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP

本文介绍了面向连接的传输协议:TCP,首先介绍 TCP 报文段的结构以及如何设置超时定时器,接着介绍 TCP 如何实现可靠数据传输以及流量控制,最后介绍 TCP 中最重要的三次握手与四次挥手的连接建立与关闭过程。 1. TCP 概述与段结构 …...

Linux主要开发工具之gcc、gdb与make

此系列还有两篇,大家想完整掌握可以阅读另外两篇 Linux文本编辑与shell程序设计-CSDN博客 Linux基础知识详解与命令大全(超详细)-CSDN博客 1.gcc编译系统 1.1 文件名后缀 文件名后缀 文 件 类 型 文件名后缀 文 件 类 型 .c C源…...

23种设计模式-行为型模式-观察者

文章目录 简介问题解决代码关键实现说明 总结 简介 观察者是一种行为设计模式, 允许你定义一种订阅通知机制, 可在事件发生时通知多个“观察/订阅”该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和商店。顾客对某个新品非常感兴趣&#xff0…...

去中心化预测市场

去中心化预测市场 核心概念 预测市场类型: 类别型市场:二元结果(YES/NO),例如“BTC在2024年突破10万美元?” 多选型市场:多个选项(如总统候选人),赔付基于…...

springboot-ai接入DeepSeek

1、引入pom依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency><dependencyManagement><dependencies><dependency><groupId>o…...

【C语言】数据在内存中的储存(整形)

目录 前言&#xff1a; 预备知识 整数在内存中的储存 原码 反码 补码 总结&#xff1a; 前言&#xff1a; 在上两章中讲解了五大内存函数&#xff0c;其中memchr函数&#xff0c;这个函数考察到数据内存的存储。 接下来为大家讲解整数在内存中的储存。 预备知识 认识…...

PCL 树木树干粗提取(地基数据,TLS)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 主要的思路如下: 1、首先,使用之前的CSF算法提取点云的地面点,在提取的过程中我们可以得到一个布料结构(地面模型)。 2、在得到这个布料结构之后,我们也就可以得到整个地面模型的高度了,之后我们只需要遍历每…...

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…...

尚硅谷2019版Java集合和泛型

第十一章 Java集合框架 集合框架全景图 mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays三大核心接口对比 特性ListSe…...

车载诊断架构 --- 整车重启先后顺序带来的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

华为eNSP:实验 配置单区域集成ISIS

单区域集成ISIS是一种基于中间系统到中间系统&#xff08;IS-IS&#xff09;协议的网络架构优化方案&#xff0c;主要用于简化网络设计并提升数据传输效率。其核心特点包括&#xff1a; ‌单一区域部署‌ ISIS协议在单一逻辑区域内运行&#xff0c;消除多区域间的分层复杂性&am…...

常见框架漏洞(五)----中间件IIS6

一、【PUT漏洞】 漏洞描述&#xff1a;IIS Server 在 Web 服务扩展中开启了 WebDAV &#xff0c;配置了可以写⼊的权限&#xff0c;造成任意⽂件上传。 版本&#xff1a;IIS 6.0 1. 环境 fofa搜素环境&#xff1a;"IIS-6.0" 或者环境搭建&#xff1a;本地搭建2003…...

leetcode221.最大正方形

class Solution {public int maximalSquare(char[][] matrix) {int result 0; // 记录正方形边长int m matrix.length, n matrix[0].length;int[][] dp new int[m 1][n 1];// 动态规划for (int i 1; i < m; i) {for (int j 1; j < n; j) {if (matrix[i - 1][j - …...

C++实现AVL树

一 AVL树的概念 上上节我们学习了二叉搜索树&#xff0c;他的理想查找的时间复杂度是o(log n)&#xff0c;但是如果是下面这种情况&#xff0c;那么它的时间复杂度就会变成o(n). 这种情况就是出现一边高的那种&#xff0c;它的个数和它的高度相差不大。 那么这样就会把二叉搜索…...

Linux系统安全及应用

目录 一.账号安全措施 1.1系统账号清理 1.1.1将非登录用户的shell设为无法登录 1.1.2删除无用用户 userdel 1.1.3锁定账号文件 1.1.4锁定长期不使用的账号 1.2密码安全控制 1.2.1 对新建用户 1.2.2对已有用户 1.3命令历史限制 1.3.1临时清除历史命令 1.3.2限制命令…...

JAVA反序列化深入学习(十三):Spring2

让我们回到Spring Spring2 在 Spring1 的触发链上有所变换&#xff1a; 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy &#xff0c;并完成了后续触发 TemplatesImpl 的流程 简而言之&#xff0c;换了一个chain&am…...

迭代器运算详解(四十二)

1. 迭代器的随机访问运算 对于 vector 和 string 这样的容器&#xff0c;它们的迭代器支持以下随机访问运算符&#xff1a; 运算符说明iter n返回一个新的迭代器&#xff0c;该迭代器比原来的迭代器 iter 向前移动了 n 个位置&#xff08;即指向后面的第 n 个元素&#xff0…...

Linux中Squid服务常用操作

在 Linux 中 Squid 服务常用操作介绍 1. Squid 基础操作 启动 Squid # 前台启动&#xff08;调试用&#xff09; squid -N -d 1# 后台启动&#xff08;-s 表示将日志输出到 syslog&#xff09; squid -s停止 Squid # 安全停止&#xff08;需配置 pid_file&#xff09; squid…...

Linux操作系统--进程的概念

目录 1.了解进程前的前景知识 冯诺依曼体系结构 操作系统(OS) 2.进程 2.1进程的概念 2.2描述进程-PCB 2.2.1task_struct 2.3查看进程 2.4通过系统调用获取进程的标识符 2.5认识fork()--创建进程 该专栏会持续更新 更新时间一周一更。下周更新内容进程状态 1.了解进程前…...

C++假期练习

思维导图 牛客练习...

HTML零基础入门笔记:狂神版

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章&…...

算法竞赛备赛——【图论】链式前向星

图论 图的存储方式&#xff1a; 通用的三种&#xff1a;邻接矩阵、邻接表、边集数组 有向图&#xff1a;十字链表 无向图&#xff1a;多重邻接表 刷题常用&#xff1a;邻接矩阵、链式前向星&#xff08;邻接表变形&#xff09; 链式前向星 算法题常用: 邻接矩阵、二维vector模…...

JAVA_类和对象

目录 1.面向对象的初步认知 1.1.什么是面向对象 1.2.面向对象与面向过程 2.类的定义和使用 2.1.简单认识类 2.2类的定义格式 2.3.练习 学生类 动物类&#xff08;可爱猫猫&#x1f431;&#xff09; 3.类的实例化 3.1.什么是实例化 3.2.类和对象的说明 4.this引用…...

高频面试题(含笔试高频算法整理)基本总结回顾65

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

数据库系统-数据库控制

并发控制 事务的ACID特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务包含的所有操作要么全部成功&#xff08;commit提交&#xff09;&#xff0c;要么全部失败&#xff08;rollback回滚&#xff09;一致性&#xff08;Consistency&#xff09;&a…...

Python Cookbook-5.3 根据对象的属性将对象列表排序

任务 需要根据各个对象的某个属性来完成对整个对象列表的排序。 解决方案 DSU方法仍然一如既往地有效: def sort_by_attr(sed,attr):intermed [ (getattr(x,attr),i,x) for i,x in enumerate(seg)]intermed.sort()return [ x[-1] for x in intermed def sort_by_attr_inpl…...

Java MCP SDK 开发笔记(一)

MCP 简介 AI 大模型诞生之初&#xff0c;其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标&#xff0c;由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Contr…...

AF3 OpenFoldDataLoader类_prep_batch_properties_probs方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类的 _prep_batch_properties_probs 方法是为每个批次数据准备 recycling 维度 的概率分布。它将根据配置文件中的设定为每个批次数据生成 recycling 轮次的概率分布,并存储到 prop_probs_tensor 中,用于后续抽样选择特定…...

寻找字符串数组中的最长共同前缀字符串

问题描述&#xff1a;给定一个字符串数组 strs&#xff0c;编写一个函数来找到这些字符串的最长公共前缀字符串&#xff0c;如果没有则返回空字符串"" 算法思路 横向扫描法&#xff1a; 从数组的第一个字符串开始&#xff0c;逐个和后面的字符串比较&#xff0c;逐…...

leetcode_数组 56. 合并区间

56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;int…...

Jenkins学习(B站教程)

文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署&#xff0c;见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用…...

学习笔记—C++—类和对象(一)

目录 类和对象 类的定义 类定义格式 访问限定符 类域 实例化 实例化概念 对象的大小 this指针 C和C语言实现Stack对比 类和对象 类的定义 类定义格式 ● class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后…...

PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例

1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…...

体育风暴篮球足球体育球员综合资讯网站模板

源码名称&#xff1a;篮球足球体育球员综合资讯网站模板 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 演示地址&#xff1a;https://www.52muban.com/shop/184016.html …...

Visual Studio Code SSH 连接超时对策( keep SSH alive)

文章目录 问题解决方法一&#xff1a;配置服务端关于ClientAliveInterval和ClientAliveCountMax1、打开终端&#xff0c;打开SSH配置文件&#xff1a;输入以下命令&#xff1a;2、打开配置文件后&#xff0c;添加以下内容&#xff1a;3、添加后&#xff0c;Esc按 <Enter>…...

Docker容器中的ubuntu apt update报错 解决办法

问题现象 # apt update Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB] Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] Err:2 http://security.ubuntu.com/ubuntu noble-security InRelease At least one invalid signa…...

CV - 目标检测

物体检测 目标检测和图片分类的区别&#xff1a; 图像分类&#xff08;Image Classification&#xff09; 目的&#xff1a;图像分类的目的是识别出图像中主要物体的类别。它试图回答“图像是什么&#xff1f;”的问题。 输出&#xff1a;通常输出是一个标签或一组概率值&am…...

linux提权 corn 提权

corn提权 corn的基本使用方法 corn的作用就是可以定时的完成一下任务&#xff08;如备份一下log 或者清除一下日志文件 这些就是运维人员用的&#xff09; 先找一下定时任务的工作表 cat /bin/corntab 这个是普通用户 我们直接看都看不了 说明什么说明这个 是root高权限执…...

1Panel安装失败 国内docker安装失败

本文仅针对学习交流&#xff0c;只为了帮助计算机相关专业大学生个人技能实操而记录 非学习目的严禁学习&#xff01;&#xff01;&#xff01;否则后果自负 1、离线安装1Panel&#xff08;不需要手动安装docker&#xff0c;离线安装包里包括了docker&#xff09; 离线包下载地…...

Excel + VBA 实现“准实时“数据的方法

Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...

请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?

作为深耕测试领域多年的博主,我始终认为测试是软件质量的守护者,更是推动研发流程优化的催化剂。以下从测试认知、分类体系到实战方法论,结合具体案例为你系统拆解: 一、测试的本质认知 测试≠找 Bug,而是通过系统性验证回答三个核心问题: 软件是否符合用户需求?系统在…...

详解 Redis repl_backlog_buffer(如何判断增量同步)

一、repl_backlog_buffer 复制积压缓冲区&#xff08;Replication Backlog Buffer&#xff09; 是一个环形内存区域&#xff08;Ring Buffer&#xff09;&#xff0c;用于临时保存主节点最近写入的写命令&#xff0c;以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …...

工业操作系统国产化替代的战略路径与挑战分析

一、政策背景与战略意义 工信部提出的 2027 年替换 80 万套工业操作系统计划&#xff0c;是中国制造业向智能化转型的核心举措。该政策旨在通过国产化替代&#xff0c;解决工业领域 “缺芯少魂” 的问题&#xff0c;构建自主可控的工业软件生态体系。当前&#xff0c;中国工业操…...

JMeter接口性能测试从入门到精通

前言&#xff1a; 本文主要介绍了如何利用jmter进行接口的性能测试 1.在测试计划中添加线程组 1.1.线程组界面中元素含义 如果点击循环次数为永远&#xff1a; 2.添加HTTP取样器 2.1.填写登录接口的各个参数 2.2.在线程组下面增加查看结果树 请求成功的情况&#xff1a; 请求…...

WinForm真入门(9)——RichTextBox控件详解

WinForm中RichTextBox控件详解&#xff1a;从基础到高级应用 上一文中笔者重点介绍了TextBox控件的详细用法&#xff0c;忘记的 请点击WinForm真入门(8)——TextBox控件详解&#xff0c;那么本文中的RichTextBox与TextBox有什么区别吗&#xff0c;光看名字的话&#xff0c;多了…...

Linux : 内核中的信号捕捉

目录 一 前言 二 信号捕捉的方法 1.sigaction()​编辑 2. sigaction() 使用 三 可重入函数 四 volatile 关键字 一 前言 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。在Linux: 进程信号初识-CSDN博客 这一篇中已经学习到了一种信号…...

Linux 字符串截取#与%

在Linux的Shell脚本中&#xff0c;#和%用于字符串截取&#xff0c;通过通配符模式匹配删除部分内容 批量修改文件名技巧&#xff1a;Linux下#、##、%、%%符号操作详解-CSDN博客 从左截取&#xff08;# 和 ##&#xff09; #&#xff1a;删除最短匹配左侧内容。 ##&#xff1a…...

Android学习总结之自定义View实战篇

场景一&#xff1a;自定义进度条 在很多应用中&#xff0c;我们会看到一些独特样式的进度条&#xff0c;接下来就实现一个简单的圆形进度条。 实现思路 继承 View 类。重写 onDraw 方法&#xff0c;在该方法里使用 Canvas 和 Paint 来绘制圆形进度条。提供更新进度的方法。 …...

C++ STL 详解 ——list 的深度解析与实践指南

在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;list作为一种重要的序列式容器&#xff0c;以其独特的双向链表结构和丰富的操作功能&#xff0c;在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法&#xff0c;能帮助开发者编写出更高效、灵活的代码…...

open函数的概念和使用案例

open 是 Linux/Unix 系统中用于打开或创建文件的系统调用&#xff0c;返回一个文件描述符&#xff08;File Descriptor&#xff09;&#xff0c;后续可通过该描述符进行文件读写等操作。以下是其核心概念和使用案例的详细说明&#xff1a; 1. 核心概念 作用&#xff1a;打开或…...