【传输层】网络基础 -- UDP协议 | TCP协议
- 再谈端口号
- 端口号范围划分
- netstat
- pidof
- UDP
- UDP的特点
- 面向数据报
- UDP的缓冲区
- 基于UDP的应用层协议
- TCP
- 认识TCP协议的报头
- 理解封装解包
- 理解可靠性
- TCP工作模式
- 16位窗口大小
- 6位标志位
- URG
- ACK
- PSH
- RST
- SYN
- FIN
再谈端口号
端口号(Port)标识了一个主机上进行通信的不同的应用程序
在TCP/IP协议中,用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n
查看)
端口号范围划分
- 0 - 1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的
- 1024 - 65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围分配的
有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:
- ssh服务器,使用22端口
- ftp服务器,使用21端口
- telnet服务器,使用23端口
- http服务器,使用80端口
- https服务器,使用443端口
执行下面的命令, 可以看到知名端口号
cat /etc/services
我们自己写一个程序使用端口号时, 要避开这些知名端口号
一个进程是否可以bind多个端口号? 一个端口号是否可以被多个进程bind?
进程与端口号的关系就是父与子的关系,父亲可以有多个儿子,而每个儿子只有一个父亲。进程可以bind多个端口号,一个端口号只能被一个进程bind。
netstat
netstat是一个用来查看网络状态的重要工具
语法:
netstat +[选项]
功能:查看网络状态
常用选项:
- n 拒绝显示别名,能显示数字的全部转化成数字
- l 仅列出有在 Listen (监听) 的服務状态
- p 显示建立相关链接的程序名
- t (tcp)仅显示tcp相关选项
- u (udp)仅显示udp相关选项
- a (all)显示所有选项,默认不显示LISTEN相关
pidof
在查看服务器的进程id时非常方便
语法:
pidof +[进程名]
功能:通过进程名, 查看进程id
UDP
- 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;
- 如果校验和出错,就会直接丢弃
UDP的特点
UDP传输的过程类似于寄包裹,你只能一个一个寄,而不能寄1.5个。
- 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;
- 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
- 面向数据报:不能够灵活的控制读写数据的次数和数量;
面向数据报
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
用UDP传输100个字节的数据:
如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom,接收100个字节;而不能循环调用10次recvfrom,每次接收10个字节;
UDP的缓冲区
- UDP没有真正意义上的 发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
- UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃;
UDP的socket既能读,也能写,这个概念叫做 全双工
我们用的网络lO接口,其实并不直接是发送和接受接口,而是拷贝接口!
协议就是结构化数据
UDP使用注意事项:
- 我们注意到,UDP协议首部中有一个16位的最大长度,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
- 然而64K在当今的互联网环境下,是一个非常小的数字。
- 如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装;
基于UDP的应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
当然,也包括你自己写UDP程序时自定义的应用层协议;
TCP
TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制;
认识TCP协议的报头
- 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
- 32位序号/32位确认号:下面工作模式会有说明。
- 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60
- 6位标志位:(下面会详细说明)
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段 - 16位窗口大小:下面会有
- 16位校验和:发送端填充,CRC校验,接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。
- 16位紧急指针:标识哪部分数据是紧急数据;
- 40字节头部选项:暂时忽略;
-
tcp协议是有标准长度的:20,先读取20字节
-
转换成为一个结构化的数据,立马提取标准报头中的4位首部长度
-
就能得到后续报头的剩余大小,x * 4 - 20 = 0; x * 4 - 20 = n;
tcp报头的总长度,0000-1111,[0,15]
tcp报文的总长度 = 4位首部长度 * 4字节
tcp报头的总长度,0000-1111,[0,15],[0,60],[20,60]
如果我们报头就是20字节,那么4位首部长度,应该填写多少呢?
x * 4字节 = 20 、x = 5 (0101) -
只要把tcp报头处理读取完毕,剩下的就是有效载荷
理解封装解包
我们收到一个报文,是如何找到曾经bind特定port的进程的?网络协议栈和文件是什么关系?
系统有很多的场景需要我们快速定位一个进程,bind就是将端口号及映射关系插入哈希表中。
理解可靠性
为什么网络传输的时候,会存在不可靠问题?
因为距离变长了,导致出现可靠性问题。
不可靠问题常见都有哪些不可靠的场景?
丢包,乱序,校验错误,重复…
如果距离长了,存不存在绝对的可靠性?
比如:小明小红相隔1千米,小明问小红吃饭了吗?这条消息,小明并不能确定小红是否收到。小红回小明:她吃了。这时候小明才能确定她收到了这条消息。
- 我们认为,只有收到了应答,历史消息我才能100%确认对方收到,确认应答了,才算可靠
- 双方通信,一定存在最新的数据,没有应答!—最新消息一般无法保证可靠性!
不存在绝对的可靠性,存在相对的可靠性,一个报文只要收到了应答就能保证该报文的可靠性 – 建立在确认应答上
TCP工作模式
双方两个朝向的可靠性,双方在进行通信的时候,可能除正常的数据段,通信时也会涵盖确认数据段
tcp双方的地位是对等的,只需要搞定一个朝向的通信过程
数据到达对面的顺序一定是和发送的顺序一样的吗?不一定
注定了应答报文,对应的报头中必定涵盖了确认序号,确认应答和确认序号:接收方已经收到了ACK序号之前的所有(真的所有,且连续)的报文。
为什么我们要有两组序号?
是因为我们tcp通信是全双工的,收发分别对应序号与确认序号:
16位窗口大小
因为我们所构建的所有TCP报文都是要给对方发送的,对客户端与服务端一样适用。很明显如果我们知道了对方的缓冲区大小,我们也不需要发送过去了。互相交换接受能力。
6位标志位
tcp报文也是有类型的,服务器会收到各种各样的tcp报文,接收方要根据不同的tcp报文,要有不同的动作。tcp正常的数据段,有的就是ack…
URG
URG(紧急)标志位
URG(Urgent)标志位用于指示 TCP 数据包中是否包含紧急数据。它被设置为1时,表示该数据包中的某些数据被标记为紧急数据。紧急数据指示了一种需要尽快处理的情况,通常是一些优先级较高的数据。
当 URG 标志位被设置为1时,还需要使用16位的紧急指针字段(Urgent Pointer)来指示紧急数据在数据流中的位置。紧急指针指示了紧急数据的字节偏移量,从而使接收方能够识别和处理这些紧急数据。
这些紧急数据可以称为带外数据
在 TCP 中,带外数据通过使用紧急指针(Urgent Pointer)和 URG(紧急)标志位来标识和处理。当发送端发送带外数据时,它会设置 URG 标志位,并指定紧急指针的位置,以通知接收端有紧急数据需要处理。接收端在收到带有 URG 标志位的数据时,会根据紧急指针指示的位置来处理这些带外数据。
带外数据的使用可以根据具体的应用协议和实现进行定义。一些常见的应用包括:
- Telnet 协议:Telnet 协议中使用带外数据来发送终止命令或中断信号,以立即中断当前的操作。
- FTP 协议:FTP 协议中使用带外数据来传输一些控制信息,例如中断传输或终止文件传输的命令。
- 窗口大小调整:在 TCP 连接中,带外数据可以用于通知对方调整发送或接收窗口的大小,以便更有效地利用网络带宽。
URG 标志位主要用于紧急数据的通信和处理。当 TCP 连接的一方发送紧急数据时,它可以使用 URG 标志位来通知接收方,以便接收方能够及时处理这些数据。在实际应用中,紧急数据的处理方式和含义可以根据具体的应用协议和实现进行定义。
需要注意的是,URG 标志位的具体使用和处理是由应用层协议和操作系统决定的。因此,不同的应用程序和操作系统可能有不同的处理方式和行为。
ACK
ACK(确认)标志位
ACK(Acknowledgment)标志位用于指示 TCP 数据包中的确认号(Acknowledgment Number)字段是否有效。它被设置为1时,表示 TCP 数据包中的确认号字段包含有效的确认信息。
在 TCP 连接中,数据的传输是通过发送方将数据分割为多个 TCP 数据包并发送,接收方接收到这些数据包后会发送确认信息给发送方。确认信息中包含了接收方期望收到的下一个字节的序号,即确认号。通过设置 ACK 标志位为1,发送方可以知道接收方已经成功接收到了之前发送的数据。
TCP将每个字节的数据都进行了编号:即为序列号,每一个ACK
都带有对应的确认序列号, 意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发
我们把TCP里的发送缓冲区当做数组,只要将数据从应用层拷贝到了发送缓冲区,每个字节就天然有了序列号。
ACK 标志位在 TCP 的三次握手过程中也起到了重要的作用。在建立 TCP 连接时,客户端和服务器之间会互相发送带有 SYN(同步)和 ACK 标志位的数据包,用于确认连接的建立和同步序号的交换。
需要注意的是,ACK 标志位的具体使用和处理是由 TCP 协议和操作系统决定的。在 TCP 连接中,发送方和接收方会根据 ACK 标志位的设置来确认数据的传输情况,并进行相应的处理。
PSH
PSH(Push)标志位
PSH(Push)标志位用于指示 TCP 数据包中的数据应该被立即推送给应用层,而不是等待缓冲区填满或等待计时器超时。当 PSH 标志位被设置为1时,发送方通知接收方应该立即将接收到的数据提交给上层应用进行处理。
通常情况下,TCP 数据报在发送方的缓冲区中进行累积,直到缓冲区填满或者等待一定的时间才会发送出去。这种方式可以提高网络传输的效率,因为可以将多个数据报一起发送。但在某些情况下,需要立即将数据推送给接收方的应用层。
例如,在实时通信或交互式应用中,延迟会对用户体验产生不利影响。通过设置 PSH 标志位为1,发送方可以指示接收方在接收到该数据报后立即将数据提交给应用层处理,从而减少传输延迟。
需要注意的是,PSH 标志位的具体使用和处理是由应用层协议和操作系统决定的。应用程序和操作系统可以根据自身需求来决定何时设置 PSH 标志位,以满足特定的数据传输要求。
RST
RST(复位)标志位
RST(Reset)标志位用于指示 TCP 数据包中的复位请求。当 RST 标志位被设置为1时,它表示发送方或接收方希望立即中断当前的 TCP 连接,并进行连接的复位操作。
RST 标志位通常用于表示发生了严重的错误或异常情况,导致当前的连接无法继续进行。当一方发送带有 RST 标志位的 TCP 数据包时,它相当于向对方发送了一个连接复位请求,要求对方放弃当前的连接并重新建立新的连接。
RST 标志位的使用场景包括:
- 非法连接或攻击:当网络设备或应用程序检测到非法连接或攻击时,可以发送带有 RST 标志位的数据包,以中断与攻击者的连接并保护系统的安全。
- 异常情况处理:当发生一些严重的异常情况,如网络故障、连接超时或协议错误等,可以使用 RST 标志位来中断当前的连接并重新建立新的连接。
- 拒绝服务防护:在面对拒绝服务(DoS)攻击或过载情况下,网络设备或服务可以使用 RST 标志位来拒绝新的连接请求,并释放已建立的连接资源。
需要注意的是,RST 标志位的具体使用和处理是由 TCP 协议和操作系统决定的。在收到带有 RST 标志位的数据包时,接收方会根据协议规定的处理方式来中断连接并进行相应的处理。
SYN
SYN(同步)标志位
SYN(Synchronize)标志位用于在建立 TCP 连接时进行同步和协商。在 TCP 的三次握手过程中,SYN 标志位扮演了重要的角色。
当发送方希望建立一个新的 TCP 连接时,它会发送一个带有 SYN 标志位的数据包给接收方。这个数据包中包含一个初始序列号(Initial Sequence Number),用于标识数据流的起始位置。通过设置 SYN 标志位为1,发送方告诉接收方它希望建立一个新的连接,并将初始序列号设置为指定的值。
接收方收到带有 SYN 标志位的数据包后,会发送一个带有 SYN 和 ACK(确认)标志位的数据包作为回应。这个数据包中包含确认号(Acknowledgment Number)字段,表明接收方期望收到的下一个字节的序号,并且也包含一个自己选择的初始序列号。
最后,发送方收到接收方的 SYN+ACK 数据包后,会发送一个带有 ACK 标志位的数据包作为确认。这个数据包中的确认号字段表示发送方期望接收到的下一个字节的序号。
通过这个三次握手的过程,发送方和接收方可以建立起双向的、可靠的 TCP 连接,并同步序列号和确认号,以确保数据的可靠传输。
需要注意的是,SYN 标志位的具体使用和处理是由 TCP 协议和操作系统决定的。在 TCP 连接的建立过程中,发送方和接收方会根据 SYN 标志位的设置和响应来完成连接的建立和同步操作。
FIN
FIN(结束)标志位
FIN(Finish)标志位用于表示发送方已经完成发送数据,并且要求关闭连接。当一个 TCP 连接的一方发送带有 FIN 标志位的数据包时,它表示它已经没有更多的数据要发送,并且希望关闭连接。
FIN 标志位的使用场景包括:
- 正常关闭连接:当发送方发送完所有的数据后,它会发送一个带有 FIN 标志位的数据包,告知接收方已经没有更多数据需要发送,并请求关闭连接。
- 异常关闭连接:在某些情况下,连接的一方可能会遇到异常情况,如应用程序崩溃、网络故障或连接超时等。在这种情况下,该方会发送带有 FIN 标志位的数据包,以请求关闭连接,并指示对方不要再发送数据。
当一方收到带有 FIN 标志位的数据包时,它会发送一个带有 ACK(确认)标志位的数据包作为确认,表示已经收到关闭请求。然后,它也可以选择发送带有 FIN 标志位的数据包,表示它也已经完成发送数据,并请求关闭连接。
通过这种方式,双方可以逐步关闭连接,确保双向的数据都已经发送完毕,并最终关闭连接。
需要注意的是,FIN 标志位的具体使用和处理是由 TCP 协议和操作系统决定的。在 TCP 连接关闭过程中,发送方和接收方会根据 FIN 标志位的设置和响应来完成连接的逐步关闭。
如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀
相关文章:

