网络运输层之(1)TCP协议基础

网络运输层之(1)TCP协议基础


Author: Once Day Date: 2024年9月12日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSDN博客。

参考文章:

  • 《TCP/IP详解卷一》
  • TCP协议详解 (史上最全)-CSDN博客
  • TCP协议详解 - 知乎 (zhihu.com)
  • 计算机网络:这是一份非常全面&详细的TCP/IP协议学习指南-腾讯云开发者社区-腾讯云 (tencent.com)
  • 计算机网络原理梳理丨清晰认识 TCP/IP 协议-腾讯云开发者社区-腾讯云 (tencent.com)

文章目录

  • 网络运输层之(1)TCP协议基础
        • 1. 概述
          • 1.1 介绍
          • 1.2 服务模型
          • 1.3 RFC文档
        • 2. 报文协议
          • 2.1 TCP报文格式
          • 2.2 TCP校验和
          • 2.2 三次握手
          • 2.3 四次挥手
          • 2.4 自动重传
          • 2.5 流量控制(滑动窗口)
          • 2.6 拥塞控制

1. 概述
1.1 介绍

传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它是当今互联网中最广泛使用的传输协议之一,为各种网络应用程序提供了可靠的数据传输服务。

TCP协议在传输数据时,会将数据分成一个个的报文段(segment)进行传输。每个报文段都包含了源端口号、目的端口号、序列号、确认号、控制位等重要信息,以确保数据传输的可靠性和有序性。

TCP协议的发展历程可以追溯到20世纪70年代末,经过几十年的演变和完善,已经成为当今互联网中最重要的传输层协议之一。TCP协议的发展大致经历了以下几个阶段:

  1. 初始规范阶段(20世纪80年代):TCP协议的原始规范RFC 793发布,奠定了TCP的基本功能和特性,如面向连接、可靠传输和全双工通信等。随后,RFC 1122对TCP规范进行了修订和完善。
  2. 性能优化阶段(20世纪90年代):为了适应互联网的快速发展,TCP引入了多项性能优化措施,如RFC 1323中的窗口缩放、时间戳和PAWS算法,以及RFC 2018中的选择性确认(SACK)机制,用于提高TCP在高速、长距离网络中的性能和可靠性。
  3. 拥塞控制阶段(20世纪90年代末至21世纪初):TCP拥塞控制算法的不断完善和成熟,从RFC 2581到RFC 5681,奠定了现代TCP拥塞控制的基础。同时,RFC 3168引入了显式拥塞通知(ECN)机制,允许网络向TCP反馈拥塞信息。
  4. 高性能扩展阶段(21世纪10年代):为了进一步提高TCP在高速、长距离网络中的性能,RFC 7323对TCP的高性能扩展进行了更新,包括窗口缩放、时间戳和PAWS算法等。
  5. 现代TCP规范阶段(21世纪10年代至今):RFC 8312作为当前最新的TCP规范文档,对TCP的各个方面进行了全面的描述和规范,是当前TCP协议的权威参考。
1.2 服务模型

TCP协议的主要特点如下:

  • 面向连接:在数据传输之前,TCP通信的双方必须先建立连接,确保双方都准备好进行数据交换。

  • 可靠性:TCP使用序列号、确认应答、重传等机制来确保数据的可靠传输,保证数据不会丢失、重复或乱序。

  • 字节流:TCP将应用程序传输的数据视为一连串的字节流,不关心字节流的具体含义,只负责把数据从一端传送到另一端。

  • 全双工:TCP支持全双工通信,即数据可以同时在两个方向上传输,双方都可以同时发送和接收数据。

  • 流量控制:TCP通过滑动窗口机制实现流量控制,防止发送方发送数据的速度超过接收方接收数据的速度,避免网络拥塞。

  • 拥塞控制:TCP采用拥塞控制算法,如慢启动、拥塞避免、快速重传和快速恢复等,来适应网络拥塞状况,调整发送速率,提高网络利用率。

1.3 RFC文档

