TLS协议深度解析:挖掘现代网络安全防御的底层技术

正常简单的通讯

1、服务器生成一对密钥,公钥A、私钥A
2、浏览器请求服务器时,服务器把公钥A传给浏览器
3、浏览器随机生成一个对称加密的密码S,用公钥A加密后传给服务器
4、服务器接收后,用私钥A解密,得到密钥S
5、浏览器和服务器都知道密钥S,就可以使用密钥S加密数据然后传输
这样看起来可以通讯,但是是有漏洞的。

中间人攻击

1、服务器生成一对密钥,公钥A、私钥A。
2、浏览器请求服务器时,服务器准备把公钥A传给浏览器;此时中间人X,生成也生成一对密钥,公钥B、私钥B,X劫持到公钥A后替换成自己的公钥B,发给浏览器。
3、浏览器无法分辨公钥B是否是服务器的,生成一个对称加密密钥S,公钥B加密后准备传给服务器,其实传给了中间人X。
4、中间人收到后,使用私钥B解密拿到密钥S,然后再使用公钥A加密传给服务器
5、服务器收到后使用私钥A解密也拿到密钥S。
6、浏览器和服务器使用密钥S加密后传输数据,此时中间人X也是持有密钥S,劫持到数据包后使用密钥S就能解密。
这种情况,服务器和客户端都不会发现异常,因为客户端无法确认收到的公钥是不是服务器的。因为公钥是明文形式传播的。如何证明公钥是服务器的,就出现CA机构?

CA机构

CA机构相当于现实中的“派出所”,数字证书就相当于“身份证”。

数字证书

