将Ubuntu虚拟机架设到GNS3拓扑网络上并进行TCP协议仿真分析

2023-05-16

目录

  • 前言
  • 环境配置(将Ubuntu虚拟机挂载到GNS3拓扑网络上)
    • 配置Ubuntu虚拟机
    • GNS3拓扑网络配置
    • 先进行一下数据传输检验通路是否正常
  • 开始实验
    • task1 TCP传输过程中的IP分片
    • task2 TCP请求与一个不存在的实体连接
    • task3 TCP重传
  • 附TCP报文结构以及各字段含义

前言

实验过程使用的实验文档,该文档是随便找的一个,具体详细来源暂未考证,且只完成了该文档的部分TCP的实验内容。且因为写这文章时离实验已经有一段时间,主要是我懒不想再复现一遍,所以文章中可能部分地方会有错漏,如果遇到问题可以私信我或发在评论区,我尽量尝试解决。


环境配置(将Ubuntu虚拟机挂载到GNS3拓扑网络上)

我们最终要搭建的网络拓扑结构如下
拓扑结构

  首先根据文档,会使用两台思科C3640路由器,路由器插件资源站内有可以自行搜索下载,我也上传了一份到百度网盘,提取码:0b1b,具体的GNS3如何导入路由器可以参见站内教程,此处不再赘述。

配置Ubuntu虚拟机

  这里使用的虚拟环境是VMware,Ubuntu镜像使用的是18.03版本,虚拟机设置全默认即可。按照实验手册,我们需要两台Ubuntu虚拟机,这里设为PCA和PCB。
在这里插入图片描述


  安装完成虚拟机后,我们要新设置两块虚拟网卡用于实验,打开VMware的虚拟网络编辑器,纯净环境下应该存在三块默认网卡VMnet0,VMnet1以及VMnet8。点击更改设置,选择添加网络,添加两块网卡VMnet2以及VMnet3分别作为实验中的PC-A和PC-B的网卡。
在这里插入图片描述
  添加网卡后选择仅主机模式,然后为两台PC虚拟机配置子网IP和掩码即可,这里可以根据自己的需求进行设置,但是PC-A和PC-B不要配置在同一个网段。
PC-A子网IP配置
PC-A子网IP配置
PC-B子网IP配置
在这里插入图片描述
  配置完成后,重启物理电脑配置好的两块网卡就能被GNS3识别了。注意,配置好网卡后要将对应虚拟机的网络适配器设置为配置好的对应网卡。
配置网卡到对应虚拟机
在这里插入图片描述
  然后还要进入虚拟机,设置虚拟机的地址,子网掩码和网关,以PC-A为例PC-B同理。
配置PC-A的地址,子网掩码和网关
在这里插入图片描述

  虚拟机配置完成后,回到GNS3开始配置网络。首先我们配置路由器c3640的端口,直接按照文档中要求的配置即可:
配置c3640串口
在这里插入图片描述
两台Ubuntu主机使用设备栏里的cloud挂载,这里以PC-A为例。
在这里插入图片描述
  进入cloud的设置页面,勾选左下角的“显示特殊的以太网接口”选项,现在我们可以在上面的下拉栏里看到存在的以太网接口了(不勾选只能看到以太网一个选项)。
配置cloud以太网接口
在这里插入图片描述
  我们为对应虚拟PC选择对应网卡,然后删除默认的以太网接口。
PC-A以太网接口配置结果
在这里插入图片描述
  我们还可以为cloud换一个图标,方便我们清楚的观看,然后连接各结构,路由器间通过串行接口s3/0连接,路由器使用f0/0端口和虚拟PC的网卡进行连接。
在这里插入图片描述

GNS3拓扑网络配置

  接下来配置各个端口的IP以及路由,限于篇幅,我们这里以R1为例,R2类似,命令如下:

conf t
int s3/0
ip add 10.0.2.1 255.255.255.0
no shut
int f0/0
ip add 10.0.1.1 255.255.255.0
no shut
end
write

在这里插入图片描述
  R2设置同理,PC-A以及PC-B已经在上一步的VMware网卡设置中完成,此处不需要单独设置,此处各端口设置完成后,结果如下表。
各个设备以及端口的IP和网关配置

