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

嵌入式之计算机网络篇(七)

七、计算机网络

1.说说计算机网络五层体系结构

计算机网络的五层架构包括应用层、传输层、网络层、数据链路层和物理层。

  1. 应用层:是网络结构中的最高层,负责向用户提供网络服务,如文件传输、电子邮件、远程登录等。常见的应用层协议有HTTP、FTP、SMTP等,这些协议规定了应用程序接收的数据格式,使应用程序能够解析数据并呈现到页面上供用户观看。
  2. 传输层:负责在源主机和目的主机之间提供端到端的数据传输服务,并解决诸如主机地址、端口号、数据传输状态等问题。常见的传输层协议有TCP和UDP。
  3. 网络层:负责在多个主机之间传送数据包,并为分组交换提供路由选择功能。网络层协议能够确保数据包在网络中正确传输,并选择合适的路径到达目的地。
  4. 数据链路层:负责在物理层的传输介质上传送数据帧,并在源主机和目的主机之间建立逻辑链路。数据链路层通过帧的形式来传输数据,确保数据在传输过程中的完整性和可靠性。
  5. 物理层:负责传输比特流的硬件部分,包括各种传输介质(如铜线、光纤、无线信道)和传输设备(如集线器、交换机、路由器)。物理层为数据传输提供物质基础,确保数据能够在不同的网络设备之间顺利传输。

2.请说一下socket网络编程中客户端和服务端用到哪些函数?

1)服务器端函数:

(1)socket创建一个套接字

(2)bind绑定ip和port

(3)listen使套接字变为可以被动链接

(4)accept等待客户端的链接

(5)write/read接收发送数据

(6)close关闭连接

2)客户端函数:

(1)创建一个socket,用函数socket()

(2)bind绑定ip和port

(3)连接服务器,用函数connect()

(4)收发数据,用函数send()和recv(),或read()和write()

(5)close关闭连接

3.网络四层模型

  • 应用层 HTTP/TFTP

  • 传输层 TCP/UDP

  • 网络层 IP/ICMP

  • 网络接口层

4.TCP如何保证可靠性?

(1) 检验和:

通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送,TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。检验和总共计算三个部分:TCP首部、TCP数据、TCP伪首部;

(2) 序列号/确认应答、超时重传:

数据到达接收方之后,接收方会发送一个确认应答,表示已经收到数据段,并且确认序号会说明它下一次需要接收的数据序列号,如果发送方没收到确认应答,那么发送方会进行重发,这个等待时间一般是2 * RTT(往返时间)+一个偏差值,如果一个包多次重发没有收到接收端的确认包,就会强制关闭连接;

(3) 窗口控制与重发控制/快速重传(重复确认应答)

TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值,如果不使用窗口控制,每一个没收到应答的数据都要重发。

5.简述 TCP 滑动窗口以及重传机制

1)滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。滑动可以理解为缓冲区的大小,告诉发送方,自己还能接受多少数据

TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。

2)TCP在发送数据时会设置一个计时器,若到计时器超时仍未收到数据确认信息,则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时(RTO) 。另一种方式的重传称为快速重传,通常发生在没有延时的情况下。若TCP累积确认无法返回新的ACK,或者当ACK包含的选择确认信息(SACK)表明出现失序报文时,快速重传会推断出现丢包,需要重传。

6.简述 TCP 慢启动

TCP慢启动是传输控制协议(TCP)使用的一种阻塞控制机制,也被称为指数增长期。慢启动机制通过以指数增加的速率增加发送窗口的大小来实现流量控制,旨在避免在建立连接初期因发送大量数据而导致的网络拥塞。

