OP-TEE使用过程记录

news2024/9/25 7:20:10

1 项目概述

1.1项目需求

为确保用户的数据的安全,ARM公司提出了trustzone技术,个人将trustzone理解为cortex的虚拟化技术。在不增加硬件的情况下,使用trustzone技术达到硬件加密的效果。

1.2重点概念简要介绍

1.2.1 TrustZone机制:

将一个物理处理器分时复用为两个逻辑处理器,一个是REE(rich execute enviorment)另一个是TEE(Trusted execute enviorment)。

1.2.2 OP-TEE:

(open source project Trusted Execution Environment),一款优秀的开源可信执行环境。

1.2.3其它优秀的TEE解决方案:

高通的Qsee, Trustonic的tee OS,opentee, 海思,Mstar, VIA,豆荚科技等。

1.2.4 GP:

TEE和REE通信的一个国际标准。(可以理解为一个库或者协议,不同厂家的TEE系统,他的接口均遵守GP标准)

1.3. 参考资料

官方给的参考文档
https://optee.readthedocs.io/en/latest/index.html
在这里插入图片描述

1.4开发的几个阶段

作为平台组维护成员需要掌握
1.需要具备基本的系统构建能力,包括在板卡上部署optee;在虚拟机内部署qemu模拟开发环境;
2.对optee框架的基本了解
3.对GP的掌握,尤其对TEE的应用开发能力
4.对基本密码学的熟悉
5.对加密框架的熟悉
作为控制机或者客户端项目开发人员需要掌握:
1.对GP 通用REE侧接口的掌握。
2.对TEE侧,公司内部提供其它接口的熟悉;
3.对openssl库的熟悉;
4.对加密算法的了解。

2 系统构建

如果对optee项目几个重要文件夹介绍:
optee-os:optee系统的内核源码和相关文档,编译后该目录会产生optee的镜像文件; optee-client:CA程序调用的用户空间的接口库(libteec)源码;守护进程tee_supplicant等;
optee-test:这是官方提供的测试程序xtext的源码,为optee中提供各种算法的逻辑并提供相应的测试程序;
optee-example:该目录官方用来存放TA和CA的示例代码。也可在该目录下编写自己的测试代码。

2.1 在板子上构建optee

网上有教程记录如何在imx6* 板子上去构建含 optee 的系统;
如下两篇文章有一定的代表性:
https://blog.csdn.net/u010071291/article/details/53860056
https://www.jianshu.com/p/5cdefb033e10

2.2 使用yocto构建optee

使用yocto构建含optee的嵌入式发行版;
《附件1:i.MX_Yocto项目用户手册.pdf》为个人翻译的i.MX官方的快速构建手册;
《附件2:local.conf 》local.conf为yocto3.02构建过程一个较为重要的配置文件;
《附件3:opencv_4.2.0.imx.bb》如果OpenCV部分构建出错,可参考附件3。

2.2.1 基于optee的linux发行版构建

在可正常制作出yocto的发行版的基础上,仅需改变其配置项目,即可完成对optee的构建;在i.MX_Yocto项目用户手册中有相关描述;注意:需要用imx官方提供的yocto版本,而不是yocto提供的;meta-imx/meta-bsp/conf/layer.conf 文件中,包含如下配置选项;
DISTRO_FEATURES_append = “ optee ”
按照yocto正常构建流程完成系统的构建,此时该系统刷到板子上即可支持optee;

2.2.2 使用yocto构建optee-example

optee在构建过程中其实并没有optee-example,该文件是我的demo的一个文件夹;这里仿照optee-test完成optee-example的移植;
首先,在如下网站去搜索想要的内容,该网站可提供大部分你想要的构建yocto的组件;
http://layers.openembedded.org/
详细的移植过程请参考:
《附件4:基于Yocto项目 在linux上构建optee-example.pdf》
optee-example_1.0.imx.bb为编写的配方文件
《附件5:optee-example_1.0.imx.bb》

2.3 在qemu中搭建optee的运行环境

建议需要在linux环境下构建qemu的开发环境,因为tee的程序在qemu上实现后,应用代码可直接移植到板子上使用。
常规的开发环境可参考
《附件6:OP-TEE在QEMU平台上运行环境的搭建及编译.pdf》;
但是由于网络等原因,大部分是构建不成功的;由于文件大小限制,且该部分不涉及保密所以上传到百度网盘。
链接:https://pan.baidu.com/s/1iNSuef4WQpfQReDocjGdiw
提取码:auto
Qemu下载部分强烈不建议自己repo,下载解压后其它请参考附件一;
解压缩后,你可能遇到如下问题;
下面是一些安装搭建时需要的工具和库;