PCIP默认网关
PC-A10.0.1.11 / 2410.0.1.1
PC-B10.0.3.33 / 2410.0.3.1
路由F0/0S3/0默认网关
R110.0.1.1/2410.0.2.1/2410.0.2.2
R210.0.3.1/2410.0.2.2/2410.0.2.1

尝试ping各台设备检验连通性
路由器R1 ping路由器R2,可以ping通
在这里插入图片描述
路由器R1 ping虚拟机PC-A,可以ping通
在这里插入图片描述
  虚拟机PC-A ping路由器R1,也成功ping通(如果这里ping不通,可以先在GNS3中使用路由器R1 ping虚拟机PC-A后再尝试,因为初始时PC-A是没有R1路由表的,当使用R1 ping过后会在PC-A生成关于R1的路由表,此时就可以ping通了)。
虚拟机PC-A ping路由器R1,可以ping通
在这里插入图片描述
  尝试PC-A ping虚拟机PC-B(或者ping路由器R2的端口,或者是路由器ping另一台路由器下的虚拟PC机)
PC-A ping PC-B失败
在这里插入图片描述
  会发现此时两台虚拟机之间是不互通的,这是因为静态路由表中还没有对应的路由跳转项,因此发出去的包路由不知道怎么转发,或者回来的包接收不到。接下来我们要为路由器以及虚拟机配置路由表,首先是路由器,先观察网络拓扑结构。
在这里插入图片描述
  我们可以看到R2接收到的发往PC-A网段的数据包要首先要发往R1的s3/0端口,然后由s3/0端口处理发往该网段内的设备,因此我们配置R2的静态路由表,指令如下。

conf t
ip routing     #开启路由转发,很重要!!!
ip route 10.0.1.0 255.255.255.0 10.0.2.1
do show ip route
end
write

在这里插入图片描述
  这里尤为要注意,配置路由转发时一定一定要使用ip routing指令开启路由转发功能,否则使用do show ip route指令可以看到配置并不能被挂载,从而使得配置无效。同理配置好R1静态路由表。配置完成后,我们尝试在虚拟机PC-A上ping PC-B以及其他组件,我们可以发现,已经可以成功的ping通了。
PC-A ping PC-B成功
在这里插入图片描述
PC-A ping R2 S3/0端口
在这里插入图片描述
至此我们成功实现将Ubuntu虚拟机挂载到GNS3拓扑网络上


备注:因为写这文章时离实验已经有一段时间,主要是我懒不想再复现一遍,所以不确定Ubuntu虚拟机是否还要额外配置路由表,如果上诉步骤后网络不通,可以尝试配置Ubuntu虚拟机的路由表,使用route工具即可,工具的使用可以参看这个教程。


先进行一下数据传输检验通路是否正常

  数据传输我们使用Ubuntu虚拟机自带的netcat工具,neccat工具能让我们很容易的在两台虚拟机间建立TCP通信并发送数据。
  我们抓包GNS3拓扑网段上PC-A到R1的通路
在这里插入图片描述
  首先我们在PC-B上使用nc命令开启10086端口的监听:nc -l 10086
  然后在PC-A上连接PC-B的10086端口:nc 10.0.3.33 10086
  上诉过程会进行三次握手,然后TCP连接被建立,可以开始通信了,我们先在PCA上向PCB发送消息“hello PCA”然后PCB回复“hello PCB”,接着在PCB上使用ctrl+c中断连接,这一过程会进行四次挥手。
抓包结果
在这里插入图片描述
很标准的三次握手,数据传输,四次挥手过程,此处不展开分析。

开始实验

  先按照实验手册做好环境设置,即禁掉SACK。

task1 TCP传输过程中的IP分片

以下资料参考自MTU TCP-MSS详解和实验手册
  MTU(Maximum Transmission Unit,最大传输单元)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。
  当传输层向IP层发送的数据包超过基础数据链路网络的最大传输单元(MTU)时,就会发生分片。例如,在以太网中,MTU是1500字节。如果IP数据报超过MTU大小,则IP数据报将被分割成多个IP数据报,或者,如果在IP标头中设置了不分段(DF)标志,则丢弃IP数据报,并将ICMP消息发送回发送方,指示问题。
  当一个IP数据报被分割时,其有效负载被分割成多个IP数据报,每个IP数据报都满足MTU施加的限制。每个片段都是一个独立的IP数据报,在网络中独立于其他片段进行路由。分片可能发生在发送主机或中间IP路由器上。片段仅在目标主机上重新组装。
  尽管IP分片化提供了灵活性,可以将数据链路技术的差异隐藏到更高层,但它会带来相当大的开销,因此应该避免。TCP尝试使用路径MTU发现方案来避免碎片,该方案确定最大段大小(MSS),这不会导致碎片。