在慢启动过程中,发送方将初始的拥塞窗口大小设置为一个较小的值,例如2个数据包大小。每当发送方成功接收到一个确认,拥塞窗口大小就会加倍,这意味着发送方可以发送更多的数据。然而,当拥塞窗口大小达到一个阈值(通常是网络的带宽延迟乘积)时,发送方将进入拥塞避免阶段,此时发送方将以一个较慢的速率递增拥塞窗口大小,通常是每次收到一个确认就增加一个数据包大小。如果在慢启动或拥塞避免阶段,发送方检测到网络拥塞,例如发生丢包,它将减少拥塞窗口的大小,并重新开始慢启动过程。

7.TCP建立连接和断开连接过程?

三次握手和四次挥手

三次握手目的:是为了确认客户端和服务器都能收发

  1. 客户端向服务器发送一个SYN包,请求建立连接,并包含自身的初始序列号,等待服务器确认;
  2. 服务器收到SYN包后,回复一个ACK应答包表示确认,同时发送一个SYN包,即SYN+ACK包,也包含自身的初始序列号。此时,服务器进入SYN_RECV状态,等待客户端的确认;
  3. 客户端收到服务器的SYN+ACK包后,再次向服务器发送一个ACK确认包,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

在三次握手过程中,客户端和服务器通过交换SYN和ACK包来确认对方的存在和初始序列号,从而建立TCP连接。注意,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

四次挥手目的:是为了确认客户端和服务器都结束收发

  1. 客户端向服务器发送一个FIN数据包,提出断开连接的请求,并指定一个序列号。此时,客户端进入FIN_WAIT1状态,等待服务器的确认;
  2. 服务器收到FIN包后,发送一个ACK应答包给客户端,表示已经收到并同意断开连接。此时,客户端进入FIN_WAIT2状态,等待服务器完成数据传输并断开连接;
  3. 服务器在完成数据传输后,向客户端发送一个FIN包,提出自己的断开连接请求;
  4. 客户端收到服务器的FIN包后,回复一个ACK确认包给服务器,然后进入TIME_WAIT状态,等待一段时间后最终关闭连接。而服务器在收到客户端的ACK确认包后,直接关闭连接。

在四次挥手过程中,客户端和服务器通过交换FIN和ACK包来逐步断开连接。这种机制确保了双方都能有序地关闭连接,并释放相关资源,

需要注意的是,在断开连接的过程中,客户端需要等待一段时间(通常是2MSL,即最长报文段寿命的两倍)才能最终关闭连接。这是为了防止已失效的连接请求报文段出现在新连接中,确保TCP连接的可靠关闭。

8.说说 TCP 2次握手行不行?为什么要3次

TCP的二次握手是不足以建立可靠连接的。TCP协议中采用三次握手而非二次握手来建立连接,主要是因为二次握手无法解决以下问题:

  1. 确认双方的通信能力:在二次握手中,只有发起方的序列号得到了确认,而服务器端的序列号得不到确认,因此,二次握手只能确定客户端和服务器之间的连接是单向的,即客户端可以向服务器发送数据,但服务器无法向客户端发送数据。为了确保双方的通信能力正常,需要引入第三次握手,使得客户端能够发送确认信息给服务器,从而确保双方都可以正常发送和接收数据。
  2. 避免历史连接的干扰:二次握手无法防止历史连接的干扰。在网络中,可能存在旧的、失效的连接请求,如果仅采用二次握手,这些旧的请求可能会被错误地认为是新的连接请求,从而导致资源浪费和数据混乱。通过引入第三次握手,可以确保服务器在收到连接请求时能够正确处理,避免重复连接的建立。
  3. 确保数据包的传输和完整性:三次握手通过交换三个不同的数据包来确认双方的序列号和窗口大小,从而确保后续的数据传输是可靠和完整的。如果只有二次握手,那么可能在某些情况下,数据传输的可靠性和完整性无法得到保障。

因此,TCP协议选择使用三次握手来建立连接,以确保数据传输的可靠性、完整性和稳定性。这种设计使得TCP成为一种高度可靠和广泛应用的传输协议。

9.TCP只进行3次挥手可以吗?