下面是TCP相关的RFC文档:

  • RFC 793 - Transmission Control Protocol (1981),TCP协议的原始规范,定义了TCP的基本功能和报文格式。

  • RFC 1122 - Requirements for Internet Hosts - Communication Layers (1989),对TCP的规范进行了修订和完善,提出了许多新的要求和建议。

  • RFC 1323 - TCP Extensions for High Performance (1992),引入了窗口缩放、时间戳和PAWS算法,用于提高TCP在高速、长距离网络中的性能。

  • RFC 2018 - TCP Selective Acknowledgment Options (1996),定义了TCP选择性确认(SACK)选项,用于改进TCP的丢包恢复能力。

  • RFC 2581 - TCP Congestion Control (1999),对TCP拥塞控制算法进行了详细描述,包括慢启动、拥塞避免、快速重传和快速恢复等算法。

  • RFC 2883 - An Extension to the Selective Acknowledgement (SACK) Option for TCP (2000),引入了D-SACK(Duplicate SACK),用于检测网络中的数据包重复现象。

  • RFC 3168 - The Addition of Explicit Congestion Notification (ECN) to IP (2001),定义了显式拥塞通知(ECN)机制,允许路由器向TCP发送方反馈网络拥塞信息。

  • RFC 3390 - Increasing TCP’s Initial Window (2002),提出了增加TCP初始窗口大小的建议,以提高TCP在短流量传输中的性能。

  • RFC 3782 - The NewReno Modification to TCP’s Fast Recovery Algorithm (2004),对TCP快速恢复算法进行了修改,提出了NewReno算法,改进了TCP的丢包恢复性能。

  • RFC 4138 - Forward RTO-Recovery (F-RTO): An Algorithm for Detecting Spurious Retransmission Timeouts with TCP and the Stream Control Transmission Protocol (SCTP) (2005),提出了F-RTO算法,用于检测和处理TCP中的虚假超时重传问题。

  • RFC 5681 - TCP Congestion Control (2009),对TCP拥塞控制算法进行了修订和完善,融合了之前多个RFC文档中的内容。

  • RFC 6298 - Computing TCP’s Retransmission Timer (2011),介绍了计算TCP重传计时器的算法和方法。

  • RFC 6582 - The NewReno Modification to TCP’s Fast Recovery Algorithm (2012),对RFC 3782中的NewReno算法进行了更新和完善。

  • RFC 7323 - TCP Extensions for High Performance (2014),对TCP的高性能扩展进行了更新,包括窗口缩放、时间戳和PAWS算法等。

  • RFC 7413 - TCP Fast Open (2014),介绍了TCP快速打开(TFO)机制,用于减少TCP连接建立的延迟。

  • RFC 8312 - CUBIC for Fast Long-Distance Networks (2018),介绍了CUBIC拥塞控制算法,适用于高速、长距离网络。

2. 报文协议
2.1 TCP报文格式

TCP报文(也称为TCP段,segment)是TCP协议通信过程中传输的数据单元,每个TCP报文都由报文头部和数据部分组成。

在这里插入图片描述

下面是各个字段的含义:

  • 源端口(Source Port,16位):表示发送TCP报文的源端口号。

  • 目的端口(Destination Port,16位):表示接收TCP报文的目的端口号。

  • 序列号(Sequence Number,32位):表示当前报文段中第一个字节的序号。TCP给每个字节都赋予了一个序列号,这是一个32位的无符号数字,到达 2 32 − 1 2^{32}-1 2321后再循环到0,每个被交换的字节都已编号。

  • 确认号(Acknowledgment Number,32位):表示期望接收的下一个字节的序号,也就是当前已成功接收的字节序号加1。

  • 数据偏移(Data Offset,4位):表示TCP报文头部的长度,单位为4字节。

  • 保留位(Reserved,4位):保留字段,供将来使用。

  • 控制位(Control Bits,8位):包括CWR,ECE,URG、ACK、PSH、RST、SYN和FIN。

    • CWR:拥塞窗口减少,用于发送方降低它的发送速率。

    • ECE:ECN回显,发送方接收到了一个更早的拥塞通告。

    • URG:紧急指针(Urgent Pointer),较少使用。

    • ACK:确认号(Acknowledgment Number)字段有效,连接建立之后一般都默认启用,也就是除了初始和末尾报文段之外的所有报文。

    • PSH:接收方应尽快将数据传递给应用程序。

    • RST:重置连接,经常因为错误取消连接。

    • SYN:同步序号,用于初始化连接。

    • FIN:发送方已经完成数据发送。

  • 窗口大小(Window Size,16位):表示接收方当前可接收的字节数,用于流量控制。这个字段最大值是65535,可以通过窗口缩放选项(Window Scale)对其进行缩放,从而提供更高的上限值。

  • 校验和(Checksum,16位):用于检验TCP报文头部和数据部分的完整性。

  • 紧急指针(Urgent Pointer,16位):当URG标志位置1时有效,指示紧急数据的末尾在报文段中的位置。

  • 选项(Options,可变长度):TCP头部的可选字段,用于实现一些特殊功能,如最大报文段长度(MSS)、窗口缩放因子、时间戳等。

  • 填充(Padding,可变长度):用于确保TCP头部长度为4字节的整数倍。