TCP尝试通过以下两种机制完全避免分片
  建立TCP连接时,它会协商要使用的最大段大小(MSS)。TCP客户端和TCP服务器都将MSS作为选项发送到第一个传输的TCP段的TCP标头中。每侧设置MSS,以便在传输段时,传出网络接口上不会出现分片。采用较小的值作为连接的MSS值。
  MSS的交换仅解决主机上的MTU约束,而不是中间路由器上的MTU约束。为了确定从发送方到接收方的路径上的最小MTU,TCP采用了一种称为路径发现MTU发现的方法,其工作原理如下。发送方总是在所有IP数据报中设置DF位。当路由器需要使用DF位集对IP数据包进行分段时,它会丢弃该数据包并生成类型为“目的地不可访问;需要分段”的ICMP错误消息。在收到此类ICMP错误消息后,TCP发送方将减小段大小。这将一直持续到确定不触发ICMP错误消息的段大小为止。
  我们探究TCP的路径发现MTU设置方式,因此我们要设置路由过程中路由器的MTU而非主机的MTU。首先我们可以查看路由器R1和R2的端口默认MTU大小(限于篇幅,这里只显示路由器R1的,R2类似)
  指令为:show int
在这里插入图片描述
  可以看到默认端口大小都为1500,我们将s3/0端口的MTU大小减小,修改为500,指令如下,R1与R2都修改:

conf t
int s3/0
mtu 500

  再次查看MTU大小:
在这里插入图片描述
  正如我们上面介绍的那样,TCP有两种机制避免分片,第一种是主机沟通确立最小的MSS,第二种是由于路由MTU限制而使用的路径MTU发现机制,这里我们修改了路由的MTU大小,则使得TCP的第一种方法失效,只能使用路径MTU发现机制,因此我们要确保两台主机均开启了路径发现MTU机制,查询和开启指令如下:

#查询 
#0-禁用 
#1-默认禁用,检测到ICMP不可达时开启
#2-开启
sysctl net.ipv4.tcp_mtu_probing	
#开启
sudo sysctl -w net.ipv4.tcp_mtu_probing=2

查询是否开启MTU发现机制
在这里插入图片描述
开启MTU发现机制
在这里插入图片描述
  接下来创建一个大于所设置MTU大小的文件,并传输用于触发分片以及MTU发现机制。指令如下,这里创建一个test.txt文件,包含512个字符“a”(保证大于mtu值500),指令:for i in {0..512}; do echo -n "a" >> test.txt; done;
在这里插入图片描述
  PC-B开启监听,PC-A连接并将上诉产生的数据包传输,抓取PC-A与R1间的报文。PC-A向PC-B传输文件文件指令为:cat test.txt | nc 10.0.3.33 10086

== PC-B启动监听并接收数据==
在这里插入图片描述

连接PC-B并发送上诉产生大文件
在这里插入图片描述
抓包结果
在这里插入图片描述
  可以看到前三个包是三次握手数据包,最后的包是挥手包。中间是数据交互产生的数据包。我们可以从握手包中看到主机间进行的MSS交互。

主机间进行MSS大小交互
在这里插入图片描述

发送的第一个数据包报文
在这里插入图片描述
  可以看到该报文设置了DF位,且一次发送了513字节的数据,则该报文被路由器接收后,因为513字节大于MTU500字节,因此路由器会尝试进行分片操作,然后DF位设置会拒绝路由器的分片,使得路由器丢弃该分片并回送ICMP不可达报文,即下一个报文。