如果采用三次挥手来断开TCP连接,可能会导致以下问题:

  • 服务器在发送完ACK应答报文后直接关闭连接,但此时可能还有未处理完的数据或延迟的数据包,这些数据将会丢失。
  • 客户端在发送FIN报文后,没有收到服务器的确认就直接关闭连接,无法保证服务器已经正确接收到关闭请求。

因此,四次挥手是为了更可靠地关闭TCP连接,确保双方都能有序地释放资源并关闭连接。

10.TCP连接和关闭的状态转移

在连接建立阶段,状态转移如下:

  1. CLOSED:这是TCP连接的初始状态,表示尚未开始任何连接;
  2. LISTEN:当服务器端调用listen()系统调用后,它进入LISTEN状态,等待客户端的连接请求;
  3. SYN_SENT:当客户端想要建立连接时,它会发送一个带有SYN标志的TCP报文到服务器,并进入SYN_SENT状态,等待服务器的确认;
  4. SYN_RECEIVED:服务器一旦收到客户端的SYN报文,会发送一个带有SYN和ACK标志的响应报文给客户端,并进入SYN_RCVD状态;
  5. ESTABLISHED:一旦客户端收到服务器的SYN+ACK响应并发送ACK确认报文给服务器,双方都进入ESTABLISHED状态,这时连接已经建立,可以进行数据传输。

在连接关闭阶段,状态转移如下:

  1. FIN_WAIT_1:当一方想要关闭连接时,它会发送一个FIN报文给另一方,并进入FIN_WAIT_1状态,等待对方的确认;
  2. CLOSE_WAIT:当另一方收到FIN报文后,它会发送一个ACK报文进行确认,并进入CLOSE_WAIT状态,等待本地应用层关闭连接;
  3. LAST_ACK:当本地应用层决定关闭连接时,它会发送一个FIN报文给对方,并进入LAST_ACK状态,等待对方对FIN报文的最终确认;
  4. FIN_WAIT_2:发送FIN报文的一方在收到对方的ACK报文后,会进入FIN_WAIT_2状态,等待对方发送FIN报文来关闭连接;
  5. TIME_WAIT:当发送最后一个ACK报文的一方,在发送完报文后会进入TIME_WAIT状态,等待一段时间(通常是2MSL,即两倍的最大段生命周期)以确保对方收到了ACK报文,然后最终进入CLOSED状态;
  6. CLOSED:当连接的所有过程都完成后,双方最终都会进入CLOSED状态,表示连接已经关闭。

11.滑动窗口过小怎么办?

当滑动窗口过小时,可以通过以下方式进行调整:

在TCP协议中,滑动窗口的大小是根据网络拥塞情况动态调整的。当网络出现拥塞时,发送方会减小窗口大小以降低数据发送速率,避免进一步加剧拥塞。相反,当网络负载较轻时,发送方可以增大窗口大小以提高数据传输速率;

具体的调整过程包括慢启动、拥塞避免、快重传与快恢复等机制。慢启动阶段,TCP协议初始设置较小的滑动窗口大小,并随着传输的成功确认逐渐增大窗口大小。拥塞避免阶段,滑动窗口以一定的速率增长,但增长速率更缓慢,以避免引发网络拥塞。当接收方收到失序的数据时,会发送冗余的确认信息给发送方,触发快重传和快恢复机制,在此过程中,发送方将减小滑动窗口大小,以便重新发送丢失的数据,并恢复正常的发送速率。

12.说说三次握手中每次握手信息对方没有收到会怎样?

如果第一次握手消息丢失,那么请求方不会得到ack消息,超时后进行重传,

如果第二次握手消息丢失,那么请求方不会得到ack消息,超时后进行重传,

如果第三次握手消息丢失,那么Server 端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包,如果重发指定次数之后,仍然未收到 client 的ACK应答,那么一段时间后,Server自动关闭这个连接。

13.简述 TCP 和 UDP 的区别,它们的头部结构是什么样的

TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接,而UDP是无连接的,

TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节,

TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率,

TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信,

TCP面向的是字节流的服务,UDP面向的是报文的服务。

14.简述域名解析过程,本机如何干预域名解析

域名解析的基本过程如下:

  1. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器;
  2. 当本地的域名服务器收到请求后,先查询本地的缓存。如果有该记录项,则直接把查询的结果返回给客户机;
  3. 如果本地的缓存中没有该记录,则本地域名服务器直接把请求发给根域名服务器,根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址;
  4. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该记录,则返回相关的下级的域名服务器的地址;
  5. 重复上一步骤,直到找到正确的记录;
  6. 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

对于本机如何干预域名解析,以下是一些建议:

  1. 清除浏览器缓存:浏览器有时会缓存域名解析结果,如果缓存的结果有误,可能导致访问问题,因此,清除浏览器缓存可能有助于解决域名解析相关的问题;
  2. 检查并更改DNS设置:用户可以检查电脑或路由器的DNS设置是否正确。如果DNS设置不正确,可能会导致域名解析错误。此时,可以尝试更改DNS设置,然后重新访问网站,看是否能够解决问题;
  3. 更换DNS服务器:如果怀疑当前的DNS服务器存在问题,可以尝试更换为其他的公共DNS服务器,如Google DNS或OpenDNS,然后重新访问网站,看是否能够解决问题;
  4. 检查域名注册信息:域名注册信息的过期或错误也可能导致域名解析问题。用户可以检查域名注册信息是否正确,是否过期,如果有问题,需要及时更新。

15.说说什么是 TCP 粘包和拆包?

TCP粘包和拆包是在网络通信中常见的问题,与数据的发送和接收方式密切相关;

TCP粘包是指发送方发送的多个小数据包被接收方一次性接收的情况,这可能是因为发送方发送数据的速度过快,接收方无法及时处理,从而多个数据包被合并成一个大的数据包一起接收。具体来说,当发送方连续发送多个数据包时,TCP协议可能会将这些数据包打包成一个TCP报文发送出去,这样,接收方在读取缓冲区时,可能会发现原本应该分开读取的数据包粘在了一起;

而TCP拆包则是指发送方发送的一个大数据包被接收方拆分成多个小的数据包接收的情况,这可能是由于网络中的路由器、交换机等设备的限制,导致大的数据包在传输过程中被分割成多个小的数据包,接收方需要能够正确地组装这些小数据包以还原原始的大数据包;

TCP粘包和拆包问题通常与网络状况、数据包大小、发送和接收方的处理速度等因素有关,为了避免这些问题,可以采取一些策略,如设置合适的数据包大小、使用应用层协议来处理数据包的边界等;

总之,TCP粘包和拆包是网络通信中需要注意和处理的问题,以确保数据的正确传输和接收。

16.如何解决粘包和拆包问题

TCP粘包和拆包问题可以通过以下几种方式来解决:

  1. 消息定长:这是一种简单的解决方案,它要求所有的数据包都是固定长度的。这样,接收方就可以按照固定长度来进行接收,从而避免了粘包和拆包问题。然而,这种方法对于不固定长度的数据无法解决粘包和拆包问题。
  2. 消息分隔符:在每个数据包的结尾加上一个特定的分隔符,接收方可以根据这个分隔符来判断每个数据包的结束位置,从而解决粘包和拆包问题。这种方法需要保证分隔符在数据包中不会出现,或者即使出现也不会引起混淆。
  3. 使用定长协议:规定每次发送的数据包都是固定长度,例如每次发送100个字节。如果发送的数据长度不足100字节,则在后面填充空格或者其他特定字符;如果超过100字节,则进行截断处理。这样可以保证每次接收到的数据都是固定长度的,从而解决了TCP粘包和拆包问题。但是,这种方法需要预先约定每次发送的数据包长度,因此不太灵活,无法适应数据长度不固定的情况。