2.2 TCP校验和

TCP校验和是TCP报文头部中的一个重要字段,用于验证TCP报文在传输过程中是否出现了误码或损坏。

TCP伪头部是计算校验和时使用的一个虚拟头部,它包含了一些来自IP头部的信息。伪头部的格式如下:

在这里插入图片描述

校验和的计算方式如下(与IP、ICMP和UDP协议类似)

  1. 将TCP伪头部、TCP头部和数据部分看作一个连续的字节流
  2. 将字节流划分为16位(2字节)的字
  3. 如果字节流的长度为奇数,在末尾添加一个全零字节,使字节流长度变为偶数
  4. 将所有16位字相加,得到一个32位的和
  5. 将32位的和的高16位与低16位相加,得到一个16位的和
  6. 将16位的和取反,得到TCP校验和的值

接收方在收到TCP报文后,会按照相同的方法计算校验和,并与报文中的校验和字段进行比较。如果两者相同,说明报文在传输过程中没有出现差错;如果不同,则说明报文在传输过程中出现了差错,需要进行重传或错误处理。

但这种校验和对于超大量数据来说,仍然是不够健壮,应用层仍然需要采取自定义的手段来保证应用层数据可靠性

2.2 三次握手

TCP是一种面向连接的可靠传输协议,在通信双方进行数据传输之前,需要先建立连接。TCP使用三次握手(Three-Way Handshake)的方式来建立连接,下面是示意图:

在这里插入图片描述

(1) 第一次握手(SYN),客户端向服务器发送一个SYN(同步)报文:

  • 设置SYN标志位为1,表示这是一个连接请求报文。
  • 随机生成一个初始序列号(ISN,Initial Sequence Number),例如ISN=X。
  • 可选地携带其他参数,如最大报文段长度(MSS)等。

(2) 第二次握手(SYN+ACK),服务器收到客户端的SYN报文后,如果同意建立连接,则返回一个SYN+ACK报文:

  • 设置SYN标志位为1,ACK标志位为1,表示这是一个连接接受报文。
  • 服务器也随机生成一个初始序列号,例如ISN=Y。
  • 确认号(Acknowledgment Number)设置为客户端的ISN加1,即Ack=X+1。
  • 可选地携带其他参数。

(3) 第三次握手(ACK),客户端收到服务器的SYN+ACK报文后,向服务器发送一个ACK报文:

  • 设置ACK标志位为1,表示这是一个确认报文。
  • 序列号(Sequence Number)设置为客户端的ISN加1,即Seq=X+1。
  • 确认号设置为服务器的ISN加1,即Ack=Y+1。
  • 可选地携带其他参数或数据。
2.3 四次挥手

当客户端或服务器任一方需要关闭TCP连接时,就会启动连接释放的过程。TCP使用四次挥手(Four-Way Handshake)的方式来释放连接,下面是示意图:

在这里插入图片描述

(1) 第一次挥手(FIN),假设客户端先发起连接释放,客户端向服务器发送一个FIN(终止)报文:

  • 设置FIN标志位为1,表示这是一个连接释放请求报文。
  • 序列号(Sequence Number)设置为当前的序列号,例如Seq=X

(2) 第二次挥手(ACK),服务器收到客户端的FIN报文后,向客户端发送一个ACK报文:

  • 设置ACK标志位为1,表示这是一个确认报文。
  • 确认号(Acknowledgment Number)设置为客户端的序列号加1,即Ack=X+1

(3) 第三次挥手(FIN),服务器完成数据发送后,也向客户端发送一个FIN报文:

  • 设置FIN标志位为1,表示这是一个连接释放请求报文。
  • 序列号设置为当前的序列号,例如Seq=Y

(4) 第四次挥手(ACK),客户端收到服务器的FIN报文后,向服务器发送一个ACK报文:

  • 设置ACK标志位为1,表示这是一个确认报文。
  • 确认号设置为服务器的序列号加1,即Ack=Y+1