ICMP回传差错报文
在这里插入图片描述
  可以看到该报文类型为3,表示不可达,代码为4,解释为需要分片,并给出了下一跳的MTU大小为500,且下面还封装了导致这一差错的IP原始报文头。
  接下来进入路径MTU发现流程,发送方在接收到上诉的ICMP差错报文后,根据下一跳MTU大小,计算出适合传输的最大段长度,从而在后续的发送报文过程中,避免在中间路径被分片的情况产生。(当然我们这里只有两个路由相连且MTU均为500,因此反映在报文中的情况是只发现了一次就解决了,如果有多跳,且每跳MTU都不相同,则会通过多次的ICMP差错回复进行多次调整,直到找到最合适的发送长度。)

根据下一跳MTU传输数据长度修改为500并分片
在这里插入图片描述
第二片发送剩下的13字节
在这里插入图片描述

task2 TCP请求与一个不存在的实体连接

请求连接到不存在的主机

以下资料参考TCP连接一个IP或端口不存在的主机时,会发生什么?和实验手册
  首先要在PC-A的主机arp表上新增加一条不存在的IP的静态条目,这是因为我们要保证数据包(至少第一次握手请求包)要能发送出去,否则数据包会因为arp询问失败而被丢弃。指令:arp -s 10.0.1.100 00:01:02:03:04
  然后抓取PC-A与R1之间的数据包,并在PC-A上尝试与该主机进行连接,指令:nc 10.0.1.100 10086

请求连接到不存在主机
在这里插入图片描述
  可以看到,抓取到的第一个包是TCP第一次握手的SYN数据包。

TCP第一次握手数据包
在这里插入图片描述
  接下来重传了该数据包三次。
重传
在这里插入图片描述
  这是因为第一个数据包会通过路由器R传递到网段为10.0.1.xx的路由器上,然后路由器发出ARP 请求,询问该局域网内的机器有没有叫10.0.1.100的 (结果当然没有)。导致该包最终没能发送成功,发送端也就迟迟收不到目的机的第二次握手响应,因此触发TCP重传。

请求连接到不存在的端口
  使用PC-A连接PC-B一个未开启监听的端口,这里选择连接80端口,指令:nc 10.0.3.33 80

连接到不存在的端口
在这里插入图片描述

  因为我们连接的IP地址是存在的。所以我们可以正常发消息到目的IP,因为对应的MAC地址和IP都是正确的,所以,数据传输过程没有问题。然而当数据包传输到目标主机传输层时,TCP协议在识别到这个端口号对应的进程根本不存在时,就会把数据丢弃,响应一个RST消息给发送端。
  报文如下图,可以看到返回的数据包RST位被置为1,且发送的源端口为80,即我们的目的端口(不存在的端口)。

RST响应报文
在这里插入图片描述

  RST是一种强制关闭连接的机制,我们知道TCP正常情况下断开连接是用四次挥手,那是正常时候的优雅做法。但异常情况下,收发双方都不一定正常,连挥手这件事本身都可能做不到,所以就需要一个机制去强行关闭连接。RST 就是用于这种情况,一般用来异常地关闭一个连接。它在TCP包头中,在收到置了这个标志位的数据包后,连接就会被关闭。

task3 TCP重传

以下资料参考TCP重传机制详解和实验手册
  TCP有常见的几种重传机制:超时重传、快速重传、SACK(Selective Acknowledgment)等。

超时重传:当发送数据时,设立一个定时器,当超过指定时间后,发送端没有收到ACK应答报文,则触发超时重传机制,重发该数据。超时重传时间存在一个度量,既不能太长,超时时间过长的话,那么就会导致数据包丢失了一段花时间才重传,减低了网络传输效率,但是也不能太短,超时重传时间过短的话,那么就很有可能造成数据包还没到接收端或者应答ACK没到发送方就会重传。因此超时重传需要一个适中的标准,一般设置超时重传略大于往返时延(即数据从网络的一端到另外一段的往返时间)。TCP采用的是发送端每次的重传都是经过越来越长的时间进行的。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。超时重传存在的问题之一就是超时周期过长,当我们多次丢失数据包时,这种长周期的机制就会使我们延迟发送,加大了端到端的时延。

快速重传:为了解决这种超时重传的长周期情况,TCP通常可在超时时间发生之前通过冗余的ACK来较好的检测丢包情况。我们都知道,在数据传输过程中,如果一个数据包丢失,其后发送的数据包到接收端都会返回丢失数据包的ACK,因为该数据包还未被接收确认。因为发送方经常一个接一个地发送大量的报文段,如果一个报文段丢失,就很可能引起许多一个接一个的冗余ACK,如果TCP发送方接收到对相同数据的3个冗余ACK,它把这当作一种指示,说明跟在这个已被确认过3次的报文段之后的报文段已经丢失.一旦收到3个冗余ACK, TCP就执行快速重传,即在该报文段的定时器过期之前重传丢失的报文段。