需要注意的是,这些方法并非完美无缺,每种方法都有其适用的场景和局限性。在实际应用中,需要根据具体的需求和网络环境来选择合适的解决方案。同时,对于复杂的数据传输任务,可能需要结合使用多种方法来更好地解决TCP粘包和拆包问题。

17.TCP为什么比UDP可靠

TCP比UDP更可靠的原因主要在于TCP协议设计了一套复杂的机制来保证数据传输的可靠性,具体如下:

  1. 确认应答机制:TCP使用确认应答机制来确保数据包的正确传输。发送方每发送一个数据包,都需要等待接收方的确认应答。只有当收到确认应答后,发送方才会继续发送下一个数据包。这种机制确保了数据的可靠传输,避免了数据的丢失;
  2. 超时重传机制:如果发送方在一段时间内没有收到接收方的确认应答,它会认为数据包已经丢失,并会重新发送该数据包。这种超时重传机制进一步保证了数据的可靠性;
  3. 连接管理:TCP在数据传输前需要进行三次握手来建立连接,确保双方通信的正常。这种连接管理不仅为数据传输提供了通道,还增加了数据传输的可靠性;
  4. 流量控制和拥塞控制:TCP协议通过流量控制和拥塞控制机制,避免了数据传输过程中的丢失和拥塞。流量控制使得发送方可以根据接收方的接收能力来发送数据,避免数据过快发送导致接收方无法处理。而拥塞控制则使得发送方在网络拥塞时能够降低发送速率,从而避免数据的丢失。

相比之下,UDP协议则是一种无连接的协议,它不需要建立连接,也不进行确认应答和重传。因此,UDP在传输数据时可能会出现数据的丢失、乱序等问题,可靠性较差。然而,UDP协议由于其无连接性质和简单性,在某些对实时性要求较高或需要一对多、多对多通信的场景中仍具有优势。

18.什么是HTTP/TFTP

HTTP和TFTP都是网络传输协议。

HTTP,全称Hypertext Transfer Protocol,即超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传送协议。它建立在TCP之上,是基于请求与响应范式的、无状态的、应用层的协议。HTTP协议以链接从一个超文本服务器传输到另一个超文本服务器、从一个链接到一个链接从一个资源到另一个资源。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

TFTP则是Trivial File Transfer Protocol的简称,即简单文件传输协议。它用于在客户机与服务器之间进行简单文件传输,提供不复杂、开销不大的文件传输服务。TFTP建立在UDP之上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。

总的来说,HTTP和TFTP在网络传输中各有其用,前者主要用于超文本传输,后者则主要用于简单的文件传输。

19.为什么客户端最后还要等待2MSL

客户端在发送最后一个ACK包后,需要等待2MSL(两倍的报文最大生存时间)的原因主要有以下几点:

  1. 确保最后一个ACK包传输成功:在TCP协议中,发送的每个数据包都有一个TTL(Time To Live)属性。当网络发生拥塞时,报文可能会被重传或丢弃。因此,客户端发送最后一个ACK包后,需要等待一段时间以确保这个ACK包已经顺利被服务器接收到并处理完毕。如果等待时间不够,可能由于网络延迟或丢包导致服务器未收到ACK,从而引发不必要的重传或其他问题。
  2. 避免“旧连接”数据混乱:在网络中,可能存在新旧连接使用相同端口和IP地址的情况。如果旧连接的某些信息没有及时清除,就可能产生数据混乱。等待2MSL可以确保旧连接的状态信息完全释放,避免新连接使用到还未完全释放的旧连接资源,从而确保数据传输的正确性和可靠性。
  3. 保证TCP协议的全双工连接可靠关闭:TCP协议要求全双工连接的可靠关闭。等待2MSL是TCP协议关闭连接过程中的一个必要步骤,它确保了连接的双方都能够正确地关闭连接,避免了因连接未完全关闭而导致的各种问题。

20.什么时候用TCP,UDP?