网站在使用HTTPS之前,需要向CA机构申领一份数字证书,数字证书包含服务器的信息(包含版本号、序列号、签名算法、颁发者、网站服务器公钥(RSA签名公钥)等信息

数字签名

**证书会被修改吗?**证书中会包含一段私钥加密的签名,是将证书的内容进行HASH得出。如果证书被篡改,签名会对不上。这个签名就是数字签名,用来防伪的技术。
image.png

证书生成

a、CA机构有非对称加密的私钥和公钥,(私钥保存在CA服务器上,公钥(其实是CA机构证书链上的根证书的公钥)预装在各个操作系统、电脑上、Android等)
b、CA机构对证书数据X进行HASH(证书数据包括版本号、序列号、HASH签名算法、颁发者、服务器的公钥等)
c、用CA的私钥对HASH值H进行加密,得到数字签名S,并添加到证书上就是数字证书。

证书验证

a、浏览器拿到证书后,通过证书链验证颁发者是否可信,然后得到数据T,以及签名S
b、用预装的CA机构证书链上的根证书的公钥对S进行解密,得到H
c、使用证书里的HASH签名算法,对数据T进行HASH得到H1,此时H1应该等于H,说明未被篡改

质疑思考

a、**证书会被掉包吗?**证书里包含了网站的信息(包括域名等),证书如果被替换,浏览器能知道访问的网站和证书是否一致
b、**为什么数字签名要HASH一次?**证书信息一般比较长(**为什么不能只用非对称加密?**非对称加密算法可以加密的数据长度有上限,否则会报错或者需要分割加密效率极低),使用HASH算法得到证书信息的摘要,将数据变短能提高加密和传输的效率,也能更安全
c、怎么确保CA的公钥时可信的?各个操作系统、电脑上、Android设备上会预装一些CA机构的根证书,根证书中包含公钥,验证的时候通过证书链,以根证书为起点,层层信任。
d、**TLS每次都会传递密钥吗?**服务器会给每个客户端维护一个Session ID,将密钥存到对应的Session ID下,客户端请求的是时候携带Session ID(表示恢复之前的会话,如果Session ID为空时,表示不用恢复客户端和服务器重新协商密钥),服务器就会使用对应的密钥进行加密,不需要重新协商密钥。

TLS协议

TLS协议的作用
1、认证用户和服务器,确保数据发送到正确的客户机和服务器;
2、加密数据以防止数据中途被窃取;
3、维护数据的完整性,确保数据在传输过程中不被改变。

分为两层:记录层和握手层
上层-握手层包含4个协议
**握手协议 **进行身份认证、协商共享密钥
**更改密码规范协议 **根据握手协议协商的结果,切换加密密码套件
**应用数据协议 **通信双发进行数据传输的协议
**警告协议 **当以上过程发生错误时通知对方
下层-记录层
记录层协议
**添加消息头 **给数据添加消息头后封装交给TCP层
**分片重组 **发送方将数据分割成小的数据块,接收方可以将小数据块重组
**数据压缩解压缩 **对数据进行压缩和解压缩
**加密解密 **对数据进行加解密和解密

完整的握手过程

第一次握手:客户端发送

Client Hello 客户端Hello包
**Version **客户端支持的最高版本号
**Random **客户端随机数,每次握手都会重新生成(可以防止重放攻击),用于后续生成密钥
**Session ID **会话ID用于恢复会话,第一次是空表示不恢复会话,在后续的连接中,服务器可以借
助会话ID在自己的缓存中找到对应的会状态,这样只需1RTT既可以完成握手,完整
的握手协议2RTT(2次网络往返)才能完成握手
**Cipher Suites **客户端支持的所有密码套件,按优先级排列
**Compression Methods **压缩方法
**Extension **扩展数据
image.png

16进制数据分析
# 16 03 03 00 be 01 00 00 ba 03 03 64 c4 d9 0a 37 40 a3 af d6 27 66 d1 bb 29 d0 53 c8 e0 dc 14 16 06 cf d1 1a 40 eb c0 d3 67 48 57 00 00 26 c0 2c c0 2b c0 30 c0 2f c0 24 c0 23 c0 28 c0 27 c0 0a c0 09 c0 14 c0 13 00 9d 00 9c 00 3d 00 3c 00 35 00 2f 00 0a 01 00 00 6b 00 00 00 0f 00 0d 00 00 0a 68 61 6f 2e 71 71 2e 63 6f 6d 00 05 00 05 01 00 00 00 00 00 0a 00 08 00 06 00 1d 00 17 00 18 00 0b 00 02 01 00 00 0d 00 1a 00 18 08 04 08 05 08 06 04 01 05 01 02 01 04 03 05 03 02 03 02 02 06 01 06 03 00 23 00 00 00 10 00 0e 00 0c 02 68 32 08 68 74 74 70 2f 31 2e 31 00 17 00 00 ff 01 00 01 00 16 03 03 00 be
Record Header 		记录头	
16 			握手类型 0x16
03 03 		协议版本为3.3(也称为TLS 1.2)
00 be 		接下来是190字节的握手消息01 00 00 ba
Handshake Header	握手头
01 			握手消息类型(客户端hello)
00 00 ba  	接下来是186字节的客户端hello数据03 03 
Client Version 		客户端协议版本为3.3,也称为TLS 1.264 c4 d9 0a 37 40 a3 af d6 27 66 d1 bb 29 d0 53 c8 e0 dc 14 16 06 cf d1 1a 40 eb c0 d3 67 48 57
Client Random 		32位客户端随机数00
Session ID 			会话ID,长度为0表示没有会话ID00 26 c0 2c c0 2b c0 30 c0 2f c0 24 c0 23 c0 28 c0 27 c0 0a c0 09 c0 14 c0 13 00 9d 00 9c 00 3d 00 3c 00 35 00 2f 00 0a 
Cipher Suites 		密码套件
00 26 			38字节的密码套件数据
c0 2c			Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (0xc024)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (0xc023)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003d)Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)01 00
Compression Methods 	压缩方法
01 			1字节的压缩方法如下
00 			0表示没有压缩00 6b
Extensions Length		扩展数据长度为107字节00 00 00 0f 00 0d 00 00 0a 68 61 6f 2e 71 71 2e 63 6f 6d 00 05 00 05 01 00 00 00 00 00 0a 00 08 00 06 00 1d 00 17 00 18 00 0b 00 02 01 00 00 0d 00 1a 00 18 08 04 08 05 08 06 04 01 05 01 02 01 04 03 05 03 02 03 02 02 06 01 06 03 00 23 00 00 00 10 00 0e 00 0c 02 68 32 08 68 74 74 70 2f 31 2e 31 00 17 00 00 ff 01 00 01 00 
Extension 				扩展数据

第二次握手:服务器发送