SACK: 快速重传机制解决了超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。针对这一问题,改进的方法就是SACK,这种方式需要在 TCP 头部[选项]字段里加一个 SACK,简单来讲就是在快速重传的基础上,返回最近收到的报文段的序列号范围,这样客户端就知道,哪些数据包已经到达服务器了,可以避免丢失后需要重传所有数据包的问题。

  接下来我们会引起TCP传输的重传机制,探究其报文特征。由于往返时延我们不能测量,因此我们通过设置时钟以及手动开关网络来达到引起重传的目的。
首先设置R1和R2的s3/0端口的时钟,指令如下:

conf t
int s3/0
clock rate 1200 

设置路由器端口时钟
在这里插入图片描述

  接着我们要创建一个巨大的文件使得传输时间够久,以便我们控制中断和开启数据传输,造成时延。这里创建一个含有100000个字符“a”的文件test.txt,指令:for i in {1..100000}; do echo -n "a">>test.txt; done;
  接着抓取PC-A与R1之间的包,PC-B启动nc监听,PC-A传输该文件给PC-B。
PC-B启动监听并接收文件
在这里插入图片描述

PC-A连接PC-B并传输大文件
在这里插入图片描述
  因为文件够大,所以会传输一段时间,我们在传输过程中关闭R1的s3/0端口一段时间(约5秒),再开启,指令如下:

conf t
int s3/0
#关闭端口
shut	
#等待一定时间开启端口
no shut

传输过程中开关S3/0端口
在这里插入图片描述
抓取到的重传包
在这里插入图片描述
首先我们可以看到超时重传包。
在这里插入图片描述
该包第一次在23:05:27秒被发送。

图2.61 第一次发送
在这里插入图片描述
此时我们切断了端口,并等待了一段时间后开启,该包在23:05:48重传。.
在这里插入图片描述
我们还可以看到快速重传包
在这里插入图片描述
可以看到,再收到3个关于549的冗余ACK后,发送了快速重传包。

附TCP报文结构以及各字段含义

以下资料参考自《网络协议——分析、设计与仿真》