当需要确保数据的完整性和可靠性时,应使用TCP;而当对实时性要求较高且可以容忍少量数据丢失时,可以使用UDP,不过具体的选择应根据应用的需求和网络环境来确定。

21.什么是IP/ICMP?

IP(Internet Protocol)即网际互连协议,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性,实现大规模、异构网络的互联互通,并分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。IP为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

ICMP(Internet Control Message Protocol)即互联网控制报文协议,是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。这些控制消息主要涉及网络通不通、主机是否可达、路由是否可用等网络本身的消息。虽然ICMP并不传输用户数据,但它对于用户数据的传递起着重要的作用。ICMP协议是一个无连接的协议,它并不提供可靠的数据传输,主要用于在IP网络上进行错误报告和诊断,以便源地址得知数据包传输失败的原因并进行相应的处理。

简而言之,IP协议负责在网络层进行数据包的传输,而ICMP协议则在网络层提供控制和诊断功能,两者共同协作以确保网络数据的正确和高效传输。

22. 什么是字节序 ?

字节序,又称端序或端模式,是字节顺序的一种。在多字节数据类型的值中,字节序用于标示存放顺序。常见的字节序有小端字节序(little-endian)和大端字节序(big-endian)。小端字节序将低序字节存储在起始地址处,即最前面的字节是最低有效字节;而大端字节序则是将高序字节存储在起始地址处,即最前面的字节是最高有效字节,这两种字节序在网络通信和数据存储中都有广泛的应用,理解字节序对于正确处理跨平台数据和网络通信中的数据交换至关重要。

相关文章:

嵌入式之计算机网络篇(七)

七、计算机网络 1.说说计算机网络五层体系结构 计算机网络的五层架构包括应用层、传输层、网络层、数据链路层和物理层。 应用层:是网络结构中的最高层,负责向用户提供网络服务,如文件传输、电子邮件、远程登录等。常见的应用层协议有HTTP…...

C++|运算符重载(1)|为什么要进行运算符重载

写在前面 本篇里面的日期类型加法,先不考虑闰年,平年的天数,每月的天数统一按30天算,那么每一年也就是360天 目录 写在前面 定义 基本数据类型 自定义数据类型 成员函数解决相加问题 Date类+整形 下一篇----运…...

【ARM 裸机】汇编 led 驱动之烧写 bin 文件

1、烧写概念 bin 文件烧写到哪里呢?使用 STM32 的时候烧写到内部 FLASH,6ULL 没有内部 FLASH,是不是就不能烧写呢?不,6ULL 支持 SD卡、EMMC、NAND FLASH、NOR FLASH 等方式启动,在裸机学习的工程中&#x…...

计算机网络之CIDR

快速了解CIDR CIDR 表示的是什么? 单个IP地址:当你看到一个CIDR表示法,如192.168.1.1/32,它表示一个单独的具体IP地址。/32表示所有32位都是网络部分,没有主机部分,因此它指的是单一的IP地址。 一个IP地址…...

【无标题】系统思考—智慧共赢座谈会

第432期JSTO—“智慧共赢座谈会”精彩回顾 我们身处一个快速变化的世界,其中培训和咨询行业也不断面临新的挑战和机遇。为了紧跟这些变革,我们邀请了行业专家与合作伙伴深入探讨在培训、交付和销售过程中遇到的难题。 本次座谈会的亮点之一是我们科学上…...

【Linux C | 多线程编程】线程同步 | 互斥量(互斥锁)介绍和使用

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…...

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…...

ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中,实时操作系统(RTOS)的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS,它以其小巧、快速和可靠而闻名。在本文中,我们将探讨如何将ThreadX移植到STM32微控制器上,特别是…...

【python实战】游戏开发——恐龙跳跃小游戏

目录 背景开发环境步骤初步搭建主窗口的实现地平线滑动场景小恐龙跳跃障碍物出现碰撞检测和积分功能优化改为随时可以跳跃源码参考背景 小恐龙沿着地平线前进,遇到障碍物跳跃,躲避障碍物。根据躲避的障碍物进行积分统计。 开发环境 开发环境:Windows10 软件:pycharm 开发…...