Server Hello 服务器Hello包
**Version **服务器端的版本号
Random 服务器端的随机数,用于生成密钥
Cipher Suite 服务器从浏览器密码套件中选择一个回复
**Compression Methods **压缩方法
**Extension **扩展数据
image.png
注意:
密码套件结构:密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法
_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 _
ECDHE 密钥交换算法(短暂-椭圆曲线-迪菲-赫尔曼)
RSA 签名算法,证书里的公钥用的是RSA算法,用于身份验证
AES_128_GCM 对称加密,数据加密,分组模式是 GCM
SHA256 数据摘要算法,用于证书的签名和验签
TLS_RSA_WITH_AES_128_GCM_SHA256 表示密钥交换算法和签名算法都是RSA

16 03 03 00 54 
Record Header 		记录头	
16 			握手类型 0x16
03 03 		协议版本为3.3(也称为TLS 1.2)
00 54 		接下来是84字节的握手消息02 00 00 50
Handshake Header	握手头
01 			握手消息类型(服务器hello)
00 00 50  	接下来是80字节的服务器hello数据03 03
Server Version 		服务器协议版本为3.3,也称为TLS 1.254 49 db a3 2d d9 b1 6e d3 0d 05 4a c8 56 a1 1d 94 9b 2a f3 3c 75 e4 a9 a9 da e2 50 22 c8 7d 04 
Server Random 		服务器随机数00
Session ID  		会话IDc0 2f 
Cipher Suite		加密套件
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)00
Compression Method	压缩方法00表示不压缩00 28
Extensions Length 	接下来扩展数据长度为40字节ff 01 00 01 00 00 00 00 00 00 0b 00 04 03 00 01 02 00 23 00 00 00 10 00 0b 00 09 08 68 74 74 70 2f 31 2e 31 00 17 00 00
Extension  			

Certificate 服务器的证书信息
包含X.509证书链,主证书第一个,之后是中间证书、根证书
证书包含:版本号、序列号、签名算法、颁发者、网站服务器公钥(RSA签名公钥)
用CA的私钥加密的证书的摘要信息,即证书签名
image.png

16 03 03 0b a8
Record Header 
16 						握手类型 0x16
03 03 					协议版本为3.3(也称为TLS 1.2)
0b a8 					接下来是2984字节的握手消息0b 00 0b a4 
Handshake Header
0b 						握手消息类型(服务器certificate)
00 0b a4   				接下来是2980字节的服务器certificate数据00 0b a1 
Certificates Length 	证书链的长度为 2977字节00 06 8f 
Certificate Length 		第一个证书的长度为 1679字节30 82 06 8b 30 82 05 73 a0 ......
Certificate				证书内容00 05 0c
Certificate Length		第二个证书的长度为129230 82 06 8b 30 82 05 73 a0 ......
Certificate				证书内容

Server Key Exchange 密钥交换
**Curve Type **曲线类型
**Named Curve **曲线名称,选择x25519,即确定好椭圆曲线基点G
G确定好之后,服务器会生成一个随机数做为x25519的私钥Server PrivKey,保存在本地不公开,再根据G和Server PrivKey计算出椭圆曲线的公钥Server Pubkey(公钥/私钥都是临时的,只在本次会话中使用,图中的Pubkey)传送给客户端
为确保Pubkey不被中间人篡改,服务端会用RSA签名算法给Pubkey做个签名,RSA私钥保存再服务器,RSA公钥已经放在证书中传给客户端(签名算法是私钥签名,公钥验签)。
image.png

Server Hello Done 服务器所有握手信息都发送完毕
image.png

第三次握手:客户端发送

第三次握手之前,客户端会先验证服务器的证书
1、证书链是否可信
2、证书是否吊销
3、证书是否在有效期内
4、证书中的域名是否是当前要访问的域名

证书链的验证过程:

一般情况下,服务器向CA申请的证书不是根证书,而是中间证书签发的,所以客户端其实是拿到了一个证书链,百度的证书层次结构有三级:
image.png
1、客户端收到百度的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证百度证书是否可信。于是,客户端根据百度证书中的签发者,找到该证书的颁发机构是GlobalSign RSA OV SSL CA 2018,然后向 CA 请求该中间证书。
2、请求到证书后发现GlobalSign RSA OV SSL CA 2018证书是由GlobalSign签发的,由于GlobalSign它是根证书,也就是自签证书。应用软件会检查系统中有没有预装CA根证书,如果有则可以利用根证书中的公钥去验证 GlobalSign RSA OV SSL CA 2018 证书,如果发现验证通过,就认为该中间证书是可信的。
3、GlobalSign RSA OV SSL CA 2018 证书被信任后,可以使用 GlobalSign RSA OV SSL CA 2018证书中的公钥去验证baidu.com证书的可信性,如果验证通过,就可以信任baidu.com证书
其实客户端最开始只信任根证书GlobalSign的证书,然后GlobalSign信任GlobalSign RSA OV SSL CA 2018,最后GlobalSign RSA OV SSL CA 2018又信任baidu.com证书,最终客户端也信任baidu.com证书
4、baidu.com证书可信后,客户端会得到RSA的公钥,并对服务端的Pubkey进行签名验证
操作系统中保存的根证书
image.png
Client Key Exchange 客户端生成的椭圆曲线公钥发给服务器
证书验证通过后,客户端会根据服务器给的椭圆曲线算法生成一对自己的临时密钥Client PrivKey和 Client PubKey,并将Client PubKey用证书中的RSA公钥进行加密后发给服务器,就是图中的Pubkey
image.png
完成后客户端和服务端共享信息:Client Random、Server Random、椭圆曲线类型和名称、基点G、服务器椭圆曲线的公钥、客户端的椭圆曲线公钥。
此时客户端就可以计算会话密钥,会话密钥是基于对称加密的,会话密钥取决于主密钥,而组成主密钥的关键参数市预主密钥,密钥交换就是交换双方的预主密钥
1、客户端临时私钥、服务端临时公钥、以及椭圆曲线算法,计算出预主密钥(premaster secret),服务器也可以算出相同的预主密钥
pre_master_secret = ClientPrivKey * ServerPubKey
2、客户端随机数、服务端随机数、预主密钥,计算出主密钥(master secret)
PRF伪随机函数函数
master_secret = PRF(pre_master_secret, “master secret”, ClientHello.random + ServerHello.random)
3、客户端随机数、服务端随机数、主密钥 计算出最终的会话密钥,包含对称加密密钥,消息认证码密钥、初始化向量。
key_block = PRF(master_secret, “key expansion”, server_random + client_random)
因为 TLS 设计者不信任客户端或服务器「伪随机数」的可靠性,为了保证真正的完全随机,把三个不可靠的随机数混合起来,那么「随机」的程度就非常高了,足够让黑客计算出最终的会话密钥,安全性更高。
Change Cipher Spec 消息表示客户端已生成加密密钥,并切换到加密模式(密钥规格变更协议)
Encrypted Handshake Message 消息发送到服务器进行校验,这个对称加密密钥是否成功
image.png
客户端将之前所有的握手数据做一个HASH,再用最后协商好的对称加密算法对数据做加密。发送到服务器进行验证。

第四次握手:服务器发送

服务器在收到客户端Client Key Exchange消息后,这时可以拿到 Client Random、Server Random、客户端临时公钥Client PubKey,先计算出预主密钥(ClientPubKey * ServerPrivKey),再分别计算出主密钥和最终的会话密钥,这块可参考客户端计算密钥一样的。
New Session Ticket 服务器给客户端的Session ID,用于恢复会话
Change Cipher Spec 告诉客户端,服务端已生成密钥,请求客户端切换加密模式。
Encrypted Handshake Message 服务器对握手的所有数据用协商好的对称加密算法加密,供客户端校验。
image.png
此时整个握手完毕,已经建立一个安全的通信隧道,可以传输数据。

双方发送应用数据协议

image.png
整个握手过程完毕之后,我们会看到应用数据协议 “Application Data Protocol: http-over-tls”,之后我们的客户端/服务端建立一个安全通信隧道,就可以发送应用程序数据了。

在 RSA 握手中密钥交换:

1、客户端向服务器发送一条明文 “hello” 消息,其中包括他们要使用的协议版本、受支持的密码套件列表和称为“客户端随机数”的随机数据短字符串。
2、服务器使用其证书、首选密码套件和一个不同的随机数据短字符串(称为“服务器随机数”)响应(以明文格式)。
3、客户端验证证书,创建另一组随机数据46字节,称为“预主密钥(premaster secret)”。客户端从服务器的证书中获取公钥,加密预主密钥,并将其发送到服务器;只有拥有私钥的人员才能解密预主密钥。
4、该服务器解密“预主密钥”。注意,这是唯一一次使用私钥!
5、客户端和服务器都有客户端随机数、服务器随机数和预主密钥。根据这三个数计算得到主密钥,再通过主密钥计算得到会话密钥,会话密钥市对称的,会话期间的所有后续通信都用这些新会话密钥进行加密。

前向安全性问题:

RSA密钥交换的简单性也是它最大的弱点。用于加密预主密钥的服务器公钥,一般会保持多年不变。任何能够接触到对应私钥的人都可以恢复预主密钥,并构建相同的主密钥,从而危害到会话安全性。
对目标的攻击并不需要实时进行,强大的对手可以制定长期行动。攻击者会记录所有加密的流量,耐心等待有朝一日可以得到密钥。比如,计算机能力的进步使暴力破解成为可能;也可以通过法律强制力、政治高压、贿赂或强行进入使用该密钥的服务器来取得密钥。只要密钥泄露,就可以解密之前记录的所有流量了。
TLS中其他常见的密钥交换方式都不受这个问题的影响,被称为支持前向保密。使用那些密钥交换时,每个连接使用的主密钥相互独立。泄露的服务器密钥可以用于冒充服务器,但不能用于追溯解密任何流量。

为什么HTTPS的包可以被抓到?
首先抓包之前,fiddler会提示安装自己的根证书到操作系统(我们主动把它添加到了受信任的根证书颁发机构,所以我们计算机是认可这个证书的)
1、fiddler截获客户端发送的HTTPS,然后伪装成客户端向服务器发送请求
2、服务器返回数据,fiddler截获服务器的CA证书,用跟证书的公钥进行解密,验证服务器数字签名,获取服务器CA证书的公钥,然后fiddler伪造自己的CA证书,冒充服务器证书发给客户端,此时Fiddler就是中间人,可以截获客户端和服务器之间的数据。
3、Fiddler的根证书是能抓包的关键,这也是Fiddler伪造的CA证书能够获得客户端和服务器端信任的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中HashMap如何根据value的值去获取key是多少

在Java中&#xff0c;HashMap是一种基于键值对存储数据的数据结构。HashMap并没有直接提供根据value获取key的方法。但你可以通过遍历HashMap的entrySet&#xff0c;找到对应的value&#xff0c;然后获取其对应的key。 以下是一个示例代码&#xff1a; public <K, V> K…

【深度学习实战—6】:基于Pytorch的血细胞图像分类(通用型图像分类程序)

✨博客主页&#xff1a;米开朗琪罗~&#x1f388; ✨博主爱好&#xff1a;羽毛球&#x1f3f8; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深…

dji uav建图导航系列()move_base

文章目录 1、导航框架2、move_base功能包3、amcl功能包4、代价地图的配置4.1、通用配置文件4.2、全局规划配置文件4.3、局部规划配置文件5、局部规划器配置6、launch文件1、导航框架 导航的关键是机器人定位和路径规划两大部分 move_base:实现机器人导航中的最优路径规划 am…

datagrip 相关数据连接信息无缝迁移

背景 因为公司换电脑了&#xff0c;接触的项目比较多&#xff0c;不同项目&#xff0c;不同环境的数据库连接有好几十个&#xff0c;如果在新电脑上挨个重新连接一遍劳心劳力&#xff0c;所以想看一下能不能直接将之前保存的连接信息直接迁移到新的电脑上面。 为此&#xff0c…

Docker:01 OverView

Docker&#xff1a;01 OverView 基本介绍 Docker是一个用于开发、交付、运行应用程序的开放平台&#xff0c;可以使应用程序与基础架构分开&#xff0c;以便快速交付软件。 Docker在一个被叫做容器的隔离环境下&#xff0c;提供了打包和运行的能力。 容器非常轻量化&#x…

Android studio 调整jar包顺序

第一步&#xff1a;编译jar包&#xff0c;放入lib路径下&#xff1a;如&#xff1a; 第二步&#xff1a;app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步&#xff1a;project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…