$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf automake bc bison build-essential cscope curl device-tree-compiler expect flex ftp-upload gdisk iasl libattr1-dev libc6:i386 libcap-dev libfdt-dev libftdi-dev libglib2.0-dev libhidapi-dev libncurses5-dev libpixman-1-dev libssl-dev libstdc++6:i386 libtool libz1:i386 make mtools netcat python-crypto python-serial python-wand unzip uuid-dev xdg-utils xterm xz-utils zlib1g-dev

ImportError: No module named Crypto.PublicKey
sudo apt-get install python-pip (如果没有安装pip的话,需要这一操作)

pip install pycrypto

打个补丁:

--- a/util/memfd.c
+++ b/util/memfd.c
@@ -31,9 +31,7 @@

 #include "qemu/memfd.h"
 
-#ifdef CONFIG_MEMFD
-#include <sys/memfd.h>
-#elif defined CONFIG_LINUX
+#if defined CONFIG_LINUX && !defined CONFIG_MEMFD
 #include <sys/syscall.h>
 #include <asm/unistd.h>
————————————————
 --- a/configure
+++ b/configure
@@ -3923,7 +3923,7 @@ fi
 # check if memfd is supported
 memfd=no
 cat > $TMPC << EOF
-#include <sys/memfd.h>
+#include <sys/mman.h>
 
 int main(void)
 {
————————————————
 

其它参考附件6进行编译

3 TEE的使用

3.1 GP 介绍

GP(GlobalPlatform )
https://globalplatform.org/

GlobalPlatform(GP)是跨行业的国际标准组织,致力于开发、制定并发布安全芯片的技术标准;目前所有TEE系统(如豆荚科技、海思、高通等公司开发的TEE),内部实现的方式可能各有差别,但是完成的功能和接口函数均满足GP标准;
此处记录了TEE的两个标准文件,分别是关于REE侧API和TEE侧ApI;
附件7:TEE_Client_API_Specification-V1.0.pdf
附件8:GPD_TEE_Internal_Core_API_Specification_v1.2.1_CC.pdf

3.2 qemu的xtext

Qemu的xtext是op-tee的硬件自检程序,里面内置了很多使用例程,但遗憾的是该部分是收费的,且无太多详细资料外传。只能自己琢磨;
在这里插入图片描述

3.3 OP-TEE应用开发

3.3.1 Optee在qemu中的目录

基于QEMU平台的optee工程中各目录的作用介绍如下:
bios_qemu_tz_arm:
在qemu平台中运行tz arm的bios代码,启动最初阶段会被使用到,用来加载kernel, OP-TEE os image, rootfs并启动linux kernel和OP-TEE OS

build:
这个工程的编译目录,里面包含了各种makefile文件和相关配置文件

busybox:
busybox的源代码,用于制作rootfs的使用被使用到

gen_rootfs:
存放制作rootfs时使用的相关脚本和配置文件

hello_work:
一个示例代码,目录下包含了TA和CA部分的代码,在Linux shell端运行hello_world指令,就能调用CA接口,最终会穿到TEE中执行对应的TA部分的代码

linux:
linux内核代码,在driver/tee目录下存放的是tee对应的驱动程序

optee_client:包含了CA程序调用的userspace层面的接口库的源代码。其中tee_supplicant目录中的代码会被编译成一个Binary,该binary主要的作用是,当调用CA接口,需要加载TA image时,TEE OS通过该binary从文件系统中来获取TA image,并传递給TEE OS,然后再讲TA image运行到TEE OS中。

optee_os:存放OP-TEE OS的源代码和相关文档

optee_test:opentee的测试程序xtest的源代码,主要用来测试TEE中提供的各种算法逻辑和提供的其他功能

out:
编译完成之后输出目录(该目录编译完成之后才会生成)

qemu:
qemu源代码

soc_term:
在启动时与gnome-terminal命令一起启动终端,用于建立启动的两个terminal的端口监听,方便OP-TEE OS的log和linux kernel log分别输出到两个terminal中。

toolchains:
编译时需要使用的toolchain。

3.3.2 应用代码目录

1)为何要使用qemu
optee的应用程序不管是放到qemu下运行,还是放到yocto编译的系统中运行,均遵循GP协议,代码内容不变,仅需改变Host/makefile 少量编译内容。
2)应用代码目录
把optee的所有应用程序放到optee_examples文件夹下,这样仅需配置该目录下的makefile即可。
3)系统构建
系统是不提供optee_example的,因为他不是tee系统的核心组件;但是我们可以模仿optee_test,对optee_example进行系统构建;在各层的Makefile等文件中搜索optee_test,模仿配置optee_example;
4)optee_example的添加
demo例程可以全部放到optee_examples下,也可仅放项目中使用的程序,修改Host/makefile即可控制是否对optee_example下例程是否进行编译。