【传输层】网络基础 -- UDP协议 | TCP协议
再谈端口号端口号范围划分netstatpidof UDPUDP的特点面向数据报UDP的缓冲区 基于UDP的应用层协议 TCP认识TCP协议的报头理解封装解包理解可靠性TCP工作模式16位窗口大小6位标志位URGACKPSHRSTSYNFIN 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/I…...

Android开发之性能测试工具Profiler
前言 性能优化问题,在我们开发时都会遇到,但是在小厂和对自己要求不严格的情况下,我都很少去做性能优化; 在性能优化上,基本大家都是通过自己的开发经验和性能分析工具来发现问题,今天给大家分享一下小编最…...

SpringBoot初级开发--多环境配置的集成(9)
在Springboot的开发中,我们经常要切换各种各样的环境配置,比如现在是开发环境,然后又切换到生产环境,这个时候用多环境配置就是一个明智的选择。接下来我们沿用上一章的工程来配置多环境配置工程。 1.准备多环境配置文件 这里我…...

(数学) 剑指 Offer 39. 数组中出现次数超过一半的数字 ——【Leetcode每日一题】
❓ 剑指 Offer 39. 数组中出现次数超过一半的数字 难度:简单 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输…...

如何用PS把roughness贴图转换成Smoothness,并放入Metallic贴图的a通道。
1:用PS打开Roughness贴图 2:选择反相,装换成Smoothness贴图 3:新建一个大小相等的psd文件,或者打开Metallic贴图 4:如果没有金属度贴图,就把新建的图画成纯黑色 5:选择图层蒙版->…...
了解XSS攻击与CSRF攻击
什么是XSS攻击 XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的网络安全漏洞,它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在 web 应用程序中,攻击者通过注入恶意脚本来利用用户对网站的信任&…...