成都百洲文化传媒有限公司电商领域的新锐力量

在电商服务领域,成都百洲文化传媒有限公司凭借其专业的服务理念和创新的策略,正逐渐成为行业内的翘楚。这家公司不仅拥有资深的电商团队,还以其精准的市场定位和高效的服务模式,赢得了众多客户的信赖和好评。 一、专业团队&#…...

1042: 中缀表达式转换为后缀表达式

解法:直接给算法 创建一个栈和一个空的后缀表达式字符串。 遍历中缀表达式中的每个字符。 如果当前字符是操作数,直接将其添加到后缀表达式字符串中。 如果当前字符是操作符,需要将其与栈顶的操作符进行比较: 如果栈为空&#…...

避免上下文切换--Linux原子函数

在现代操作系统中,原子函数是一类特殊的函数,它们能够保证在并发环境中执行的操作是不可分割的。这意味着一旦一个原子函数开始执行,它的操作会在任何其他线程或进程可以介入之前完全完成。这是通过多种机制实现的,包括硬件支持的…...

塔面板php7.37.4版本不支持ZipArchive手工安装扩展方法

centos 7 宝塔面板安装的PHP7.3和7.4默认已经不带zip扩展,要手工安装zip扩展首先需要安装libzip, yum -y install libzip 方法如下: 宝塔面板php7.3版本在SSH命令行界面执行以下语句: cd /www/server/php/73/src/ext/zip/ /ww…...

go语言并发实战——日志收集系统(一) 项目前言

-goroutine- 简介 go并发编程的练手项目 项目背景 一般来说业务系统都有自己的日志,当系统出现问题时,我们一般需要通过日志信息来定位与解决问题,当系统机器较少时我们可以登录服务器来查看,但是当系统机器较多时,我们通过服务器来查看日志的成本就会变得很大,…...

Android Studio 之 Intent及其参数传递

一、Intent 显式Intent:通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-…...

【黑马头条】-day06自媒体文章上下架-Kafka

文章目录 今日内容1 Kafka1.1 消息中间件对比1.2 kafka介绍1.3 kafka安装及配置1.4 kafka案例1.4.1 导入kafka客户端1.4.2 编写生产者消费者1.4.3 启动测试1.4.4 多消费者启动 1.5 kafka分区机制1.5.1 topic剖析 1.6 kafka高可用设计1.7 kafka生产者详解1.7.1 同步发送1.7.2 异…...

非线性特征曲线线性化插补器(CODESYS 完整ST代码)

1、如何利用博途PLC和信捷PLC实现非线性特征曲线的线性化可以参考下面文章链接: 非线性特征曲线线性化(插补功能块SCL源代码+C代码)_scl直线插补程序-CSDN博客文章浏览阅读382次。信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章…...

vue3从精通到入门4:diff算法的实现

Vue 3 的 diff 算法相较于 Vue 2 有了一些改进和优化,主要是为了应对更复杂的组件结构和更高的性能需求。 以下是 Vue 3 diff 算法在处理列表更新时的大致步骤: 头头比较:首先,比较新旧列表的头节点(即第一个节点&…...

(三)C++自制植物大战僵尸游戏项目结构说明

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、项目结构 打开项目后,在解决方案管理器中有五个项目,分别是libbox2d、libcocos2d、librecast、libSpine、PlantsVsZombies五个项目,除PlantsVsZombies外,其他四个…...

动态规划专练( 279.完全平方数)

279.完全平方数 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 …...

【AI学习】三、AI算法中的向量

在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

el-amap-bezier-curve运用及线弧度设置

文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 ‌el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。‌ 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer&#xff1a;二进制数据的“瑞士军刀” 在JavaScript中&#xff0c;我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时&#xff0c;单纯依赖字符串或数组就显得力不从心了。这时&#xff…...

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…...