一、TLS(Transport Layer Security)握手是建立安全通信通道的关键过程,确保客户端与服务器之间的通信加密和身份验证。以下是TLS 1.2和TLS 1.3的握手流程详解及对比:
TLS 1.2 握手流程
目标:协商加密套件、交换密钥、验证身份
步骤:
1. Client Hello
- 客户端发送支持的TLS版本、加密套件列表(如`AES256-GCM-SHA384`)、随机数(Client Random)及扩展字段(如SNI)。
2. Server Hello
- 服务器选择TLS版本、加密套件,并返回随机数(Server Random)和服务端证书(包含公钥)。
3. 证书验证
- 客户端验证服务器证书链(是否可信、是否过期、域名匹配等)。若启用双向认证,服务器会请求客户端证书。
4. Server Key Exchange
- 若使用DH/ECDHE密钥交换,服务器发送临时公钥参数(如ECDHE公钥)和签名。
5. Server Hello Done
- 服务器通知客户端初始协商完成。
6. Client Key Exchange
- 客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密(RSA)或发送临时公钥(DH/ECDHE)。
7. 密钥派生
- 双方通过Client Random、Server Random和Pre-Master Secret生成会话密钥(Master Secret),再派生出加密密钥和MAC密钥。
8. 切换加密通信
- 双方发送`Change Cipher Spec`通知,后续通信使用协商的密钥加密。
9. Finished
- 双方发送加密的`Finished`消息,验证握手完整性。
TLS 1.3 握手流程
优化目标:减少延迟(1-RTT或0-RTT)、移除不安全特性。
关键改进:
- 删除RSA密钥交换、静态DH,仅支持前向安全的ECDHE。
- 合并多步骤为单条消息,支持1-RTT握手。
步骤:
1. Client Hello
- 发送支持的加密套件、Client Random、密钥共享参数(如ECDHE公钥)。
2. Server Hello
- 服务器选择参数,返回Server Random、密钥共享参数(ECDHE公钥),并附带证书和签名。
- 直接生成会话密钥:双方通过ECDHE参数即时计算共享密钥。
3. 加密通信
- 服务器立即发送`Finished`消息,客户端验证后即可开始加密通信(1-RTT)。
- **0-RTT(可选)**:若之前连接过,客户端可在首次请求中携带加密数据(有重放攻击风险)。
二、DNS(Domain Name System)解析是将域名转换为IP地址的过程,以下是详细的解析流程:
---
1. 用户输入域名
用户在浏览器中输入域名,触发DNS解析请求。
---
2. 本地缓存查询
- 浏览器缓存:浏览器首先检查自身缓存中是否有该域名的解析结果。
- 系统缓存(Hosts文件):如果浏览器无缓存,操作系统会检查本地Hosts文件是否有对应的IP记录。
- 系统DNS缓存:操作系统查询本地DNS缓存。
> 若缓存命中且未过期:直接返回IP,解析结束。
---
3. 向递归DNS服务器发起请求
如果本地无缓存,系统会向递归DNS服务器(通常由ISP或公共DNS如`8.8.8.8`、`114.114.114.114`提供)发送查询请求。
- 递归DNS服务器缓存:递归服务器先检查自身缓存,若有记录则直接返回。
- 无缓存时:递归服务器开始迭代查询。
---
4. 迭代查询(根域名→顶级域→权威DNS)
递归服务器按层级依次查询以下DNS服务器:
(1) 根域名服务器(Root DNS)
- 全球共13组根服务器(逻辑上,实际通过任播扩展)。
- 返回`.com`顶级域(TLD)的DNS服务器地址(如`a.gtld-servers.net`)。
(2) 顶级域名服务器(TLD DNS)
- 管理`.com`、`.org`等顶级域的服务器。
- 返回`example.com`的**权威DNS服务器**地址(如`ns1.example.com`)。
(3) 权威域名服务器(Authoritative DNS)
- 由域名注册商或托管服务商(如Cloudflare、阿里云)提供。
- 返回`www.example.com`的IP地址(如`192.0.2.1`)。
---
5. 返回解析结果
- 递归DNS服务器将IP返回给用户,并缓存该记录(根据TTL值)。
- 操作系统和浏览器也缓存结果,加速后续访问。
---
6. 建立连接
用户获取IP后,通过TCP/IP协议(如HTTP/HTTPS)与目标服务器建立连接。