安全测试-django防御安全策略
django安全性 django针对安全方面有一些处理,学习如何进行处理设置,也有利于学习安全测试知识。 CSRF 跨站点请求伪造(Cross-Site Request Forgery,CSRF)是一种网络攻击方式,攻击者欺骗用户在自己访问的网…...

7.react useReducer使用与常见问题
useReducer函数 1. useState的替代方案.接收一个(state, action)>newState的reducer, 并返回当前的state以及与其配套的dispatch方法2. 在某些场景下,useReducer会比useState更加适用,例如state逻辑较为复杂, 且**包含多个子值**,或者下一个state依赖于之前的state等清楚us…...
c#泛型(generic)
概述: C#中的泛型(Generics)是一种允许在编写类、方法和委托时使用参数化类型的机制。泛型允许我们编写更通用、可重用的代码,可以避免类型转换和重复编写类似的代码。 泛型的基本语法如下所示: class ClassName<…...

【力扣每日一题】2023.8.30 到家的最少跳跃次数
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一只跳蚤,我们可以操控它前跳 a 格或是后跳 b 格,不能跳到小于0的位置,有一些被禁止的点不…...

精读《算法题 - 地下城游戏》
今天我们看一道 leetcode hard 难度题目:地下城游戏。 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士…...
随记-Kibana Dev Tools,ES 增删改查 索引,Document
索引 创建索引 创建索引 PUT index_test创建索引 并 修改分片信息 # 创建索引 并 修改分片信息 PUT index_test2 { # 必须换行, PUT XXX 必须独占一行,类似的 其他请求也需要独占一行 "settings": {"number_of_shards": 1, # 主分片"…...