注意,客户端在进入CLOSED状态之前,需要经过TIME_WAIT状态,并等待2MSL的时间。这样做的目的是确保网络中所有的报文都已经被接收或丢弃,防止新连接误接收旧连接的报文

2.4 自动重传

在数据通信中,由于各种原因(如信道噪声、网络拥塞等),数据报文在传输过程中可能会出现丢失、损坏或重复等问题。为了确保数据的可靠传输,通信双方通常使用自动重复请求(Automatic Repeat reQuest,ARQ)机制和自动重传功能。

自动重复请求是一种在通信双方之间实现可靠数据传输的方法,它要求接收方在收到数据后向发送方发送确认(ACK),如果发送方在一定时间内未收到确认,则认为数据丢失并重新发送。ARQ主要有以下三种方式:

  • 停止等待ARQ(Stop-and-Wait ARQ):发送方每发送一个数据包就停止发送,等待接收方的确认,收到确认后再发送下一个数据包。
  • 回退N帧ARQ(Go-Back-N ARQ):发送方可以连续发送多个数据包,如果接收方发现有数据包丢失,则要求发送方重传丢失的数据包及其后的所有数据包。
  • 选择重传ARQ(Selective Repeat ARQ):发送方可以连续发送多个数据包,如果接收方发现有数据包丢失,则只要求发送方重传丢失的数据包,而不影响其他正确接收的数据包。

TCP采用了一种基于选择重传ARQ的自动重传机制,以确保数据的可靠传输

  • 超时重传(Timeout Retransmission):当发送方发送了一个数据包后,会启动一个计时器。如果在计时器超时之前没有收到接收方的确认,发送方就会重新发送这个数据包。
  • 快速重传(Fast Retransmission):当接收方收到一个失序的数据包时,会立即发送一个重复的ACK(即使还没有收到期望的数据包)。当发送方收到三个或更多个重复的ACK时,会立即重传对应的数据包,而不等待计时器超时。
  • 选择确认(Selective Acknowledgment,SACK):SACK是TCP的一个可选扩展,它允许接收方在ACK中指明已经成功接收的数据包的范围,这样发送方就可以只重传丢失的数据包,提高了重传的效率。
  • 重传超时时间(Retransmission Timeout,RTO)的计算:TCP根据网络的往返时间(Round-Trip Time,RTT)和RTT的变化情况,动态地计算重传超时时间,以适应网络状况的变化。
2.5 流量控制(滑动窗口)

在TCP通信中,滑动窗口(Sliding Window)是一种用于实现流量控制的机制。它允许发送方根据接收方的接收能力动态调整发送数据的速率,以避免接收方的缓冲区溢出或网络拥塞。

滑动窗口是指在任意时刻,发送方可以发送的数据范围。这个范围由两个指针界定:发送窗口的左边界和右边界。左边界表示已经发送并得到确认的数据的最大序号,右边界表示可以发送的数据的最大序号

窗口的大小由接收方通告的窗口大小(rwnd,Receiver Window)决定。发送方的发送窗口不能超过rwnd,以防止发送过多的数据导致接收方的缓冲区溢出。

随着数据的发送和确认,滑动窗口会不断向右移动,允许发送方发送新的数据。这就是"滑动窗口"的由来。

TCP使用滑动窗口实现了流量控制,具体过程如下:

  1. 接收方在ACK报文中通告自己的接收窗口大小(rwnd),表示自己当前可以接收的数据量。

  2. 发送方根据接收方通告的rwnd和自己的拥塞窗口(cwnd,Congestion Window)计算发送窗口的大小,取两者的最小值:

    send_window = min(rwnd, cwnd)
    
  3. 发送方只能在发送窗口允许的范围内发送数据,即已发送但未确认的数据量不能超过发送窗口的大小。

  4. 当接收方处理了一部分数据后,其接收缓冲区空出了空间,就会通过ACK报文通告更大的rwnd,允许发送方发送更多的数据。

  5. 如果接收方的接收缓冲区满了,会通告一个零的rwnd,发送方就必须停止发送数据,直到接收方再次通告非零的rwnd。

TCP的滑动窗口机制可以动态调整发送速率,使其与接收方的接收能力相匹配,从而实现了流量控制

2.6 拥塞控制

