T C P
文章目录
- 基于UDP应用场景
- TCP协议
- TCP 协议段格式
- 确认应答机制
- 16位窗口大小 下定义
- 32位序号和32位确认序号
基于UDP应用场景
UDP,tcp这样的协议根本不是直接谈UDP。tcp的应用场景,一定是上层写了应用层协议,所以才有UDP协议的应用场景。
比如http
TCP协议
传输层最重要的协议,几乎没有之一
因为TCP基于通信时保证可靠性,对于高效传输也有一定策略。
TCP协议是目前应用层协议使用时常见的协议。
比如网络版本计算器,底层是TCP套接字。
http底层就是TCP协议,用的也是TCP套接字。
TCP叫传输控制协议
为什么叫传输控制,从何而来
TCP在OS内部存在自己的发送和接受缓冲区。
每建立一个链接的的时候,此时OS内部就要为该链接创建发送缓冲区和接受缓冲区
应用层也要定义缓冲区来接受用户输入,和输出结果给用户–用户级缓冲区
计算器为了能接受请求定义string in_buffer
通过read把数据读上来。
当上层调用write,read接口时,本质不是把数据发送到网络中!
那是什么呢?
比如发送,发送的数据拷贝到TCP的发送缓冲区,应用层就认为数据已经交给了系统。
至于数据什么时候发送,发 送多少,出错了怎么办?
完全由OS,TCP协议自主决定
所以write,read,recv ,send与网络相关的发送接口,本质不是发送函数而叫做拷贝函数
好像在哪里听过啊?
以前讲文件的时候不就是这样吗?
往文件里写也用的wirte接口,所以当时说C语言提供缓冲区,也是用户级缓冲区,我们把数据写到文件里,写到OS内部,要通过fd写入的,每个文件都有自己的文件缓冲区,所以应用层读写文件时把数据写到文件里,本质就是把数据拷贝到内核的文件缓冲区里,至于数据什么时候刷,刷多少,整个刷新细节你不用关心,是由OS和磁盘交互的,今天看来磁盘和网络有区别吗?
把磁盘设备换成网卡,不就完成数据发送,IO吗,冯诺依曼体系结构里文件是IO,往网络里写本质不就是在硬件层面上把内存里的数据写到网卡上,也是IO,大家在理念上是一致的,更何况Linux一切接文件。
从今天开始对于网络的理解,就可以这么认为了
我的应用层只负责对收上来的数据进行协议处理,把报文和报文分开,诸如反序列化,变成结构化数据,根据协议对数据做处理,把数据写好的响应发给TCP缓冲区应用层的工作就完了,至于数据什么时候发由TCP决定。
通信双方都支持TCP协议,所以CS的地位是对等的。所以一方学懂了另一方一样。
应用层把数据本质拷贝到发送缓冲区。
至于数据怎么发,其实把传输层发送缓冲区
的数据导到对方的接受缓冲区里,本质也是拷贝!
只不过这个拷贝工作需要通过网络而已,通过网络可能会出错,所以需要很多策略。
接收方通过read调用时会阻塞,由于接受缓冲区没有数据,有数据则资源就绪了。
后面网络和文件揉在一起说说
解释为什么UDP或Tcp 只有同样一个FD既可以读也可以写,因为一个fd配套两个缓冲区,所以可以即读又写了。-- 全双工
这就是TCP缓冲区的理解。
TCP下层还有协议,我们把数据交给下层,并不是直接发送给对方。
1。传输层的接受缓冲其实就是内存空间
2。OS为了管理对应的内存其实是把整个内存想成一个个4KB空间,所以OS有这么多内存块,OS怎么知道哪些已经被占用了那些没有,那些被锁定了,那些过期了?
OS就要对内存块管理。
为了管理内存所以每个内存块都要有strcut page这样的结构
所以接受发送缓冲区,无非就是多个内存块即strcut page构成的。
OS中用数组把100多万个page管理起来,对内存管理转为对数组的增删查改。
打开一个网络相当于得到一个文件描述符,底层一定有Strcut file对象,Strcut file对象以前指向磁盘,今天网络Strcut file对象指向网络设备,每个Strcut file后面跟上两个缓冲区,由多个4kb构成的,此时上层不变下层直接切换成网络这样的效果。
为什么突然扯到这里呢?
问题
所以为什么叫传输(能理解)控制协议(能理解)?
控制是什么意思?
应用层把数据经过write拷贝到发送缓冲区里,至于发送缓冲区里的数据什么时候发,发多少,本质就是在控制如何发送的问题。
这些工作由TCP协议自主决定,所以把他叫做传输控制协议。
为什么提供发送缓冲区呢?
当前对端来不及接受了,发送端怎么知道呢?用户一直把数据往缓冲区写,因为有缓冲区的存在,即便来不及接受了,但对于应用层来讲,可能并不影响应用层继续向OS拷贝,数据拷贝多了,发送缓冲快满了,OS就让对方接受缓冲区快点拿数据了。
TCP是具有接受发送缓冲区,进行全双工通信的,进行数据发送控制的一种协议。
TCP 协议段格式
应用层 请求和响应
传输层 数据段
网络层 数据报
链路层 数据帧
问题
1、报头和有效载荷如何分离,如何交付给上层?
TCP协议基本结构分三部分
TCP报头前20字节就是TCP标准报头
TCP支持对应的选项–我们忽略但存在
第三部分,TCP协议的有效载荷
如何交付给上层?
前两个字段,端口交付给上层目标进程
对TCP报文向上交付给进程
一行是4字节,0-31
标准报头一共五行,所以标准报头是4x5=20字节
报头和有效载荷如何分离?
当读取TCP数据时,在缓冲区里把前20字节拿出来,报头信息全拿到了,标准报头全拿到了他也是约定长度。
TCP报文里有一个字段,4位首部长度
凡是报文里介绍首部长度,他就真的是。
表示报头总长度,你不是说了标准报头是20字节吗,因为还包含了选项,选项也可以不带。
4位首部长度 【0000,1111】【0-15】
全写成1表示数字也就是15,怎么可能是20 呢?
是不是有问题呢?
不是,因为4位首部长度计算的时候,有基本的大小单位:4字节
则表示长度范围【0,60字节】
所以选项最多是40字节。
如果不带选项,则四位首部长度设为X
x * 4 = 20 => x = 5 = 0101
4位首部长度准确的把报头从整个报文里去掉
报头和有效载荷如何分离我们怎么做呢
实际上先读取前20字节,固定长度,之后根据4位首部长度计算出实际总大小再减去20剩下的就是选项的大小,没有的就不读了,剩下的就是数据
所以如何分离?
固定长度(前20字节)+ 自描述字段
你收到一个数据能不能按照指定字节数对数据做截取呢?
你直接把数据收上来,截取前20字节,整个报文也是结构体,地址强转成结构体指针直接从里面提取4位首部长度,这个4位长度描述是自身的报头大小,所以他叫自描述字段。(我们网络版本计算也带有有效载荷长度,也叫做自描述字段)
固定长度+自描述 的方式 能把标准报头和选项全部读上去,因为标准报头就是20字节,剩下的就是数据,所以能作分离。
1、报头和有效载荷如何分离,如何交付给上层?
搞定
整个报文也是结构体,他所谓的封装是把报头结构体变量形成的对象内容拷贝到数据前面。
能封装,也能拆开
下一个问题
16位窗口大小
左边客户端,有应用层和传输层/TCP
TCP有自己的接受缓冲区和发送缓冲区。
对于服务端也是这个结构
此时应用层构建Http请求
把数据通过write结构写到发送缓冲区里,传输层要发送这个数据给对方,此时要给发送的数据添加TCP报头
没来得及发送的就放到发送缓冲区里,可能有多个Http请求
封装报头经过底层交到对方的接受缓冲区里时,对方收到这个报文要进行报头有效载荷分离,套接字创建出来都要有自己的接收缓冲区,至此去掉报头的Http有效载荷请求放到接受缓冲区中。
问题
你心里要特别清楚,客户端和服务器基于tcp协议进行通信时,互发消息的时候,发送的可是完整的tcp报文哦,即一定携带完整的tcp报头
不管课件如何简写,双方通信时发数据发确认,当你看到数据时可不仅仅是数据他一定要涵盖tcp报头+数据,响应同理
看起来是发syn+ack,本质上是把报头特定的属性字段设置了,归根结底所有请求和响应都要基于tcp报头为载体
发起Http请求时一定要想到请求包含报头一大堆东西的。
tcp一样,报头必须完整
换句话说,C给S发消息时基于套接字,上层来看都是通过fd来读写的。
所以你打开多个套接字建立多个连接每个连接都要有一对收发缓冲区
双方通信时发送的报文携带完整报头
tcp协议要保证可靠性
不可靠的表现呢?
数据传输出现重复,乱序,丢包
发送的过程本质是把数据拷贝给对方,对方接受缓冲区是固定大小的,所以他的剩余空间就少了,如果应用层就不想读,此时发送方应用层给对方一直发消息,客户端和服务器双方进行通信时,客户端不清楚服务器接受能力的,所以客户端一直给服务器发消息时,服务器来不及接受,最终可能导致服务器接受缓冲区被写满,客户端又不知道就继续发,最后导致接受缓冲区没空间导致数据丢包。
所以CS通信时,服务器接受能力很少的时候我们要让客户端发慢点或者干脆不发了,
由发送方向服务端发消息,通过控制发送数据的速度让对方来得及接受从而规避大面积丢包的情况,我们称为流量控制。
tcp注定要解决这个问题
tcp可靠性里有一种叫做丢包重传
如果报文丢失了,发送发可以对服务器补发的。
如果对方来不及接受了出现大面积丢包,tcp害不害怕丢包,不害怕他有重传啊。
可以吗这样,可以。
但有更好的方案啊。
虽然你有重传,但是这样不合理,报文经过千里迢迢到了对端,我没有明显错误却要把我丢弃掉,所以他不合理。
我们不能让他启用重传策略,浪费曾经的发送,效率必定不高
既然来不及接受,那就要发送慢一点
tcp保证可靠性,凭什么说他保证可靠性?
最基本的一个特点:确认应答(最重要的机制)
比如我们两个相隔千里,老师说的话同学听到没听懂没老师不知道,所以老师经常说听懂没,听懂扣1,要求你给我响应的过程就叫做确认应答。
所以暂时认为客户端给服务器发送任何消息的时候,服务器都要对收到的消息进行响应
那你能保证你扣的6,老师一定能看到吗
确认应答机制
CS双方地位对等
如果C给S发消息,即便服务器没有任何话说,但服务器至少要对消息进行一次确认应答。
服务器想给客户端发消息,客户端OS也要立即给服务器确认应答。
这样就能保证对于C来讲,客户端刚刚发的消息服务器收到了。
基于确认应答保证了客户端到服务器方向的可靠性
同理服务器给客户端发消息,客户端做应答保证服务器到客户端方向数据的可靠性
重谈通信过程
客户端向发送消息交给服务器,服务器收到了这个消息,TCP协议要立即给对方应答
问题
无论发送消息,确认应答最后都是tcp报文,无论发的是什么消息什么应答,一定携带完整的tcp报文或者是报头
发送方 发送的量非常大,也很快
导致对方来不及接受,所以需要流量控制,无非就是让客户端发送数据慢一点,要发慢一点依据是什么?慢多少啊?
靠谁来决定呢?
由对方接受缓冲区当中剩余空间的大小决定
对于发送方来讲,发送速度由对方的接受缓冲区中剩余空间的大小决定!!!
剩多少空间让我知道了,我就可以根据你剩余空间最多发送把你缓冲区打满的数据,发满了我就不发了。
关键在于,客户端是给你发送数据,客户端怎么知道你服务器端剩余空间的大小呢?
我们tcp基于确认应答机制的,你发了一个报文我要给你响应,别忘了请求和响应都要是完整的报文,所以发一个消息对方会给我响应的,我收到响应才发 第二个目前认为。
收响应的时候,我就收到来自服务器给客户端发来的响应,响应中16位窗口大小填充就是我服务端接受缓冲区剩余空间大小。
得知对方接受能力是多少,客户端就知道应该最多发多少数据了。
这就叫16位窗口大小。
16位窗口大小填的应该是谁的接受缓冲区剩余空间大小呢?
客户端给服务器发,要进行流量控制,服务器有没有可能给客户端发消息呢?
tcp是全双工的。
所以从客户端到服务器端要进行流量控制,那么从服务器到客户端发送要不要也进行流量控制呢?
要
所以双方互发消息,互相确认应答,双方会出现很多tcp报头往来,双方根据报头里16位窗口大小,互相得知对方的接受缓冲区剩余空间大小,双方就可以进行互相流量控制。
16位窗口大小 下定义
我要填充的报头一定是我要给对方发的。
所以16位窗口填写的是自己的接受缓冲区中剩余空间的大小!!
这么多报头传输效率会不会很低?
后面有滑动窗口
(应用层比如Http有主从关系,你是客户端你只能向服务器发起请求
tcp双方地位对等,即你能向我发送报文我给你确认应答,左侧右侧都要互相有流量控制。
)
32位序号和32位确认序号
tcp说自己有确认应答机制,我们该如何理解确认应答呢?
为什么确认应答是保证可靠性最重要的一个核心点呢?
思考一个问题
这个世界,存不存在100%可靠的网络协议?
例子,我跟你不是面对面,相隔100米
我给你发了个消息,我们去吃饭吧
你回了个好的,这样能保证我给你的消息你是收到了的,但是你怎么知道刚刚说的好的被我收到了呢?
那我要保证你刚刚给我发来的好的消息,我也想让你知道我已经收到了,怎么办呢?我再给你回收到了你的好的了
可是当我给对方发了收到了你的好的了,确实能保证上一次的好的消息被我收到了,可是最新的消息怎么保证对方也收到了呢?那对方再给你个应答吧, 最新的消息怎么保证对方一定收到了呢?
1。站在我个人角度只要我收到应答,我就能保证我最近一次发送的消息对方收到了。
同理对对方也一样
2。没有应答的数据,我们无法保证可靠性,所以最新的一条消息,不管是我给对方说,还是对方给我说永远存在最新的一条消息,是没有应答的,所以在人类世界里几乎无法保证发出的消息时100%可靠的!
所以世界上不存在100%可靠的协议的
虽然整体不存在,但是局部上呢?
我刚给你发的消息,我给你应答,对你来讲,你并不确定这个应答我是否收到,对我来讲我只要收到对应的应答,我能保证从左向右方向上数据的可靠性。
对右边来讲,右边给左边发的消息只要右边也收到应答,他无法保证 最新的消息被自己收到,但只要右边收到了应答,就能保证从右向左的可靠性
虽然最新的一条消息没有应答,无法保证最新的一条消息可靠,但是局部上最新消息之前的消息我们其实是可以保证双方在两个方向上的可靠性。
这样说有点抽象,直接说tcp真实的方案
左C,右S
tcp最基本,最原始的通信过程
所以刚刚场景中,除了最新的消息,上面之前每一个报文的都有应答
所以之前的消息能保证各个方向上的可靠性
正常情况不会存在这样的场景的
我给你发个消息,你给我应答了,收到了,站在我的角度呢我就不再给你发消息了。
我们没必要对应答再作应答,实际上是鸡生蛋,蛋生鸡的问题,无穷尽了。
CS通信最终要的是保证两个方向上的可靠性
所以C给S发一条消息,tcp数据
S要合适的时候对消息进行应答,因为是客户端给服务器发消息,我要保证消息被对方收到了,我是主动的对方被动,我只要保证我发的消息被对方收到了,这不就达到了宏观层面上我们两个通信的目的吗。
所以我给对方发消息,对方只要给我应答,我收到应答时能保证我发的消息被对方收到了,这就叫保证客户端到服务器方向上的可靠性。
我们不需要再对应答再给S进行响应。
如果服务器要给客户端发消息tcp数据本质也是完整的tcp报文。
服务器是主动的一方,他要给客户端发消息,本质的目的就是想确认把这个数据发送给C,包括C给我做应答,你也是告诉对方你刚给我发的消息我已经收到了。
所以C也给S发了个应答
虽然C不能确定应答有没有被S收到,暂时我们不管,但假设S收到了应答,服务器立马就意识到我刚刚发的消息对方也收到了,所以只要收到应答,我们从右向左的可靠性也能保证。
所以要发送的一个数据,对应配套的收到应答,就能保证两个朝向上的可靠性。
所以第一阶段总结论
相关文章:

T C P
文章目录 基于UDP应用场景 TCP协议TCP 协议段格式确认应答机制16位窗口大小 下定义32位序号和32位确认序号 基于UDP应用场景 UDP,tcp这样的协议根本不是直接谈UDP。tcp的应用场景,一定是上层写了应用层协议,所以才有UDP协议的应用场景。 比…...

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换
目录 概述 PDF/A 是什么?与 PDF 有何不同? 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…...

【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.net/…...

解决el-select数据量过大的3种方法
在准备上线的后台管理系统中,我们发现有两个下拉框(select),其选项数据量超过 1 万条,而在测试环境中这些数据量只有几百条。这导致在页面加载时,浏览器性能出现瓶颈,页面卡顿甚至崩溃。 想了一…...
速盾:高防cdn预热指定url就只刷新这个吗?
高防CDN预热是指在网站上线或更新之前,将网站内容缓存到CDN节点服务器上,以提高用户访问网站的速度和稳定性。通常,预热可以通过指定URL来进行,而不是刷新整个网站。 预热指定URL的好处是可以选择性地进行缓存刷新,而…...
aarch64-linux-gnu-g++在windous不能用
aarch64-linux-gnu-g 是针对 ARM 64 位架构(aarch64)的交叉编译器,它通常用于在一个平台(例如 x86 的 Linux 系统)上为另一个平台(例如 ARM 设备)编译代码。aarch64-linux-gnu-g 是 Linux 环境下…...