什么是架构,架构的本质是什么
不论是开发人员还是架构师,我们都一直在跟软件系统打交道,架构是在工作中出现最频繁的术语之一。那么,到底什么是架构?你可能有自己的答案,也有可能没有答案。对“架构”的理解需要我们不断在实践中思考、归纳、演绎&a…...

Python爬虫(十七)_糗事百科案例
糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取获取每个帖子里的用户头像连接、用户姓名、段子内容、点赞次数和评论次数保存到json文件内…...

Ae 效果:CC Threads
生成/CC Threads Generate/CC Threads CC Threads(CC 编织条)效果基于当前图层像素生成编织条图案和纹理。可以用在各种设计中,如背景设计、图形设计、文字设计等。 ◆ ◆ ◆ 效果属性说明 Width 宽度 设置编织的宽度。 默认值为 50。值越大…...
Kotlin 协程 - 多路复用 select()
一、概念 又叫选择表达式,是一个挂起函数,可以同时等待多个挂起结果,只取用最快恢复的那个值(即多种方式获取数据,哪个更快返回结果就用哪个)。 同时到达 select() 会优先选择先写子表达式,想随…...

学习笔记-ThreadLocal
ThreadLocal 什么是ThreadLocal? ThreadLocal 是线程本地变量类,在多线程并行执行过程中,将变量存储在ThreadLocal中,每个线程中都有独立的变量,因此不会出现线程安全问题。 应用举例 解决线程安全问题:例…...

python利用pandas统计分析—groupby()函数的使用
文章目录 一、groupby使用场景二、groupby基本原理三、groupby分组运算基础聚合操作:只能选择一种聚合操作agg 聚合操作:可以针对同列选择不同聚合方法transformapply 四、groupby分组后去重统计nunique()五、groupby分组后重命名列名rename()直接重新命…...

OPENCV实现ORB特征检测
# -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/8/31 """ import cv2 import numpy as np# 读图像 img = cv2.imread(F:\\learnOpenCV\\openCVLearning\\pictures\\chess.jpg)...

W5100S-EVB-PICO主动PING主机IP检测连通性(十)
前言 上一章节我们用我们开发板在UDP组播模式下进行数据回环测试,本章我们用开发板去主动ping主机IP地址来检测与该主机之间网络的连通性。 什么是PING? PING是一种命令, 是用来探测主机到主机之间是否可通信,如果不能ping到某台…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...