除了流量控制,TCP还具有拥塞控制(Congestion Control)的功能,用于防止网络拥塞和崩溃。拥塞控制允许TCP在网络拥塞时调整发送速率,以避免进一步加剧拥塞,并在网络恢复后逐步增加发送速率。

TCP使用拥塞窗口(Congestion Window,cwnd)来控制发送速率。拥塞窗口表示在任意时刻,发送方可以发送的未确认数据的最大量。与接收方通告的接收窗口(rwnd)不同,拥塞窗口是发送方根据网络拥塞状况自行调整的

发送窗口的大小由拥塞窗口和接收窗口共同决定:

send_window = min(cwnd, rwnd)

TCP采用了慢启动(Slow Start)和拥塞避免(Congestion Avoidance)两种算法来调整拥塞窗口的大小

  • 慢启动:当连接建立时,cwnd初始化为一个小值(通常为1个MSS,最大段大小)。每收到一个ACK,cwnd就增加1个MSS,这导致cwnd以指数方式增长。当cwnd达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。

  • 拥塞避免:在拥塞避免阶段,每收到一个ACK,cwnd增加1/cwnd个MSS。这导致cwnd以线性方式缓慢增长,直到出现拥塞事件(如超时或收到重复ACK)。

  • 快速重传和快速恢复:当收到三个或更多重复ACK时,TCP执行快速重传,立即重传丢失的数据包。同时,执行快速恢复,将ssthresh设置为当前cwnd的一半,并将cwnd设置为ssthresh加上3个MSS,然后进入拥塞避免阶段。

  • 超时:如果发生超时,TCP将ssthresh设置为当前cwnd的一半,将cwnd重置为1个MSS,然后重新进入慢启动阶段。

通过这些算法,TCP可以在网络拥塞时迅速降低发送速率,在网络恢复后逐步提高发送速率,从而实现了拥塞控制。

除了上述基本的拥塞控制算法,TCP还有一些其他的拥塞控制算法,如:

  • TCP Tahoe:上述基本算法的原始版本。

  • TCP Reno:在快速恢复后,如果收到部分ACK,则退出快速恢复并进入拥塞避免阶段。

  • TCP NewReno:改进了快速恢复算法,可以处理多个数据包丢失的情况。

  • TCP Vegas:基于延迟而不是丢包来检测拥塞,试图在队列积累之前就降低发送速率。

  • TCP CUBIC:目前在Linux系统中使用的默认拥塞控制算法,使用立方函数来调整cwnd,适用于高带宽、高延迟的网络。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cv2.bitwise_or 提取ROI区域

原图如下所示,想提取圆形ROI区域,红色框 img np.ones(ori_img.shape, dtype"uint8") img img * 255 cv2.circle(img, (50,50), 50, 0, -1) self.bitwiseOr cv2.bitwise_or(ori_img, circle)使用一个和原图尺寸一致的图像做mask,图白圆黑 以…

通信工程学习:什么是PC永久连接、SPC软永久连接

一、PC永久连接 PC(Permanent Connection)永久连接是一种由网管系统通过网管协议建立的长期稳定的连接方式。在ASON(自动交换光网络)中,PC永久连接沿袭了传统光网络的连接建立形式,其特点主要包括&#xff…

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践

随着科技的飞速发展,视频监控平台在社会安全、企业管理、智慧城市构建等领域发挥着越来越重要的作用。一个高效的视频监控平台,不仅依赖于先进的硬件设备,更离不开强大的视频处理技术作为支撑。这些平台集成了多种先进的视频技术,…

微波无源器件 OMT 2 倍频程带宽紧凑十字转门OMT

摘要: 一个64%瞬态带宽的可变比例十字转门OMT用于在所谓的延伸C频带卫星链接被提出。所体术的结构通过在四个输出矩形波导结处添加一个拓宽的单阶梯来克服现在的实际带宽限制。这个明智的(judicious)调整,和减高度波导和E面弯头的和功率合成器的使用,保证…

kali Linux 安装教程(保姆级)

kali 背景 基于Debian的Linux操作系统 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackT…

专题三_二分查找算法_算法详细总结

目录 二分查找 1.⼆分查找(easy) 1)朴素二分查找,就是设mid(leftright)/2,xnums[mid],t就是我们要找的值 2)二分查找就是要求保证数组有序的前提下才能进行。 3)细节问题: 总结&#xff1a…

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具,旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能,可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…

Visual Studio Installer 2022 安装提示正在提取文件 进度条不动 0B每秒