在这里插入图片描述
TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据需要而添加的字段。
各字段含义为:

  • 16位源端口号:用于标识发送TCP报文段的应用程序的端口号,占2字节16位。
  • 目的端口号:用于接收TCP报文段的应用程序的端口号,占2字节16位。
  • 32位序号:用于指明报文段在发送方的数据字节流中的位置,占4字节32位。
  • 32位确认号:用于通知对方期望接收下一个报文段的序号,占4字节32位。序号和确认号是发送方和接收方用来对数据字节进行技术的。
  • 4位首部长度:也是数据偏移量,用于度量从报文段开始位置到数据开始位置的偏移量,即TCP报文段首部长度。本字段占4bit位,以4字节为基本计数单位。
  • 保留:占6bit位,固定为0,保留给未来使用。
  • URG(紧急bit):占1bit,当该位为1,表示紧急指针字段有效,并通知协议处理程序本报文段中有紧急数据,应当尽快传送。
  • ACK(确认bit):占1bit。当该位为1时表示本报文段携带有确认信息。
  • PSH(推送bit):占1bit。当该位为1时,表示本报文段请求推操作来强制进行数据发送。
  • RST(复位bit):占1bit。当该位为1时,表示TCP链接出现严重偏差,必须释放链接,此外也用于拒绝非法报文段和拒绝打开连接。
  • SYN(同步bit):占1bit。当该位为1时,表示连接请求或连接接受报文,通常需要与ACK结合使用。
  • FIN(终止bit):占1bit。当该位为1时,表示发送方的数据已发送完毕,要求释放TCP连接。
  • 16位窗口大小:用于控制对方发送的数据量,进行流量控制,占2字节16位。
  • 检验和:用于检查报文是否在传输过程中出差错。占2 字节16位。
  • 紧急指针:当 URG=1 时才有效,指出本报文段紧急数据的字节数。占2字节16位。
  • 选项:长度可变,最长可达 40 字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将Ubuntu虚拟机架设到GNS3拓扑网络上并进行TCP协议仿真分析 的相关文章

  • 内存分段与内存分页:逻辑地址、物理地址、线性地址、虚拟地址

    这篇文章也是我自己的博客网站的里的文章 xff0c 我觉得这篇文章还是我觉得知识含量比较高的文章 xff0c 所以特地把它发出来看看 这篇文章写于我在写自己的操作系统JackOS的时候系统梳理了一下CPU访问内存的各种方式 xff0c 写完
  • VSCode调试C/C++项目

    最近写完了自己的操作系统 xff0c 深感有一个方便的调试环境是有多么重要 xff0c 能够提升不少开发效率 恰好最近在的技术交流群里群友在问如何搭建VSCode调试操作系统的环境 xff0c 刚考完试 xff0c 就先把这篇VSCode调
  • 误差与精度

    整理自 误差理论与数据处理 合肥工业大学 机械专业用于教授学生误差与精度概念的课程叫做 公差与测量 或者叫做 机械精度设计 xff0c 而公差或者精度的本质含义就是误差的大小 xff0c 公差越小 xff0c 误差越小 xff0c 精度越高
  • 两个类的头文件互相包含

    两个类的头文件互相包含 我做任务的时候遇到了两个类都互相包含对方的对象的问题 xff0c 本来是有错误的 xff0c 但经过我一番改动 xff0c 两个头文件互相包含同时 xff0c 每个头文件都含有令一个类的前置声明 虽然最后运行正确 x
  • 【C++ STL 容器】——vector

    概述 vector容器也被称作向量 xff0c 实现了动态的数组 xff0c 用于元素数量变化的对象数组 xff0c 算是比较常用的容器 常用函数 构造函数 vector 创建一个空vectorvector int size 创建一个vec
  • 2021-07-22

    MSP432在keil中通过CMSIS DAP下载程序出现cannot enter debug mode的解决办法 xff1a MSP432下载程序出现cannot enter debug mode 可以通过修改如下设置 Debug里面的两
  • 通信协议基础以及常用的串口通信协议

    通信协议 xff1a 串行通信和并行通信 在数据的通信方式中根据数据传输方式的不同可以分为 xff1a 串行通信和并行通信 串行通信 xff1a 串行通信是指使用一条数据线 xff0c 将数据一位一位地依次传输 xff0c 每一位数据占据一
  • Ubuntu安装ROS melodic,管理环境,创建工作空间

    一 安装ROS 1 设置源 xff1a sudo sh c 39 etc lsb release amp amp echo 34 deb http mirrors tuna tsinghua edu cn ros ubuntu 96 lsb
  • HTTP请求报文的结构组成及URL的结构组成

    HTTP请求报文 HTTP 超文本传输协议 Hypertext Transfer Protocol xff0c 简称HTTP 是应用层协议 HTTP 是一种请求 响应式的协议 xff0c 即一个客户端与服务器建立连接后 xff0c 向服务器
  • Qt之旅_001>>Qt常用窗口类之间的关系

    QApplication xff0c QGuiApplication QCoreApplication三者之间的关系 QCoreApplication处于core模块中 xff0c 为应用程序提供了一个非gui的时间循环 xff1b QGu
  • GPIO相关介绍

    文章目录 GPIO概念TXD与RXD GPIO的使用注意STM32IO口哪些兼容5V一定不要接超过5V的电压默认不能做输出的GPIO GPIO硬件原理图GPIO地址 GPIO的八种工作模式浮空输入带上拉输入带下拉输入模拟输入开漏输出推挽输出
  • STM32的常用C语言

    文章目录 一些被坑了的注意点 int16 define结构体与共用体指针 C语言发展史C语言概述C90 标准C99标准C11标准 C编译o代替c 条件语句else ifdo while 变量定义一个字符串字符串结尾 定义一个字符串数组sta
  • STM32应用霍尔转速传感器基于输入捕获

    这里我用通用定时器3的通道1来测量转速 霍尔转速传感器基本介绍霍尔传感器分类和原理关于为什么选用开关型常开PNP型霍尔传感器 STM32程序实现程序介绍程序源码TIM3 CAP HTIM3 CAP H解读TIM3 CAP CTIM3 CAP
  • Android so库开发——使用Studio生成自己的so库(一)

    一 创建Native项目 1 新建 Native 项目 1 xff09 新建项目 选择最下面的 Native C 43 43 下一步即可 2 xff09 填写项目信息 3 xff09 选择C 43 43 版本可以直接选择默认 2 下载并配置
  • C语言实现线性回归求斜率

    2020 11 22 修改 span class token comment 线性回归求斜率 注意数据类型 参数 count 数据个数 数组行 列 的个数 数组的行列数目相等 参数 dataCol X 数据的列数据 参数 dataRow Y
  • 【C语言】详解位域定义与使用

    位域的定义 span class token keyword struct span span class token class name bit span span class token punctuation span span c
  • C语言实现MQTT协议(一)协议讲解

    MQTT介绍 MQTT是一个客户端服务端架构的发布 订阅模式的消息传输协议 它的设计思想是轻巧 开放 简单 规范 xff0c 易于实现 这些特点使得它对很多场景来说都是很好的选择 xff0c 特别是对于受限的环境如机器与机器的通信 xff0
  • 【STM32】HAL库-外部中断

    外部中断框图 产生中断 硬件触发外部中断 配置中断屏蔽寄存器中的屏蔽位 xff0c 允许该外部中断请求 通过AFIO EXTICRx配置GPIO线上的外部中断 事件 xff0c 必须先使能AFIO时钟 选择外部中断的触发边沿 xff0c 上
  • 【STM32】HAL库-系统滴答定时器SysTick

    SysTick定时器被捆绑在NVIC中 xff0c 是一个简单的定时器 xff0c 对于CM3 CM4内核芯片 xff0c 都有Systick定时器 Systick定时器常用来做延时 xff0c 或者实时系统的心跳时钟 这样可以节省MCU资
  • 【STM32】HAL库-串口USART

    USART简介 通用同步异步收发器 USART 提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换 USART利用分数波特率发生器提供宽范围的波特率选择 一个波特率寄存器 USART BRR xff0c