3.3.3 应用实现方案

整体设计方案
使用OP-TEE来实现特定的安全功能就需要开发者根据自己的实际需求开发特定的CA和TA程序;开发CA和TA的程序所需的接口函数由GP提供,详见附件7和8;
《附件7:TEE_Client_API_Specification-V1.0.pdf》
《附件8:GPD_TEE_Internal_Core_API_Specification_v1.2.1_CC.pdf》
借助OP-TEE来实现特定安全需求时,一次完整的功能调用一般都是起源于CA,TA做具体功能实现并返回数据到CA,而整个过程需要经过OP-TEE的client端接口,OP-TEE在Linux kernel端的驱动,Monitor模式下的SMC处理,OP-TEE OS的thread处理,OP-TEE中的TA程序运行,OP-TEE端底层库或者硬件资源支持等几个阶段。当TA执行完具体请求之后会按照原路径将得到的数据返回给CA。
在这里插入图片描述
整体设计方案-Libteec库的调用过程
这个是一个完整的CA应用程序调用的流程;先初始化context,然后打开session,传递变量,发送command ID(告诉TA,CA要调用那个TA函数),关闭session,释放资源;
详见GP 标准和optee_example代码 hello ;
在这里插入图片描述
整体设计方案-TEE侧的TA命令操作的实现
大概流程:entry_invoke_command函数根据填入的cmd参数,进入invokecommand处理流程;copy CA侧传入的内存;在session链表中找到对应的session,进入对应的TA函数中执行,根据cmd和传入内存或变量,执行对应函数;
在这里插入图片描述
如上述TA侧应用,根据传入cmd判断是进入哪个entry point;比如执行变量加 ,根据传入的参数 执行完变量加后传回CA侧;
整体设计方案-REE侧的守护进程 tee_suppliant
守护进程是开机启动的一个TEE进程,随时处理请求;
在这里插入图片描述
整体设计方案-REE侧的守护进程 tee_suppliant 在文件系统的启动
如下图所示,在系统启动时,在文件系统启动脚本S09_optee中启动该守护进程;S代表启动脚本启动的服务;9代表启动的优先级 从小到大最大为99(一般90以后为用户启动的脚本);
在这里插入图片描述

3.3.4 应用例程列举

在optee_example中已完成了对hello word 、变量的自增减、随机数产生、常见加密算法的单独实现、文件操作、秘钥的下发更换、可信通道熟悉等例程;下面对每个例程简要介绍:

  • hello
    主要用使用简单例子介绍可信应用和客户端应用的框架。

  • random
    optee下生成随机数,随机数后面是加密算法和产生密钥必备的。

  • basicAlg
    常见的算法在optee下的实现。针对 basicAlg下一章会对基本算法进行说明。
    RSA1024/RSA2048/HMAC/SHA1/SHA256/AES/PBKDF2/RAMDON等

  • secure_storage
    optee对文件的操作,创建、保存、截断、删除等操作。

  • save_key
    对前期设备更换密钥的一个例程。

  • onLinePay
    借鉴手机支付,建立可信通道,用来传输保密等级较高的数据。
    各例程在附录9中简要介绍了使用说明
    《附件9:optee-example在qemu中的运行.pdf》

4加密算法

在掌握了TEE与REE的基本通信后,就需要对基本的加密算法有基本的了解;

4.1一般使用流程简要总结:

编码目的:压缩空间,便于传输,减少带宽。
摘要目的:数据完整性,是否在传输过程中被修改。
加密目的:传输过程中既是被截取也无法查看原文,因为没有秘钥。
数字签名:是对摘要后的数据进行加密
数字证书:自己服务器公钥给权威机构(CA),权威机构对服务器的公钥和其他信息进行hash摘要再用权威机构的公钥进行加密后给客户服务器,客户把这个公钥给浏览器。
1、数据第一步编码(base64等)
2、第二步进行摘要(md5,sha256)
3、第三步对摘要后的数据进行加密(对称和非对称加密) 其实每一步都可以摘要:如数据本身摘要(md5)一次,然后编码(base64),然后对编码的数据在摘要(md5),然后对摘要的数据加密,然后对加密的后数据在摘要。

4.2 编码:Base64和URL编码

Base64 参考《基本密码学算法之:Base64.pdf》
Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据,由大小写字母、数字、+和/ 64个字符组成。将二进制文件3个字节作为一个处理单元,分为4个字节,每个字节6位,即3个字节可由4个可打印字符来表示。编码时肯定会出现数据不是3的倍数,Base64编码会采用0补全,最后末尾添加n个 “=”表示 补了几个字节的0。常见于URL中二进制图片的传递。

URL编码
由于url只能使用英文字母、数字和某些标点符号,不能使用其他文字和符号,比如中文。例如:春的UTF-8编码分别是E6 98 A5,每个字节前面加一个%因此,最后春 url编码得到"%E6%98%A5;当然如果浏览器采用其他编码形式结果又会不同。如:GB2312编码是B4 BA,最后得到%b4%ba

4.3摘要(哈希):

摘要的目的是为了校验信息的完整性,保证信息在传输过程中不被篡改。例如你在网络上需要下载一个非官方论坛软件,但又担心软件被第三方篡改,可以将该软件的md5值和官方下载的md5值进行对比,如果一致,则可放心使用。摘要算法有如下几个特点:   
输入相同时,输出一致;输入不同时,输出不同。通过输出,不能计算出输入 对输入的任何细微修改,都会导致完全不同的输出。   
由于以上特性,摘要也常被用来给密码加密,不过由于计算机运算能力的提升以及越来越丰富的破解手段,已不建议使用摘要算法来给密码加密。   
通过摘要信息不能还原原始信息,仅用来验证完整性。

4.4 对称加密和非对称加密

加密是为了保证数据安全传输,使得其他人不能获取的具体信息内容。例如你想给某人发送一封密信,或通过互联网给人发送密码,这些对隐秘性要求比较强的事情,就需要对信息进行加密。   
加密的专注点不在可用性上,这点和编码有明显的区别。加密是可逆的,明文 + 秘钥 = 加密信息   
加密又分为对称加密和非对称加密,区别在于在加密和解密信息时秘钥是不是同一个。    加密信息能通过密钥被还原为原始信息
1、对称加密:DES, AES 对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。 不足之处是,交易双方都使用同样钥匙,安全性得不到保证。 常见的对称加密有DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5 等。
2、非对称加密: RSA。 密钥是成对出现。使用一对“私钥-公钥”,用私钥加密的内容只有对应公钥才能解开 常见的非对称加密有 RSA、ESA、ECC 等。 
公钥:公开给所有人。不能通过公钥反推出私钥;public key 
私钥:自己留存,不公开。有且只有一个对应的私钥;secret key 
特点:通过私钥加密的密文只能通过公钥能解密,通过公钥加密的密文也只能通过私钥能解密。 但由于算法强度比对称加密复杂,加解密的速度比对称加解密的速度要慢。

4.5 数字签名和数字证书

数字签名
简单说就是对数据进行信息摘要后再用私钥加密而成。可用RSA的私钥进行签名,用RSA的公钥进行验签。
数字证书
用户为了确认服务器的公钥,服务器把自己的公钥给到证书机构(certificate authority,简称CA),CA将服务器的公钥和其他信息 使用Hash信息摘要以后再用CA自己的私钥加密生成 数字证书 发给服务器。服务器再把这个数字证书给到用户(浏览器)。CA的公钥怎么确认?一般比较著名的机构的公钥都在"受信任的根证书颁发机构"列表中,浏览器自动会在里面查询获得。

5 秘钥加密与可信通道

在项目中应用,如果采用base64编码,该方案最主要的还是用来降低通讯量,加密的等级也非常低;设备终端与服务器之间使用加密通信,就需要了解秘钥加密、秘钥分发、可信通道的建立等;

5.1秘钥加密

《附件10:密钥加密方案介绍.pdf》

5.2可信通道

《附件11:密钥在线下发.pdf》
《附件12:在线支付系统可信通道建立(OP-TEE侧实现demo).pdf》