Visual Studio Installer 稍等片刻...正在提取文件 进度条不动 0B每秒 一段时间后提示 循环下载安装文件 无法下载安装文件。请检查Internet 连接,然后重试 打开vs2017 或者vs2019或者vs2022的安装程序(visual studio installer)时,下载进度条不动&…

智能体 vs AI智能体:区别与联系,一文读懂!

​ 在AI技术蓬勃发展的今天,“智能体”(Agent)和”AI智能体”(AI Agent)两个概念经常被提及,二者在很多场合下会被混淆,但其实它们有着不同的定义和应用。我觉得很有必要小小科普下两者的定义与…

龙芯+FreeRTOS+LVGL实战笔记(新)——06添加二级按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以…

mysql学习教程,从入门到精通,SQL AND OR 运算符(12)

1、SQL AND & OR 运算符 在本教程中,您将学习如何在子句中使用ASELECT column1_name, column2_name, columnN_nameFROM table_nameWHERE condition1 AND condition2;ND&OR运算符,WHERE以根据多个条件过滤记录。 1.1、根据条件选择记录 …

LCSS—最长回文子序列

思路分析 关于”回文串“的问题,是面试中常见的,本文提升难度,讲一讲”最长回文子序列“问题,题目很好理解: 输入一个字符串 s,请找出 s 中的最长回文子序列长度。 比如输入 s"aecda"&#xff0c…

考题:将数组的元素内容反转

考题:把数组的元素内容反转,int[ ] arr {11,22,33,44,55};变成int[ ] arr{55,44,33,22,11} 小伙伴们可以自己先思考再看解析: 方法1: 思想:两杯水交换的思想(有一杯装满水的杯子a和一杯装满水的杯子b,想想…

STM32双轮平衡小车(基于STM32F103C8T6HAL库)

STM32双轮平衡小车参考教程 这个项目是跟做以上UP的STM32双轮平衡小车,主要是为了学习电机驱动和PID控制。这篇我就不提供源码了,我也是跟学的,原作者也提供了源码,我记录一下自己的理解。 1 PID原理 1.1 PID简介 1.2 PID演示 …

基于SpringBoot+Vue+MySQL的笔记记录分享网站

系统展示 用户前台界面 管理员后台界面 系统背景 在当今数字化时代,笔记记录与分享已成为学习、工作与生活中不可或缺的一部分。为了满足用户高效整理思绪、便捷分享知识的需求,我们设计了一款基于SpringBoot后端框架、Vue前端框架及MySQL数据库的笔记记…

存储课程学习笔记1_访问scsi磁盘读写测试(struct sg_io_hdr,ioctl,mmap)

创建虚拟机时,可以选择SCSI,STAT,NVME不同类型的磁盘。 0:总结 》了解内核提供的访问scsi的结构和方法 (主要是sg_io_hdr_t 结构体和ioctl函数)。 》需要读scsi协议文档,了解相关指令,只演示了16字节固定…

Leetcode第414周赛第二题:3281. 范围内整数的最大得分

一:题目: 给你一个整数数组 start 和一个整数 d,代表 n 个区间 [start[i], start[i] d]。 你需要选择 n 个整数,其中第 i 个整数必须属于第 i 个区间。所选整数的 得分 定义为所选整数两两之间的 最小 绝对差。 返回所选整数的…

利他决策的神经机制:脑电功能连接网络分析

摘要 利他主义是一种复杂的亲社会行为,具有多样性的动机和显著的个体差异。研究利他主义的神经机制对于识别行为中的亲社会和反社会倾向的客观标志至关重要。本研究旨在通过网络方法分析基于EEG的功能连接模式来深入探讨利他主义的机制。为了实验性地引发利他决策情…

eclipse配置maven

eclipse配置maven 启动 Eclipse,转到 Window > Preferences 在左侧导航栏中,展开 Maven 节点。 在 User Settings 下,单击 Add。 浏览到 Maven 安装目录中 conf/settings.xml 文件。 在 Global Settings 下,单击 Add。 浏览到…

动态规划算法---04.斐波那契数列模型_解码方法_C++

题目链接:91. 解码方法 - 力扣(LeetCode)https://leetcode.cn/problems/decode-ways/description/ 一、题目解析 题目: 题目大意:从题目中我们可以知道,解码就是在字符串s中由‘1’到‘26’的字符可以转化…