01_Node.js入门 (黑马)
01_Node.js入门 知识点自测 从 index.js 出发,访问到 student/data.json 的相对路径如何写? A:../public/teacher/data.json B:./public/student/data.json C:../student/data.json <details><summary>答案</sum…...

记一次搞校园网的经历
接教室的校园网,到另一个屋子玩电脑,隔墙想放大一下AP的信号,发现死活不行 这是现状 由于校园网认证的存在,无法用桥接,桥接需要路由器有IP,而这个IP无法用未刷机的路由器来打开校园网页面认证 解决 将一…...

沃德云商协系统微信小程序PHP+Uniapp
“多组织”的云服务平台,打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台,让各大分会、各大分校友会、分组织实现轻松管理,线上宣传展示、商机挖掘、会员管理、会员服务、跨界交流等, 借助沃德云商协平台系统,让…...

Leecode刷题C语言之可以被进一步捕获的棋子数
执行结果:通过 执行用时和内存消耗如下: 代码如下: int numRookCaptures(char** board, int boardSize, int* boardColSize) {int cnt 0, st 0, ed 0;int dx[4] {0, 1, 0, -1};int dy[4] {1, 0, -1, 0};for (int i 0; i < 8; i) {for (int j…...
【算法】数组中,求K个最大值
已知:数组 [8, 9, 15, 20, 3, 5, 7, 2, 6],求第8个最大值是哪个值? function quickSort(arr, targetIndex, start) {if (arr.length < 1) return arr[0];let left [];let right [];const mid Math.floor(arr.length / 2);const midNum…...

Postman自定义脚本Pre-request-script以及Test
这两个都是我们进行自定义script脚本的地方,分别是在请求执行的前后运行。 我们举两个可能经常运用到的场景。 (一)请求A先执行,请求B使用请求A响应结果作为参数。如果我们不用自定义脚本,可能得先执行请求A,然后手动复制响应结果…...

Lua中实现HTTP请求的User-Agent自定义
User-Agent(用户代理)是HTTP请求头的一部分,用于描述发出请求的客户端的信息,包括浏览器类型、版本和操作系统等。自定义User-Agent对于开发者来说是一个重要的功能,它可以帮助服务器识别请求来源,也可以模…...
工业节能水泵如何节能?
在现代工业生产中,水泵作为一种重要的流体输送设备,广泛应用于各个领域。无论是在制造业、化工、能源,还是在污水处理、灌溉等行业,水泵在保证生产流程顺畅的同时,也消耗了大量的能源。 一、工业水泵系统的能耗现状 …...

第四篇:k8s 理解Service工作原理
什么是service? Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。 简单来说K8s提供了service对象来访问pod。我们在《k8s网络模型与集群通信》中也说过k8s集群中的每一个Pod(最小调度单位)都有自己的IP地址,都…...
P3131 [USACO16JAN] Subsequences Summing to Sevens S
题目描述 Farmer Johns NN cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a photo of a contiguous group of cows but, due to a…...

大数据技术Kafka详解 ② | Kafka基础与架构介绍
目录 1、kafka的基本介绍 2、kafka的好处 3、分布式发布与订阅系统 4、kafka的主要应用场景 4.1、指标分析 4.2、日志聚合解决方法 4.3、流式处理 5、kafka架构 6、kafka主要组件 6.1、producer(生产者) 6.2、topic(主题) 6.3、partition(分区) 6.4、consumer(消费…...

【CKA】Kubernetes(k8s)认证之CKA考题讲解
CKA考题讲解 0.考试101 0.1 kubectl命令⾃动补全 在 bash 中设置当前 shell 的⾃动补全,要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc还可以在补全时为 kubectl 使⽤⼀个速记别名: al…...

android WebRtc 无法推流以及拉流有视频无声音问题
最近在开发使用WebRtc进行视频通话和语音通话,我使用的设备是MTK的手机,期间后台的技术人员几乎没法提供任何帮助,只有接口和测试的web端,有遇到不能推流。推流成功网页端有画面有声音,但是安卓端有画面,没…...

【5G】Spectrum 频谱
频谱是移动运营商的关键资产,可用的频谱是定义移动网络容量和覆盖范围的重要因素。本章讨论了5G的不同频谱选项、它们的特性以及5G早期部署阶段的预期频谱。5G是首个旨在利用大约400 MHz到90 GHz之间所有频段的移动无线系统。5G还设计用于在许可、共享和非许可频谱带…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...