第50节:cesium 绘制指定类型区域(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

1、Flutter移动端App实战教程【环境配置、模拟器配置】

一、概述 Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK&#xff0c;一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 二、渲染机制 之所以说Flutter能够达到可以媲美甚至超越原生的体验&#xff0c;主要在于其拥有高性…

Jetsonnano B01 笔记5:IIC通信

今日继续我的Jetsonnano学习之路&#xff0c;今日学习的是IIC通信&#xff0c;并尝试使用Jetson读取MPU6050陀螺仪数据。文章提供源码。文章主要是搬运的官方PDF说明&#xff0c;这里结合自己实际操作作笔记。 目录 IIC通信&#xff1a; IIC硬件连线&#xff1a; 安装IIC库文…

智能小车之蓝牙控制并测速小车、wife控制小车、4g控制小车、语音控制小车

目录 1. 蓝牙控制小车 2. 蓝牙控制并测速小车 3. wifi控制测速小车 4. 4g控制小车 5. 语音控制小车 1. 蓝牙控制小车 使用蓝牙模块&#xff0c;串口透传蓝牙模块&#xff0c;又叫做蓝牙串口模块 串口透传技术&#xff1a; 透传即透明传送&#xff0c;是指在数据的传输过…

掌握AI助手的魔法工具:解密`Prompt`(提示)在AIGC时代的应用(下篇)

前言&#xff1a;在前面的两篇文章中&#xff0c;我们深入探讨了AI助手中的魔法工具——Prompt&#xff08;提示&#xff09;的基本概念以及在AIGC&#xff08;Artificial Intelligence-Generated Content&#xff0c;人工智能生成内容&#xff09;时代的应用场景。在本篇中&am…

10.Xaml ListBox控件

1.运行界面 2.运行源码 a.Xaml 源码 <Grid Name="Grid1"><!--IsSelected="True" 表示选中--><ListBox x:Name="listBo

生成树协议 STP(spanning-tree protocol)

一、STP作用 1、消除环路&#xff1a;通过阻断冗余链路来消除网络中可能存在的环路。 2、链路备份&#xff1a;当活动路径发生故障时&#xff0c;激活备份链路&#xff0c;及时恢复网络连通性。 二、STP选举机制 1、目的&#xff1a;找到阻塞的端口 2、STP交换机的角色&am…

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…

Hadoop的HDFS的集群安装部署

注意&#xff1a;主机名不要有/_等特殊的字符&#xff0c;不然后面会出问题。有问题可以看看第5点&#xff08;问题&#xff09;。 1、下载 1.1、去官网&#xff0c;点下载 下载地址&#xff1a;https://hadoop.apache.org/ 1.2、选择下载的版本 1.2.1、最新版 1.2.2、其…

docker报错解决方法

ERROR: readlink /var/lib/docker/overlay2/l: invalid argument 注意&#xff1a;会清空已有安装 sudo service docker stop sudo rm -rf /var/lib/docker sudo service docker start

酷开系统游戏空间,开启大屏娱乐新玩法

在这个充满科技感和无限创意的时代&#xff0c;游戏已经成为我们生活的一部分。而随时着科技的不断发展&#xff0c;以及游戏爱好者的游戏需求在不断提高&#xff0c;促使游戏体验也向更加丰富多彩的方向发展。显然&#xff0c;酷开科技早已经认识到游戏发展的新蓝图&#xff0…

一百七十二、Flume——Flume采集Kafka数据写入HDFS中(亲测有效、附截图)

一、目的 作为日志采集工具Flume&#xff0c;它在项目中最常见的就是采集Kafka中的数据然后写入HDFS或者HBase中&#xff0c;这里就是用flume采集Kafka的数据导入HDFS中 二、各工具版本 &#xff08;一&#xff09;Kafka kafka_2.13-3.0.0.tgz &#xff08;二&#xff09;…

javaee springMVC model的使用

项目结构图 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

腾讯云CVM标准型S4服务器性能测评_CPU_网络收发包PPS详解

腾讯云服务器CVM标准型S4性能测评&#xff0c;包括S4云服务器CPU型号、处理器主频、网络收发包PPS、队列数、出入内网带宽能力性能参数说明&#xff0c;标准型 S4 实例是次新一代的标准型实例&#xff0c;CPU采用2.4GHz主频的Intel Xeon Skylake 6148处理器&#xff0c;腾讯云百…