5.3 典型通信与相应实现过程

如果感觉可信通道有点复杂,可参考常用的身份认证方案;
身份认证:HMAC
HMAC算法的典型应用:该应用提供了一次安全响应的过程。
HMAC算法的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:
(1)先由客户端向服务器发出一个验证请求。
(2)服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3)客户端将收到的随机数与自己的密钥进行HMAC-SHA1运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-SHA1运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

6 总结

整个过程需要对系统构建、OP-TEE系统框架、CA与TA应用代码、密码学算法、加密通道等做了描述。各部分内容均较多,在目前篇幅的情况下,本文插入了多个附录文档,但这仍只是做到了各个方向都粗略的叙述;
在具体的实践过程中,仍有很多需改进的地方。在项目实践过程中,实现了OP-TEE和项目应用代码的单独编译,项目应用代码通过网络通信完成和CA通信,来调用对应的TA完成登录密码的保存、加密、读取、验证等功能;
CA放在 :

root@imx6qsabresd:/# find -name optee_example_*  
./usr/bin/optee_example_random
./usr/bin/optee_example_hotp
./usr/bin/optee_example_secure_storage
./usr/bin/optee_example_aes
./usr/bin/optee_example_hello_world


TA放在:

root@imx6qsabresd:/# find -name *.ta           
./lib/optee_armtz/5dbac793-f574-4871-8ad3-04331ec17f24.ta
./lib/optee_armtz/5ce0c432-0ab0-40e5-a056-782ca0e6aba2.ta
./lib/optee_armtz/5b9e0e40-2636-11e1-ad9e-0002a5d5c51b.ta
./lib/optee_armtz/9aaaf200-2450-11e4-abe2-0002a5d5c51b.ta
./lib/optee_armtz/a4c04d50-f180-11e8-8eb2-f2801f1b9fd1.ta

可优化为项目应用代码直接调用编译过的libteec库,并在项目应用代码中完成CA代码的编写,与TA直接通信,这更具有实际意义。

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

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

相关文章

电子科技大学数据库与软件工程三

适用于网工和物联网专业 目录 一、实验目的 二、实验内容 三、实验软件 四、实验步骤及数据记录 1.子查询 2. 伪列 3.数据库对象 4. 块、存储过程和触发器 五、实验结论及思考题 实验结论&#xff1a; 思考题&#xff1a; 六、总结及心得体会 七、对本实验过程及方…

