(内容仅供参考)
介绍对微服务的理解?
微服务是一种架构风格,它将一个大型软件应用程序分解成若干个较小的、独立的服务单元。每个服务单元都跑在自己的进程中,服务之间通过轻量级通信机制互相协作,每个服务都可以按照自己的节奏进行开发、部署和维护。
优点:
-
易于开发和维护:微服务架构允许团队将整个应用程序分解为更小、更简单的组件,从而使开发和维护过程更加容易。
-
高度可扩展:由于每个服务单元都是独立的,因此可以根据需要增加或减少服务单元的数量,以满足应用程序的需求。
-
更快的部署:由于每个服务单元都是独立的,因此可以单独部署,从而加快应用程序的部署速度。
-
更高的可靠性:当一个服务单元出现故障时,其他服务单元不会受到影响,因此整个应用程序的可靠性更高。
微服务做分布式,当服务要进行更新时,怎么做到连续性?
-
灰度发布:将新版本的微服务先部署到一小部分用户中进行测试,验证其正确性和稳定性,再逐步扩大范围,最终全部替换旧版本。
-
服务降级:当发现更新后的微服务存在问题或者出现异常时,可以自动或手动切换到旧版本,保证系统的可用性。
-
服务熔断:当服务不可用时,应用程序会自动切换到备用服务上,保证系统的连续性。
-
无状态服务:尽可能地使微服务无状态,这样在进行更新时就可以避免对数据和状态的影响,从而减轻更新的风险。
-
有序更新:按照依赖关系和更新顺序,先停止依赖该服务的其他服务,然后更新目标服务,最后重新启动所有依赖该服务的其他服务,这样可以保证整个系统的运行顺序和连贯性。
介绍consul,服务发现原理,怎么实现
Consul是一种分布式的服务发现和配置管理工具,它提供了一个可靠的、高效的解决方案来处理服务之间的发现和连接。Consul采用Raft算法保证数据一致性,并通过gRPC协议实现高效的通信。其服务注册、健康检查和负载均衡等功能使得微服务架构变得更加容易。
服务发现原理:当一个微服务启动时,它会向Consul注册自己的服务名称、IP地址和端口号等信息,并定期发送心跳包告知Consul自己的状态。同时,客户端也可以向Consul查询某个服务的信息,Consul会返回可用的服务列表,并进行负载均衡。
实现过程:
-
安装和启动Consul服务器:在集群中安装并启动Consul服务器,并设置一些基本的配置,如日志级别、监听地址、数据目录等。
-
注册服务:在微服务启动时,调用Consul的API注册服务,包括服务名称、IP地址、端口和健康检查等信息。
-
发现服务:在需要调用其他服务时,向Consul查询可用的服务列表,包括服务名称、IP地址和端口等信息,并进行负载均衡处理。
-
健康检查:定期检查服务的状态,判断是否正常运行,如果发现异常则将其标记为不可用状态。
-
集成Consul API:可以通过Java、Go等语言集成Consul的API,实现自动注册和发现服务的功能,并进行负载均衡等处理。
结合consul怎么做到无缝的服务更新发布?
具体步骤如下:
-
准备新版本:在进行更新之前,需要先准备好新版本的微服务,并对其进行测试和验证。
-
新旧版本并存:使用Consul的服务注册功能,将新版本和旧版本的微服务同时注册到Consul中,但新版本的微服务的权重为0,即不参与负载均衡。
-
逐步替换:按照一定的策略逐步增加新版本微服务的权重,同时减少旧版本微服务的权重,直到新版本微服务完全替代旧版本为止。例如,可以采用灰度发布的方式,首先将新版本部署到一小部分用户中进行测试,然后逐步扩大范围,最终全部替换旧版本。
-
健康检查:使用Consul的健康检查功能,定期检查新版本微服务的健康状态,如果发现异常则将其标记为不可用状态,保证系统的稳定性。
-
故障切换:如果在更新过程中出现了故障或问题,可以使用Consul实现自动或手动切换到旧版本微服务上,保证系统的可用性。
项目中服务之间有没有相互相互调用的情况?
在项目中,不同的微服务之间通常会存在相互调用的情况,这也是微服务架构的一个基本特征。因为微服务将系统拆分成了多个独立的服务单元,每个服务单元负责处理一项具体的业务功能,所以它们之间需要相互协作,通过接口互相调用来完成复杂的业务流程。
consul在项目中的作用?
提供以下功能:
-
服务发现:微服务架构下的各个服务单元需要进行相互协作,Consul通过服务注册和发现机制实现了服务之间的自动发现和连接。当一个微服务启动时,它会向Consul注册自己的服务名称、IP地址和端口号等信息,并定期发送心跳包告知Consul自己的状态。同时,客户端也可以向Consul查询某个服务的信息,Consul会返回可用的服务列表,并进行负载均衡。
-
健康检查:Consul通过心跳检测机制,定期检测服务的健康状态,如果发现异常则将其标记为不可用状态,避免客户端请求到无效的服务。
-
配置管理:Consul支持多种数据类型的管理,如键值对、JSON等格式,也支持基于ACL的访问控制。开发人员可以在Consul中存储和管理应用程序所需的配置信息,而无需部署额外的配置服务器。
-
服务网格化:Consul还支持服务网格化,通过集成服务间的通信链路,实现服务间更强的监控、流量控制、故障恢复等功能。
鉴权是个什么意思?
鉴权(Authentication)是指根据一定的规则和标准确认用户身份的过程。在计算机系统中,鉴权通常是通过用户名和密码等身份验证方式来实现的,目的是保护系统数据的安全性,防止未经授权的用户访问和操作数据。鉴权还可以用于控制用户对某些资源的访问权限,限制用户访问敏感信息、重要文件等。
session是怎么生成的?怎么和用户身份绑定?
Session(会话)是指客户端与服务器之间建立的一种持久化的连接,用于记录用户在网站中的活动状态以及保存用户的登录信息等。Session的生成过程如下:
-
用户首次访问网站时,服务器生成一个唯一的Session ID,并将该ID存储在Cookie中或者通过URL Rewriting的方式添加到URL的末尾。
-
当用户发起后续请求时,浏览器会自动携带该Session ID,服务器通过该ID可以找到该用户对应的Session对象。
-
服务器把需要共享的数据存储在Session对象中,可以在不同的页面和请求之间进行读写。
关于Session和用户身份的绑定,通常是在用户登录成功后,在Session对象中记录用户的身份信息,比如用户名、用户ID等。之后的每个请求都会携带该Session ID,服务器根据该ID可以找到对应的Session对象并获取用户的身份信息,从而判断用户是否具有访问该资源的权限。如果用户在注销登录或者Session超时后,服务器也会删除该Session对象,以保证数据的安全性。
mysql的存储引擎有了解吗?
-
MyISAM:MyISAM是MySQL默认的存储引擎,它使用表级锁,支持全文索引和压缩等功能,但不支持事务和行级锁。
-
InnoDB:InnoDB是MySQL较为流行的存储引擎,它支持事务、行级锁和外键等许多高级功能,适用于高并发和数据安全要求较高的应用场景。
-
MEMORY:MEMORY是一种基于内存的存储引擎,将数据存储在内存中,读写速度非常快,适用于数据量较小且对性能要求很高的场景。
-
NDB Cluster:NDB Cluster是MySQL集群环境下的推荐存储引擎,支持分布式部署和高可用性,适用于海量数据存储和高并发访问的场景。
-
CSV:CSV是一种基于文本格式的存储引擎,适用于需要频繁导入导出数据的场景,但不支持事务和索引等高级特性。
-
ARCHIVE:ARCHIVE是一种基于压缩的存储引擎,适用于大量历史数据的存储和查询,但不支持更新和删除操作。
-
BLACKHOLE:BLACKHOLE是一种“黑洞”存储引擎,写入的数据会被直接丢弃,适用于数据备份和数据同步等场景。
innodb和myisam的区别?
区别:
-
事务支持:InnoDB支持事务处理,可以提交或回滚事务,并且支持ACID特性,MyISAM不支持事务处理。
-
并发能力:InnoDB支持行级锁定和多版本并发控制,可以提高多用户并发访问数据库的性能;而MyISAM只支持表级锁定,对于高并发的应用性能会受到影响。
-
外键约束:InnoDB支持外键约束,可以保证数据的完整性和一致性,MyISAM不支持外键约束。
-
数据缓存:InnoDB使用缓冲池(Buffer Pool)来缓存数据,可以有效降低磁盘I/O操作的频率,提高查询性能;MyISAM没有缓冲池机制,需要依靠操作系统的文件缓存来完成数据缓存。
-
索引实现:InnoDB的索引采用B+树实现,支持聚集索引;MyISAM的索引采用B树实现,不支持聚集索引。
-
崩溃恢复:InnoDB对数据的崩溃恢复能力非常强大,即使数据库崩溃也可以通过日志进行恢复;而MyISAM容易出现数据损坏或丢失,恢复困难。
innodb索引的底层数据结构有了解吗?
主要包括
-
聚集索引:InnoDB中每张表都有一个聚集索引,用于按照主键顺序存储数据,也就是说,聚集索引的叶子节点保存的是整行数据。如果没有显式定义主键,则InnoDB会自动选择一个唯一的非空索引作为聚集索引;如果没有这样的索引,则InnoDB会生成一个内部的、不可见的聚集索引。
-
辅助索引:除了聚集索引之外,InnoDB还可以创建多个辅助索引(Secondary Index),用于加速查询。辅助索引的叶子节点并不保存整行数据,而是保存指向对应聚集索引上记录的主键值。因此,当使用辅助索引进行查询时,需要先通过辅助索引找到对应的主键值,再到聚集索引中查找整行数据。
-
全文索引:InnoDB从MySQL 5.6开始支持全文索引,使用Inverted List作为底层数据结构。全文索引可以对文本和字符串类型的数据进行高效的模糊搜索,例如在文章中查找某个关键词出现的位置等。
为什么要用B+树,不用B树、二叉树、红黑树?
B+树具有以下优点:
-
磁盘IO次数少:由于磁盘IO操作是数据库性能的瓶颈之一,因此减少磁盘IO次数可以提高查询效率。与B树相比,B+树每个节点可以存储更多的索引项和子节点指针,从而减小了树的高度,降低了磁盘IO操作的次数。
-
适合范围查询:在范围查询(例如 BETWEEN、IN)时,B+树比其他树结构更加适合。由于B+树内部节点只存储索引信息,而数据记录都保存在叶子节点上,因此进行范围查询时,可以直接遍历叶子节点来查找符合条件的记录。
-
便于扫描:B+树的所有叶节点都连成了一个链表,因此对于全表扫描或者分页查询等操作,可以通过顺序访问整个链表来完成,大大提高了查询效率。
-
支持前缀查找:B+树支持根据索引前缀进行查找,在存储长字符串类型数据时,可以将其分解为多个较短的前缀,提高查询效率。
redis在项目中主要是做什么用?
Redis主要应用于以下几个方面:
-
缓存:作为缓存使用是Redis最常见的用途之一。通常情况下,我们可以将经常被查询的数据缓存在Redis中,这样可以减轻数据库的压力,提高访问速度。
-
数据存储:Redis也可以当做一个数据存储系统来使用。例如,我们可以将用户的登录信息、网站配置信息等保存到Redis中,在需要的时候快速读取出来。
-
队列:由于Redis支持列表(List)和消息队列(Pub/Sub),因此它也可以作为一个高效的消息队列来使用。可以将生产者产生的消息放入Redis列表中,消费者从列表中获取消息并进行处理。
-
分布式锁:Redis支持原子操作,可以将其用于分布式锁的实现。通过设置一个特定的键值对,可以保证在分布式环境下进行互斥操作。
-
计数器:Redis支持自增和自减操作,可以用于实现计数器功能。
-
会话管理:由于Redis支持原子性的操作,因此可以用于实现分布式会话管理。可以将用户的登录信息等数据保存到Redis中,实现跨服务器的会话共享。
-
地理位置:Redis支持地理位置查询和存储操作,可以用于实现附近用户查找等功能。
redis有哪几种数据类型?
包括:
-
字符串(String):最基本的数据类型,可以存储任何类型的数据,例如数字、布尔值、字符串等。
-
列表(List):由多个元素组成的集合,支持从两端进行添加、删除、更新等操作,可以用于实现消息队列、任务队列等功能。
-
集合(Set):由多个唯一元素组成的无序集合,支持添加、删除、求交集、求并集等操作,可以用于实现共同好友、共同关注等功能。
-
有序集合(Sorted Set):与集合类似,但是每个元素都带有一个分数值,可以根据分数值进行排序和范围查询,可以用于实现排行榜、最新列表等功能。
-
哈希表(Hash):由多个键值对组成的集合,支持添加、删除、更新、查询等操作,可以用于存储用户信息、网站配置等数据。
-
Bitmap:位图数据结构,可以用于记录用户的签到情况、在线状态等信息。
-
HyperLogLog:基数算法数据结构,可以用于统计大量数据中的不重复元素数量。
这些数据类型底层的数据结构有了解吗?
-
字符串(String):字符串的底层数据结构是简单动态字符串(SDS),它类似于C字符串,但可以自动扩容和管理空间。
-
列表(List):列表的底层数据结构是双向链表,每个节点包含前驱指针、后继指针和值等信息。为了提高查找效率,Redis还支持快速访问头部和尾部元素的操作。
-
集合(Set):集合的底层数据结构是哈希表或者有序数组,当元素数量较少时使用有序数组,否则使用哈希表。因为哈希表可以在O(1)时间内查找和插入元素,而有序数组需要进行二分查找,时间复杂度为O(logN)。
-
有序集合(Sorted Set):有序集合的底层数据结构也是哈希表和跳跃表的组合。哈希表用来保存成员和分数之间的映射关系,而跳跃表用来对成员进行排序和查询。
-
哈希表(Hash):哈希表的底层数据结构也是哈希表,它由多个键值对组成,每个键值对是一个单独的哈希表节点。
-
Bitmap:Bitmap的底层数据结构是字符串,可以将一个字符串看作是由二进制位组成的数组。Redis提供了一些位运算指令来操作Bitmap中的二进制位。
-
HyperLogLog:HyperLogLog的底层数据结构是基数算法(HyperLogLog Algorithm),它通过对元素进行hash计算并统计不同hash值的数量来估算原始数据的基数。
redis在磁盘上有存数据吗?
Redis可以将数据在内存中进行持久化,同时也可以将数据写入到磁盘上以保证数据的可靠性和持久性。Redis提供了两种方式来实现数据的持久化:
-
快照(Snapshot):快照是一种将当前数据集保存到磁盘上的方式。当Redis需要进行数据持久化时,它会fork出一个子进程,子进程将当前数据集写入到临时文件中,待写入完成后再用临时文件替换原始快照文件。快照文件通常采用RDB格式进行存储,该格式包含了数据集所有的键值对、过期时间、数据类型等信息。
-
AOF(Append Only File):AOF是一种将每个操作日志追加到文件末尾的方式,通过记录每个写操作指令,可以完全还原数据集,具有精细的持久化能力。Redis可以配置AOF的同步策略,包括always(每次写入都要立即同步)、everysec(每秒同步一次)、no(由操作系统决定何时进行同步)等。
byteslice和string有什么区别?
byteslice和string的主要区别在于它们是可变还是不可变的。
-
string:string类型底层是一个只读的byte slice([]byte),用UTF-8编码表示文本内容。对string进行修改会导致编译错误,需要先将其转换为可写的byte slice,再进行修改。
-
byteslice:byteslice类型是一个可变的byte slice,可以随意修改其中的元素值。byteslice通常用于处理二进制数据,例如文件IO、网络传输等操作。
进程、线程、协程的区别?
-
进程:是操作系统分配资源的基本单位。进程是程序在执行过程中的一个实例,具有独立的内存空间、文件描述符、环境变量等系统资源。不同进程之间不能直接共享数据,如果需要通信需要通过IPC(Inter-Process Communication)机制,例如管道、消息队列、共享内存等。
-
线程:是操作系统调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。因为线程共享同一地址空间,所以线程之间的通信更加方便,例如使用全局变量或者互斥锁进行同步。
-
协程:是一种用户态的轻量级线程。协程由用户自行控制调度,不依赖于操作系统的线程调度器,因此切换速度非常快。与线程相比,协程占用的内存资源更少,在支持高并发的应用场景中越来越受欢迎。
协程可以实现并行吗?
可以实现并行,在协程中,多个协程共享一个线程,每个协程只是一个轻量级的执行流程,可以根据需要随时进行切换,避免了线程切换的开销。因此,协程常常被用于高并发应用程序中,例如网络服务、Web框架、爬虫等。
协程有几种调度模式?
-
非抢占式调度:也称为协作式调度,即协程之间需要手动释放执行权才能切换到其他协程。在这种模式下,每个协程都有自己的任务队列或者事件循环,只有当当前协程执行完毕或者发生I/O等阻塞操作时,才会将执行权交给下一个协程。非抢占式调度可以避免线程切换的开销和竞争条件,但是如果某个协程一直不释放执行权,就会导致整个应用程序挂起。
-
抢占式调度:与非抢占式调度相反,抢占式调度可以强制中断正在执行的协程,将执行权交给其他协程。在这种模式下,每个协程都有自己的时间片和优先级等属性,由调度器来负责协程的切换。抢占式调度可以保证公平性和优先级,但是频繁的线程切换会引起系统开销和性能问题。
go里面字符串拼接有几种方式?
-
使用加号连接两个字符串
-
使用fmt.Sprintf()函数进行格式化输出
-
使用strings.Join()函数连接多个字符串
-
使用bytes.Buffer缓冲区来拼接字符串,避免频繁的内存分配和复制操作。可以通过bytes.Buffer.WriteString()方法向缓冲区中添加字符串,最后通过bytes.Buffer.String()方法获取完整的字符串。
格式化输出时,%v和%w有什么区别?
在Go语言中,%v和%w都是格式化输出的占位符。
%v用于通用的值的默认格式输出,可以输出一般的类型,如int、float、string、bool、array、slice、map等。它会将变量按照默认方式格式化输出,并自动匹配变量的类型进行输出,比较常用。
%w是用于时期和时间格式化输出的占位符,可以输出指定的日期或者时间,如年、月、日、时、分、秒等。与其他语言中的时间格式化函数相比,%w可以根据系统本地化信息而自动适应不同的时间格式,比较方便。
go的GC原理、回收策略
Go语言的GC(Garbage Collection)机制是一种自动内存管理技术,它可以自动识别和回收不再使用的内存空间,避免了手动管理内存所带来的问题。Go语言的GC机制采用标记清除算法和三色标记法实现。
标记清除算法:在标记阶段,GC会从根节点出发,遍历所有可达的对象,并对这些对象打上标记;在清除阶段,GC将没有标记的对象视为垃圾对象,释放其占用的内存空间。
三色标记法:将所有对象分为白色、黑色和灰色三类。初始状态下,所有对象都是白色的,表示未被访问过;当一个对象被访问时,它变为灰色,并将其引用的所有对象也标记为灰色;访问完成后,将该对象标记为黑色,并将其所有引用对象加入灰色队列中。最终,所有白色对象都被认定为垃圾对象并被回收。
Go语言的GC机制具有以下几个特点:
-
并发标记:标记和清除操作可以与程序运行同时进行,避免了长时间暂停和不必要的内存空间浪费。
-
内存分配:Go语言的GC机制使用了分代回收和空闲列表技术,可以高效地管理内存分配和释放。
-
触发机制:GC机制会根据内存占用情况和程序运行时间等因素自动触发,避免过早或过晚地进行垃圾回收,从而提高了系统的性能和稳定性。
TCP和UDP的区别?
-
连接方式:TCP是面向连接的协议,而UDP是无连接的协议。
-
可靠性:TCP是可靠传输协议,能够保证数据传输的完整性、准确性和顺序性。UDP则不保证数据包传输的顺序、完整性和可靠性。
-
速度:UDP速度比TCP快,因为TCP需要进行三次握手建立连接,而UDP没有这个过程。
-
流量控制:TCP具有流量控制机制,可以避免网络拥塞,而UDP没有这种机制,容易造成网络拥堵。
-
数据量:TCP适合传输大量数据,而UDP适合传输小量的数据或者即时性要求高的数据(如实时视频、语音等)。
-
应用场景:TCP适用于网页浏览、文件下载、邮件发送等需要可靠传输的应用;UDP适用于实时通信、音频和视频传输等对时延和带宽要求较高的应用。
TCP有哪些机制保持可靠性?
-
序列号和确认应答:TCP通过给每个字节编号来确保数据传输的顺序和完整性,并且接收方需要发送确认应答指示已经正确接收到了数据。
-
超时重传:如果发送方没有收到确认应答,它会重新发送数据。为了防止无限等待确认,TCP设置了一个超时时间,在超过这个时间后就会触发重传机制。
-
流量控制:TCP使用滑动窗口机制进行流量控制,以避免发送方发送过多的数据,导致接收方无法处理。接收方会发送一个窗口大小值给发送方,告诉它还可以接收多少数据。
-
拥塞控制:TCP使用拥塞窗口机制来控制网络拥塞。如果网络出现拥塞,TCP会降低发送速率,直到网络恢复正常。
-
重组包:如果发送方将数据分成多个包发送,接收方可以按顺序重新组装这些包,并根据序列号检查是否有丢失的包,然后发送确认应答。
TCP关闭链接需要几次握手?第一次挥手丢失会怎么样?
TCP关闭连接需要经过四次握手:
- 发送方发送一个FIN报文,表示不再发送数据。
- 接收方发送一个ACK报文确认接收到了FIN报文,并开始准备关闭连接。
- 接收方发送一个FIN报文,表示自己也不再发送数据。
- 发送方发送一个ACK报文确认接收到了FIN报文。
如果第一次挥手丢失,则接收方无法正确响应,发送方就会一直等待响应,直到超时才会关闭连接。在这段时间内,接收方可能会认为连接已经关闭,但发送方却仍然保持着连接状态,这种情况下,发送方可以尝试重传FIN报文,但如果重传多次仍然没有响应,那么发送方将强制关闭连接。
如果对方发了FIN包,自己回了ACK包后,ACK包丢失会怎么样?
如果对方发了FIN包,自己回了ACK包后,ACK包丢失,这时发送方的状态是等待ACK确认的状态,如果一直没有收到ACK确认,那么发送方会认为连接没有正常关闭,会一直等待ACK确认,从而导致资源浪费。
针对这种情况,TCP使用了超时重传机制来保证可靠性。当发送方发送完ACK包后未收到对端的FIN包时,就会启动定时器,如果在规定时间内未收到对端的FIN包,则重新发送ACK包。如果还是没有收到对端的FIN包,定时器会再次启动并重试,直到收到对端的FIN包或者达到最大重试次数为止。
挥手结束之后,还可以在相同的IP和端口发起链接吗?
可以
在TCP连接中,每个连接都是由四元组(源IP地址、源端口号、目标IP地址、目标端口号)唯一确定的。因此,当旧的TCP连接关闭后,就会释放这个四元组,使其可用于新的连接。
如果在挥手过程结束后,想要再次建立连接,只需要使用相同的IP地址和端口号,并指定新的目标IP地址和端口号即可。此时,TCP会重新建立一个新的连接,并分配新的随机序列号,从而避免与之前的连接混淆。
HTTP和HTTPS有什么区别?
-
安全性:HTTP是明文传输协议,数据在传输过程中没有加密,容易被窃听、篡改或伪造。而HTTPS则采用了SSL(Secure Socket Layer)或TLS(Transport Layer Security)协议进行加密,保障数据传输的安全性。
-
端口号:HTTP默认使用80端口进行通信,而HTTPS默认使用443端口。
-
证书验证:HTTPS需要使用数字证书对服务器进行身份验证,确保客户端与服务器之间的通信不会被恶意攻击者所篡改或窃取。
-
速度:由于需要加解密操作,HTTPS比HTTP传输速度稍慢一些,但是现代计算机和网络带宽已经足够支持HTTPS的正常使用。
-
缓存:HTTP协议能够很好地利用缓存技术来提高访问速度,而HTTPS因为数据需要加密,无法使用相同的缓存机制来提高访问速度。
HTTPS的证书怎么保证了传输的安全性?
它通过公钥加密来确保数据在传输过程中不被篡改、窃听或伪造。
具体来说,HTTPS的证书工作原理如下:
-
客户端发起HTTPS请求时,服务器会将自己的数字证书发送给客户端。
-
客户端从数字证书中获取服务器的公钥,并且验证数字证书的合法性和有效期。
-
客户端使用服务器的公钥对数据进行加密,并发送给服务器。
-
服务器使用私钥对加密后的数据进行解密,然后再使用共享密钥算法对数据进行加密,并发送给客户端。
-
客户端使用共享密钥算法对数据进行解密,完成传输过程。
其中,数字证书包含了网站的信息,包括网站域名、公钥以及数字证书的签发机构等。客户端通过验证数字证书的合法性,可以确保连接的安全性。
数字证书通常由第三方认证机构(CA)颁发,CA是专门用于颁发、管理和吊销数字证书的机构,具有较高的信誉和可靠性。因此,当客户端确认数字证书来自受信任的CA时,就可以获得更高的安全性保障。
C/C++开发学习资料、面试题 ,有需要的可以自行添加学习交流群 739729163 领取