操作系统
写时复制 Copy-On-Write
- 多个进程或线程可以共享相同的数据副本,直到某个进程或线程尝试修改数据时,才真正执行拷贝(而不是在一开始就创建多个副本)。
- 这样可以减少不必要的复制提高内存利用率和性能。
适用场景
- 操作系统进程管理(fork):提高进程创建效率,减少内存消耗。
- 高并发读、多线程安全集合(CopyOnWriteArrayList):适用于读多写少的场景。
- 数据库 MVCC:提高数据库事务的并发性能。
网路
TCP三次握手
- 第一次握手:客户端发送SYN请求,给服务端发送了一个序号
- 第二次握手:服务端发送SYN和ACK请求,给客户端发送自己的序号和确认客户端的序号
- 第三次握手:客户端发送ACK请求,确认服务端的序号
三次握手确认双方发送和接受功能正常
TCP四次挥手
- 第一次挥手:客户端发送FIN请求,告诉服务端要关闭连接
- 第二次挥手:服务端收到客户端请求后,进入等待关闭状态
- 第三次挥手:服务端发送FIN请求,告诉客户端没有请求要处理了,可以关闭连接
- 第四次挥手:客户端确认服务端关闭,自己也关闭连接
关闭期间服务端可能还有数据未发送完毕,不能合并ACK+FIN
HTTPS工作流程


TLS1.2
- 客户端发起请求(Client Hello)
客户端发起 HTTPS 请求时,发送如下内容:- 支持的 TLS 协议版本(如 TLS 1.2)
- 支持的加密算法列表(cipher suites)
- 客户端随机数(Client Random)
- 支持的压缩算法
- 可选的扩展(如 SNI,用于支持多域名)
1 | Client Hello: |
- 服务端响应(Server Hello)
服务器返回:- 确定使用的协议版本
- 确定加密算法
- 服务器随机数(Server Random)
- 服务器数字证书(含公钥)
- 是否需要客户端证书(一般不需要)
1 | Server Hello: |
- 客户端验证证书
客户端用 内置的 CA 根证书:- 检查服务端证书是否合法(是否被信任、是否过期)
- 验证域名是否一致(CN 或 SAN 字段)
- 验证证书签名
- 客户端生成对称密钥(Pre-Master Secret)
- 客户端生成一个“预主密钥(Pre-Master Secret)
- 用服务端的公钥加密这个密钥
- 发送给服务器
1 | Client Key Exchange: |
- 服务端解密 Pre-Master Secret
服务器用 自己的私钥解密这个 Pre-Master Secret。
此时,客户端和服务端都拥有了:- Client Random
- Server Random
- Pre-Master Secret
利用这三个值,用同一个算法生成:会话密钥(对称加密密钥)
- 双方生成会话密钥
客户端和服务端根据协商算法生成:- 对称加密密钥
- 消息认证码(MAC)密钥
这些密钥将用于接下来的对称加密通信。
- 客户端发送 Finished
客户端:- 用协商出的对称密钥对握手过程摘要加密
- 发送给服务器
用于验证前面握手内容是否被篡改。
- 服务端发送 Finished
服务端也发送一份 Finished 消息。 - 握手完成,开始加密通信
至此,握手阶段结束。客户端和服务器之间可以开始用对称加密进行通信。
之后的 HTTP 数据会通过这个会话密钥加密
TLS1.2 图解
1 | 客户端 服务端 |
TLS1.3 图解
1 | 客户端 服务端 |
- 砍掉旧算法:如 RSA 密钥交换、AES-CBC、SHA-1、MD5,全被移除 。使用ECDHE(ECC子算法)
- 合并多个消息:减少消息往返次数
- 加密更多内容:提高抗中间人攻击能力
- 0-RTT 支持:允许客户端恢复连接时直接发送数据(但有重放攻击风险)
HTTP与RPC的区别
HTTP(HyperText Transfer Protocol)
一种应用层协议,用于客户端与服务器之间传输数据(如 HTML、JSON)
文本协议,基于请求/响应模型
JSON、XML、HTML等
前端 Web/移动端调用后端 API
RPC(Remote Procedure Call)
一种通信模型,让调用远程服务就像调用本地函数一样
可基于TCP、HTTP、gRPC、WebSocket等
通常是二进制(如 Protobuf、Thrift)
适合微服务内部调用(如 gRPC、Dubbo)