随机推荐

  • 【STM32】HAL库-通用定时器

    简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成 它适用于多种场合 xff0c 包括测量输入信号的脉冲长度 输入捕获 或者产生输出波形 输出比较和PWM 使用定时器预分频器和RCC时钟控制器预分频器 xff0c 脉冲长
  • 【STM32】HAL库-SPI

    3线全双工同步传输 带或不带第三根双向数据线的双线单工同步传输 8或16位传输帧格式选择 主或从操作 支持多主模式 8个主模式波特率预分频系数 最大为fPCLK 2 从模式频率 最大为fPCLK 2 主模式和从模式的快速通信 主模式和从模式
  • 【STM32】标准库-以太网外设-LAN8720A-LWIP-无操作系统

    TCP IP模型 TCP IP 只有四个分层 xff0c 分别为应用层 传输层 网络层以及网络访问层 xff08 物理层 xff09 实际上 xff0c 还有一个 TCP IP 混合模型 xff0c 分为五个层 它实际与 TCP IP四层模
  • 【STM32】标准库-LTDC-DMA2D

    LTDC STM32F429 系列芯片内部自带一个 LTDC 液晶控制器 xff0c 使用 SDRAM 的部分空间作为显存 xff0c 可直 接控制液晶面板 xff0c 无需额外增加液晶控制器芯片 STM32 的 LTDC 液晶控制器最高支
  • 【STM32】HAL库-以太网外设-LAN8720A-LWIP-无操作系统

    开发环境 KEIL MDK ARM 5 27MCU STM32F429IGT6PHY IC LAN8720ALWIP LWIP2 1 2STM32CUBEMX 6 6 1HAL V1 27 1 LAN8720A使用RMII接口与STM32的
  • git学习

    常用命令 查看当前文件夹下的文件与文件夹 xff1a ls ll 进入当前文件夹下的user文件夹 xff1a cd user 查看当前文件夹下的test txt文件 xff1a cat test txt 返回上一级目录 xff1a cd
  • 电赛专题---一.概述【电赛简介 /信号类需要准备什么?/怎么才能打好电赛?】

    1 电赛简介 全国大学生电子设计竞赛 xff08 National Undergraduate Electronics Design Contest xff09 是教育部和工业和信息化部共同发起的大学生学科竞赛之一 xff0c 是面向大学生
  • Postman安装

    1 官网下载 下载链接地址 xff1a https www postman com downloads 点击Download the App 根据自己的电脑以及需求选择对应的32位或者64位的版本 2 双击安装包 xff0c 不用任何操作
  • UART串口通信

    串口是 串行接口 的简称 xff0c 即采用串行通信方式的接口 串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送 xff0c 其特点是通信线路简单 xff0c 但传输速度较慢 因此串口广泛应用于嵌入式 工业控制等领域中对数据传输速
  • Java第四课数据类型(二)

    一 变量类型 1 字节型 byte 2 整型 xff08 1 xff09 int 整型 4字节 xff08 2 xff09 show 短型 2字节 xff08 3 xff09 long 长型 8字节 3 浮点型 xff08 1 xff09
  • ESP32蓝牙配网

    注意 menuconfig 配置 xff08 必须打开蓝牙我这是C2所以使用NimBLE xff09 可以直接从demo的配置文件拷贝 Component config gt Bluetooth gt NimBLE BLE only Com
  • [C#] UDP协议 常用简单的代码(基于UdpClient类)(Thread实现)

    目录 说明1 消息发送端2 消息接收端 说明 在使用 C 开发Winform WPF等富客户端应用程序时 xff0c 有时会有 进程 之间 相互通信 的需求 下面是一种能够实现Udp 消息收发 常用且较为简单的 C 代码 使用注意 xff1
  • 掌控板OLED显示

    掌控板OLED显示 OLED显示文本内容 需要先将显示清空 xff0c 然后将想要显示的内容放在里面 xff0c 最后放入oled显示生效 源代码如下 xff1a span class token keyword from span mpy
  • 激光slam学习笔记1--RTK组合惯导、激光雷达传感器一些经验知识分享

    前言 xff1a 跟组合惯导和激光雷达打交道半年了 xff0c 过程中查找学习了这两方面的资料 xff0c 这里来个小结 如果有理解错误的 xff0c 望大佬们不吝赐教 一 RTK组合惯导 个人理解有两部分组成 xff0c 一个提供gps信
  • 计算机组成原理第五章:输入输出系统

    本章知识架构 接口 接口分类 xff1a 并行接口 xff1a 接口与系统总线 xff0c 接口与外设均按并行方式传送数据 串行接口 xff1a 接口与系统总线并行 xff0c 与外部设备串行 按I O传送控制方式划分 xff1a 直接程序
  • STM32串口通信 (缓冲区 发送不出数据&接收不到数据)

    STM32串口通信 流程附上代码注意事项一点心得 xff1a 流程 xff08 简单的发送数据 xff09 GPIO时钟使能串口时钟使能串口的GPIO配置写初始化串口函数 xff0c 配置串口USART Init USART1 amp US
  • 设计一个脉冲发生器,已知系统时钟为50MHz,生成脉冲宽度为1ms,脉冲间隔可调,最大间隔为1s

    设计一个脉冲发生器 xff0c 已知系统时钟为50MHz xff0c 生成脉冲宽度为1ms xff0c 脉冲间隔可调 xff0c 最大间隔为1s Design a pulse generator The system clock is kn
  • 详解结构体与链表

    目录 1 定义使用结构体变量 2 使用结构体数组 3 结构体指针 4 结构体内存对齐 重点 5 typedef的使用 6 动态内存的分配与释放 7 链表的创立 增删查改插 什么是链表 xff1f 静态链表和动态链表 链表的创立 链表的插入元
  • c++头文件及函数

    目前小编只了解到这些 xff0c 如果还有其他的一些头文件或函数 xff0c 欢迎评论区留言或者私信小编 xff0c 谢谢大家的观看 1 include lt iostream gt system pause 系统暂停 system mod
  • 将Ubuntu虚拟机架设到GNS3拓扑网络上并进行TCP协议仿真分析

    目录 前言环境配置 xff08 将Ubuntu虚拟机挂载到GNS3拓扑网络上 xff09 配置Ubuntu虚拟机GNS3拓扑网络配置先进行一下数据传输检验通路是否正常 开始实验task1 TCP传输过程中的IP分片task2 TCP请求与一