操作系统

写时复制 Copy-On-Write

  • 多个进程或线程可以共享相同的数据副本,直到某个进程或线程尝试修改数据时,才真正执行拷贝(而不是在一开始就创建多个副本)。
  • 这样可以减少不必要的复制提高内存利用率和性能。

适用场景

  • 操作系统进程管理(fork):提高进程创建效率,减少内存消耗。
  • 高并发读、多线程安全集合(CopyOnWriteArrayList):适用于读多写少的场景。
  • 数据库 MVCC:提高数据库事务的并发性能。

网路

TCP三次握手

  • 第一次握手:客户端发送SYN请求,给服务端发送了一个序号
  • 第二次握手:服务端发送SYN和ACK请求,给客户端发送自己的序号和确认客户端的序号
  • 第三次握手:客户端发送ACK请求,确认服务端的序号

三次握手确认双方发送和接受功能正常

TCP四次挥手

  • 第一次挥手:客户端发送FIN请求,告诉服务端要关闭连接
  • 第二次挥手:服务端收到客户端请求后,进入等待关闭状态
  • 第三次挥手:服务端发送FIN请求,告诉客户端没有请求要处理了,可以关闭连接
  • 第四次挥手:客户端确认服务端关闭,自己也关闭连接

关闭期间服务端可能还有数据未发送完毕,不能合并ACK+FIN

HTTPS工作流程

HTTPS工作流程
加密流程

TLS1.2

  1. 客户端发起请求(Client Hello)
    客户端发起 HTTPS 请求时,发送如下内容:
    • 支持的 TLS 协议版本(如 TLS 1.2)
    • 支持的加密算法列表(cipher suites)
    • 客户端随机数(Client Random)
    • 支持的压缩算法
    • 可选的扩展(如 SNI,用于支持多域名)
1
2
3
4
5
Client Hello:
TLS Version: TLS 1.2
Cipher Suites: [TLS_RSA_WITH_AES_128_GCM_SHA256, ...]
Client Random: abc123...
Extensions: SNI: www.example.com
  1. 服务端响应(Server Hello)
    服务器返回:
    • 确定使用的协议版本
    • 确定加密算法
    • 服务器随机数(Server Random)
    • 服务器数字证书(含公钥)
    • 是否需要客户端证书(一般不需要)
1
2
3
4
5
Server Hello:
TLS Version: TLS 1.2
Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256
Server Random: def456...
Certificate: www.example.com (由 CA 签名)
  1. 客户端验证证书
    客户端用 内置的 CA 根证书:
    • 检查服务端证书是否合法(是否被信任、是否过期)
    • 验证域名是否一致(CN 或 SAN 字段)
    • 验证证书签名
  2. 客户端生成对称密钥(Pre-Master Secret)
    • 客户端生成一个“预主密钥(Pre-Master Secret)
    • 用服务端的公钥加密这个密钥
    • 发送给服务器
1
2
Client Key Exchange:
Encrypted Pre-Master Secret: RSA加密后的pre-secret
  1. 服务端解密 Pre-Master Secret
    服务器用 自己的私钥解密这个 Pre-Master Secret。
    此时,客户端和服务端都拥有了:
    • Client Random
    • Server Random
    • Pre-Master Secret
      利用这三个值,用同一个算法生成:会话密钥(对称加密密钥)
  2. 双方生成会话密钥
    客户端和服务端根据协商算法生成:
    • 对称加密密钥
    • 消息认证码(MAC)密钥
      这些密钥将用于接下来的对称加密通信。
  3. 客户端发送 Finished
    客户端:
    • 用协商出的对称密钥对握手过程摘要加密
    • 发送给服务器
      用于验证前面握手内容是否被篡改。
  4. 服务端发送 Finished
    服务端也发送一份 Finished 消息。
  5. 握手完成,开始加密通信
    至此,握手阶段结束。客户端和服务器之间可以开始用对称加密进行通信。
    之后的 HTTP 数据会通过这个会话密钥加密

TLS1.2 图解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
客户端                服务端
| ---ClientHello----> |
| |
| <--ServerHello------|
| <--Certificate------|
| <--ServerHelloDone--|
| |
| ---KeyExchange----->| (PreMasterSecret加密,用公钥)
| ---ChangeCipherSpec |
| ---Finished-------->|
| |
| <--ChangeCipherSpec |
| <-----Finished------|

TLS1.3 图解

1
2
3
4
5
6
7
8
9
10
客户端                  服务端
| ----ClientHello(+KeyShare)---> |
| |
| <--ServerHello(+KeyShare)------|
| <--EncryptedExtensions----------|
| <--Certificate + Verify --------|
| <--Finished---------------------|
| |
| ----Finished------------------->|

  • 砍掉旧算法:如 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)