Android学习总结之网络篇(HTTP请求流程)
客户端向服务器发送 HTTPS 请求的过程可以分为 网络连接建立、TLS/SSL 安全握手、数据传输、连接关闭 四个核心阶段
一、DNS 解析:从域名到 IP 的「寻址前奏」
- 核心目标:将人类可读的域名(如
https://www.example.com
)转换为服务器的 IP 地址,用于建立网络连接。 - 细节扩展:
- DNS 缓存机制:首先检查本地 DNS 缓存(浏览器缓存、操作系统缓存),若未命中则发起网络查询。浏览器会优先使用「DNS 预解析」(提前解析页面中可能用到的域名),减少后续延迟。
- DNS 查询方式:
- 递归查询:客户端向本地 DNS 服务器(如运营商 DNS)请求,本地服务器若无记录则代替客户端向根 DNS、顶级域名 DNS、权威 DNS 递归查询,最终返回结果(客户端只需一次请求)。
- 迭代查询:客户端直接向各级 DNS 服务器依次查询,适合自主控制解析流程(如 DNS-over-HTTPS/DoH 场景)。
- 安全增强:现代浏览器支持 DNS-over-HTTPS(DoH) 或 DNS-over-TLS(DoT),将 DNS 查询加密,防止中间人篡改域名解析结果(如域名劫持)。
二、TCP 三次握手:可靠连接的「安全基石」
-
基于解析得到的 IP 地址,客户端与服务器通过 TCP 三次握手 建立可靠的传输通道:
- 客户端 → 服务器:发送 SYN 报文,请求建立连接(初始序列号
Seq=A
)。 - 服务器 → 客户端:返回 SYN+ACK 报文,确认请求(确认号
Ack=A+1
,自身序列号Seq=B
)。 - 客户端 → 服务器:发送 ACK 报文,确认连接(确认号
Ack=B+1
)。- 三次握手完成后,客户端与服务器建立 TCP 连接(默认端口为 443,HTTPS 专用)。
- 深度原理:
- 三次握手的必要性:
- 客户端发送 SYN=A(请求连接,初始序列号 A),告知服务器自己的初始序号。
- 服务器回复 SYN=B + ACK=A+1(确认客户端请求,同时告知自己的初始序号 B),确保双方确认对方的发送能力。
- 客户端回复 ACK=B+1(确认服务器的请求),确保双方确认对方的接收能力。
- 为何不是两次?:避免历史失效的连接请求(如延迟的旧 SYN 报文)被误认为有效,导致资源浪费(如「SYN 洪泛攻击」利用此原理消耗服务器资源)。
- 状态变迁:客户端从
CLOSED
→SYN_SENT
→ESTABLISHED
,服务器从CLOSED
→LISTEN
→SYN_RCVD
→ESTABLISHED
,最终进入数据传输状态。
- 三次握手的必要性:
三、TLS/SSL 握手(建立安全通道)
HTTPS 的核心是通过 TLS/SSL 协议 加密数据,握手过程分为以下步骤(以 TLS 1.2 为例):
1. 客户端发起安全连接请求(ClientHello)
- 客户端发送支持的 TLS 版本(如 TLS 1.3)、加密套件列表(如
ECDHE-RSA-AES256-GCM-SHA384
)、随机数(Client Random) 等信息。
2. 服务器选择加密方案并返回证书(ServerHello + 证书)
- 服务器从客户端支持的加密套件中选择一个(如
ECDHE
密钥交换算法 +AES
对称加密 +SHA
哈希),返回 服务器数字证书(包含服务器公钥)、服务器随机数(Server Random)、选定的加密套件等。
3. 客户端验证服务器证书
- 客户端检查证书是否由 可信 CA 签发、是否过期、域名是否与目标一致(防止中间人攻击)。
- 若证书无效,浏览器会提示 “不安全”;若有效,提取证书中的 服务器公钥。
4. 客户端生成预主密钥并加密传输(Pre-Master Secret)
- 客户端生成一个 预主密钥(Pre-Master Secret),用服务器公钥加密后发送给服务器。
- 服务器用自己的 私钥解密 得到预主密钥。
5. 双方协商生成会话密钥(对称加密密钥)
- 客户端和服务器通过 Client Random、Server Random、Pre-Master Secret 计算出 会话密钥(对称密钥)。
- 后续数据传输使用 对称加密(效率高),而密钥协商过程使用 非对称加密(保证安全性)。
6. 验证握手完整性(Finished 消息)
- 双方发送 Finished 消息,用会话密钥加密,验证整个握手过程是否被篡改。
- 至此,TLS/SSL 握手完成,建立安全通道。
四、发送 HTTP 请求与接收响应(加密传输)
- 客户端发送加密的 HTTP 请求:
- 客户端将 HTTP 请求(如 GET/POST)用 会话密钥加密,通过 TCP 连接发送到服务器。
- 服务器解密并处理请求:
- 服务器用会话密钥解密请求,处理业务逻辑(如查询数据库),生成响应。
- 服务器返回加密的响应:
- 服务器将响应数据用会话密钥加密后发送给客户端。
- 客户端解密并显示响应:
- 客户端用会话密钥解密响应,解析并渲染内容(如网页、数据)。
五、连接关闭
- TLS 连接关闭:
- 双方发送 CloseNotify 消息,通知对方关闭安全通道。
- TCP 四次挥手:
- 客户端和服务器通过四次挥手释放 TCP 连接(FIN+ACK 报文交互)。
核心技术深度对比与安全设计
技术点 | 非对称加密(握手阶段) | 对称加密(传输阶段) |
---|---|---|
优势 | 安全性高(公钥公开,私钥唯一) | 效率高(加密 / 解密速度快) |
缺点 | 计算耗时(RSA 加密大文件慢) | 密钥传输需安全通道(依赖非对称加密) |
典型算法 | RSA、ECC(椭圆曲线密码学) | AES-GCM、ChaCha20-Poly1305 |
结合原因 | 用非对称加密保护对称密钥的传输安全 | 用对称加密处理大量数据传输 |
- 证书信任链:通过 CA 层级签名(根 CA → 中级 CA → 服务器证书),构建「信任锚」,确保服务器身份不可伪造(破解需伪造整个链,成本极高)。
- TLS 1.3 优化:相比 1.2,减少 1 次 RTT(往返时间),握手阶段从 2-RTT 缩短至 1-RTT,提升性能;禁用不安全的算法(如 SHA-1、RC4),增强安全性。
扩展加密
对称加密算法是加密和解密使用 同一密钥 的加密方式,具有效率高、速度快的特点,适用于大量数据的加密传输。以下是常见的对称加密算法及其原理、使用场景的详细解析:
分组加密算法(Block Cipher)
将明文分成固定长度的 数据块,逐块加密,输出等长的密文块。
-
AES(高级加密标准)
- 原理:
- 分组长度固定为 128 位,密钥长度可选 128 位、192 位、256 位(密钥越长越安全)。
- 采用 代替 - 置换网络(SP 网络),通过字节替换、行移位、列混淆、轮密钥加等多轮变换(10-14 轮,依密钥长度而定),将明文块转换为密文块。
- 安全性基于 数学难题的复杂性,目前未被破解,是全球主流加密算法。
- 使用场景:
- HTTPS/TLS 协议(如 AES-GCM 模式,同时提供加密和认证)、VPN、硬盘加密(如 BitLocker)、数据存储加密。
- 支持多种工作模式:CBC(需初始化向量 IV)、GCM(推荐,效率高且防篡改)、CTR(适合高速传输)。
- 原理:
-
DES(数据加密标准)
- 原理:
- 分组长度 64 位,密钥长度 56 位(实际 8 位用于奇偶校验)。
- 采用 Feistel 网络结构,将明文分为左右两半,通过 16 轮迭代、子密钥异或、S 盒替换等操作加密。
- 缺点与使用:
- 因密钥过短(56 位可通过暴力破解),已被淘汰,仅用于旧系统兼容。
- 衍生算法 3DES(三重 DES):通过 3 次 DES 加密(密钥可重复或不同),将密钥长度提升至 112/168 位,作为过渡方案,目前也逐渐被 AES 取代。
- 原理:
流加密算法(Stream Cipher)
将明文逐位 / 逐字节与 密钥流(伪随机序列)异或生成密文,无需分组。
-
ChaCha20
- 原理:
- 基于 ChaCha 核心函数,通过 20 轮循环(10 轮加密)生成密钥流,输入为密钥(256 位)、非 ce(12 位)和计数器(32 位)。
- 优势:
- 抗量子攻击潜力(相比 AES),且在移动端(如 ARM 架构)性能优于 AES(无需硬件加速),被 TLS 1.3 和 IPsec 采纳(如 ChaCha20-Poly1305 组合)。
- 原理:
核心原理对比
特性 | 分组加密(如 AES) | 流加密(如 ChaCha20) |
---|---|---|
处理方式 | 分块处理(固定长度,需填充) | 逐位 / 字节处理(无需填充) |
密钥流生成 | 依赖明文块和密钥,每块独立加密 | 生成独立于明文的伪随机密钥流,与明文异或 |
安全性 | 依赖分组模式(如 GCM 防篡改) | 依赖密钥流的随机性(非 ce 需唯一) |
效率 | 适合大块数据,硬件加速优化(如 AES-NI) | 适合实时传输(如视频流),软件层面高效 |
非对称加密算法(公钥加密算法)的核心是使用 一对关联的密钥(公钥和私钥):公钥公开,用于加密或验证签名;私钥私密,用于解密或生成签名。以下是常见的非对称加密算法及其原理、特点和应用:
一、RSA(最经典的非对称算法)
原理:
- 数学基础:基于大整数分解难题(两个大素数的乘积难以快速分解)。
- 密钥生成:
- 选择两个大素数 p 和 q,计算 n=p×q(模数)。
- 计算欧拉函数 ϕ(n)=(p−1)(q−1)。
- 选择一个与 ϕ(n) 互质的整数 e(公钥指数,通常取 65537)。
- 计算私钥指数 d,满足 d×e≡1modϕ(n)(通过扩展欧几里得算法)。
- 加密 / 解密:
- 加密:C=Memodn(明文 M 用公钥 (n,e) 加密)。
- 解密:M=Cdmodn(密文 C 用私钥 d 解密)。
特点:
- 优点:兼容性强,支持数字签名和密钥加密。
- 缺点:密钥长度长(常用 2048/4096 位),加密效率低,不适合加密大量数据。
- 应用场景:
- HTTPS 中加密预主密钥(Pre-Master Secret)。
- 数字证书(CA 用 RSA 私钥签名证书)。
- 软件签名(如 Windows 驱动程序签名)。
二、ECC(椭圆曲线加密算法,现代主流)
原理:
- 数学基础:基于椭圆曲线离散对数难题(在椭圆曲线上,已知点 P 和倍数 kP,难以反推 k)。
- 密钥生成:
- 选定椭圆曲线参数(如 SECP256R1、SECP384R1)。
- 选择私钥 d(随机整数),计算公钥 Q=d×G(G 是椭圆曲线的基点)。
- 加密 / 解密:
- 加密:用公钥 Q 生成共享密钥 kQ,结合对称密钥算法(如 AES)加密数据。
- 解密:用私钥 d 计算 d×kG=kQ,还原共享密钥。
特点:
- 优点:相同安全强度下,密钥长度比 RSA 短(如 256 位 ECC ≈ 3072 位 RSA),效率更高,适合移动设备和嵌入式系统。
- 缺点:数学原理复杂,实现难度较高。
- 应用场景:
- TLS 1.3 及现代加密协议的首选算法(如 ECDHE 密钥交换)。
- 比特币、以太坊等区块链的地址生成和签名。
- 数字签名(ECDSA,椭圆曲线数字签名算法)。
为什么非对称算法在 TLS 中这样用?
- RSA:历史兼容性强,用于证书签名和预主密钥加密,但因效率低,新场景优先选 ECC。
- ECC/ECDHE:短密钥、高安全性、高效率,成为 TLS 1.3 及后续的核心(如 Chrome 81+ 默认优先 ECC)。
- 非对称算法的核心价值在于 安全交换对称密钥 和 验证身份(数字签名),而大量数据的加密解密仍依赖对称算法(如 AES),两者结合实现了 “安全” 与 “效率” 的平衡。
总结:HTTPS 如何同时实现「可靠、安全、高效」?
- 可靠性:TCP 三次握手与四次挥手,确保连接建立与释放的有序性,重传机制保证数据不丢失。
- 安全性:
- 身份认证:数字证书验证服务器身份,防止中间人冒充。
- 数据加密:握手阶段用非对称加密协商密钥,传输阶段用对称加密提升效率,结合前向保密防止密钥泄露后的历史数据破解。
- 完整性校验:哈希算法与 MAC 码确保数据未被篡改。
- 效率优化:
- 会话重用(Session ID 或 Session Ticket):避免重复完整握手,减少延迟。
- TLS 1.3 与 ALPN/SNI 扩展:减少 RTT 次数,支持多域名与协议协商。