【华为OD机试模拟题】用 C++ 实现 - 关联子串(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明关联子串题目输入输出示例一输入输出说明示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华…

Spring的Bean的生命周期,Bean的装配和注入

Spring容器启动获得BeanDefinition对象中有一个scope 属性。该属性控制着bean对象的作用域。本章节介绍Bean的作用域及生命周期&#xff0c;了解bean是怎么来的又怎么没的。 一、Bean的作用域 在Bean容器启动会读取bean的xml配置文件&#xff0c;然后将xml中每个bean元素分别转…

Bean作用域和生命周期

目录 Bean作用域的例子 作用域定义 Bean的六种作用域 设置作用域 Spring的执行过程和Bean的生命周期 Spring的主要执行流程 Bean的生命周期 在上篇博客中我们使用Spring存储和获取Bean,因此Bean是Spring中最重要的资源,今天这篇博客就深入了解Bean对象 Bean作用域的例子 …

redis(8)有序集合Zset

有序集合Zset Redis 有序集合 zset 与普通集合 set 非常相似&#xff0c;是一个没有重复元素的字符串集合。 不同之处是有序集合的每个成员都关联了一个评分(score)&#xff0c;这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的&#xf…

如何在Linux中实现进程间通信

致前行路上的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 目录 1.进程间通信介绍 1.1进程间通信的目的 1.2进程间通信发展 1.3进程间通信分类 1.4进程间通信的本质 2.管道 2.1什么是管道 2.2管道与进程的关系…

华为OD机试题,用 Java 解【玩牌高手】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

智能算法实现PID智能车控制系统

智能算法实现PID智能车控制系统摘要关键词第一章绪论1.1智能车概述1.2智能PID研究现状1.3本文工作第二章 PID控制简介第三章 内模PID简介3.1 内模PID控制第四章内模智能PID智能车控制系统设计4.1 系统设计4.2内模控制原理第五章 系统仿真及结果分析5.1 系统仿真分析5.2 控制效果…

前端资源浏览器渲染原理

浏览器的渲染页面过程 HTML解析过程 一般情况下服务器会给浏览器返回 xx.html 文件 解析html 其实就是 Dom 树的构建过程 我们可以根据以下html 结构 来简单的分析出 html 的解析过程 解析CSS 规则树 在解析的过程中&#xff0c;如果遇到CSS的link元素&#xff0c;那么会由浏览…

分享 7 个有用的 JavaScript 库,也许你会用的上

使用这7个库&#xff0c;加速你的项目开发当我们可以通过使用库轻松实现相同的结果时&#xff0c;为什么还要编写自定义功能&#xff1f;开发人员最好的朋友和救星就是这些第三方库。我相信一个好的项目会利用一些可用的最佳库。本系列就是帮助前端开发者整理一些相关的优秀的J…

一文了解互联网中的UI设计师

&#xff08;点击即可收听&#xff09;一文了解UI设计师UI设计师是什么岗位,以及它的职责所在是什么,初入职场,今天带你一起来了解一下宏观上:设计师微观上: 上游对接产品经理,根据产品经理产出的PRD(也就是产品文档手册),以及产品原型,设计产品的UI界面,产出设计稿(如:蓝湖,Sk…

vite:常见的配置

最近在捣鼓一下vite&#xff0c;因为自己一直在使用react&#xff0c;就选择vite、react来体验一下vite。 使用最简单的方法创建一个应用&#xff1a;yarn create vite&#xff0c;然后选择react框架。 vite默认配置是使用了defineConfig工具函数&#xff1a; import { defi…

TCP协议原理二

文章目录四、滑动窗口二、流量窗口三、拥塞控制四、滑动窗口 前面我们学习了 确认应答&#xff0c;超时重传&#xff0c;连接管理&#xff0c;这些机制都为我们TCP的可靠性提供了保证&#xff0c;当然在保证TCP的可靠性的同时&#xff0c;传输效率也受到了一定的影响&#xff…

[创业之路-56] :职场真相:越便宜的员工其实越贵

引言&#xff1a;创业公司由于资金的限制&#xff0c;喜欢招聘经验不多、价格便宜的员工&#xff0c;殊不知&#xff0c;放在宏观的视角看&#xff0c;越发发现&#xff0c;越便宜的员工其实越贵&#xff0c;虽然他们能加班、好学习、听话&#xff0c;但创业公司不是大学&#…

【华为OD机试模拟题】用 C++ 实现 - 剩余可用字符集 or @分割可用字符集(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明剩余可用字符集 or @分割可用字符集题目输入输出示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才…

LLVM高级架构介绍

LLVM 为什么要开一个LLVM的新坑呢&#xff1f; 我从智能穿戴转行到芯片软件行业&#xff0c;从事编译器开发&#xff0c;不过是AI编译器。不过基本的传统编译器还是绕不过去啊&#xff0c;所以开始学习LLVM&#xff0c;后面开始学习TVM&#xff0c;MLIR。 LLVM GitHub地址 L…

vue-知识点总结

历史 2015年 10月27 1.0.0 Evangelion 新福音战士2016年 10月1日 2.0.0 Ghost in the Shell 攻壳机动队2019年 2月 2.62020年 9月18日 3.0.0 One Piece(海贼王)2021年 8月10日 3.2.0 .sync where 父向子传递props, 需要双向绑定的时候(子组件想更新这个值) how <one-comp…

vscode配置drawio绘制流程图

目录 vscode配置drwaio drawio使用 添加元素 调整元素 连接元素 添加公式 图像与表格 组合元素 保存以及导出 最近课程设计需要画流程框图&#xff0c;所以在网上找找绘制流程图的软件。然后我选择了这个drawio&#xff0c;无他&#xff0c;只是因为用vscode插件就…

同步和异步promise

进程和线程进程&#xff08;厂房&#xff09;&#xff1a;程序的运行环境线程&#xff08;工人&#xff09;&#xff1a;进行运算的东西同步和异步同步&#xff1a;一件事干完才去干下一件事&#xff0c;前面的代码不执行&#xff0c;后面的代码也不执行。同步的代码可能会出现…

lesson01_ts知识回顾

基本数据类型 undefined 和 null 可赋值给其他基本数据类型 let num: number 3; let flag: boolean false; let str: string "abc";let a: null null; let b: undefined undefined;联合数据类型 let variable: number | boolean false; variable 123;数组 …