腾讯IEG 一面面经 (C/C++/go)

(内容仅供参考)

介绍对微服务的理解?

微服务是一种架构风格,它将一个大型软件应用程序分解成若干个较小的、独立的服务单元。每个服务单元都跑在自己的进程中,服务之间通过轻量级通信机制互相协作,每个服务都可以按照自己的节奏进行开发、部署和维护。

优点:

  • 易于开发和维护:微服务架构允许团队将整个应用程序分解为更小、更简单的组件,从而使开发和维护过程更加容易。

  • 高度可扩展:由于每个服务单元都是独立的,因此可以根据需要增加或减少服务单元的数量,以满足应用程序的需求。

  • 更快的部署:由于每个服务单元都是独立的,因此可以单独部署,从而加快应用程序的部署速度。

  • 更高的可靠性:当一个服务单元出现故障时,其他服务单元不会受到影响,因此整个应用程序的可靠性更高。

微服务做分布式,当服务要进行更新时,怎么做到连续性?

  • 灰度发布:将新版本的微服务先部署到一小部分用户中进行测试,验证其正确性和稳定性,再逐步扩大范围,最终全部替换旧版本。

  • 服务降级:当发现更新后的微服务存在问题或者出现异常时,可以自动或手动切换到旧版本,保证系统的可用性。

  • 服务熔断:当服务不可用时,应用程序会自动切换到备用服务上,保证系统的连续性。

  • 无状态服务:尽可能地使微服务无状态,这样在进行更新时就可以避免对数据和状态的影响,从而减轻更新的风险。

  • 有序更新:按照依赖关系和更新顺序,先停止依赖该服务的其他服务,然后更新目标服务,最后重新启动所有依赖该服务的其他服务,这样可以保证整个系统的运行顺序和连贯性。

介绍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 领取

猜你喜欢

转载自blog.csdn.net/weixin_52622200/article/details/130232433