HTTP/HTTPS协议工作原理详解:从请求到加密的完整链路

HTTP:超文本传输的基础链路

你在浏览器输入http://www.example.com并回车时,HTTP协议已经开始工作了——它的核心是“请求-响应”模型,本质是客户端(浏览器)向服务器要数据,服务器给数据的过程。

HTTP/HTTPS协议工作原理详解:从请求到加密的完整链路

我们拆解一个真实的HTTP请求流程:
1. 建立TCP连接:HTTP依赖TCP传输数据,所以第一步是客户端和服务器完成“三次握手”(后面会详讲),确认双方能正常通信。
2. 发送HTTP请求:客户端向服务器发送请求报文,结构如下(用curl -v http://www.example.com可以看到真实请求头):

GET /index.html HTTP/1.1  # 请求方法(GET)+ 请求路径(/index.html)+ 协议版本(HTTP/1.1)
Host: www.example.com      # 目标服务器域名(必须项)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36  # 客户端身份(浏览器型号)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  # 客户端能接受的内容类型

3. 服务器处理请求:服务器收到请求后,根据路径找到对应的资源(比如index.html),然后生成响应报文。
4. 返回HTTP响应:响应报文包含状态码、响应头和响应体(比如网页内容),示例:

HTTP/1.1 200 OK  # 协议版本+状态码(200表示成功)+ 状态描述(OK)
Content-Type: text/html; charset=UTF-8  # 响应体的类型(HTML)
Content-Length: 1234  # 响应体的大小(字节)
Date: Sun, 24 Aug 2025 08:47:24 GMT  # 响应时间

<!DOCTYPE html>  # 响应体(HTML内容)
<html>
<head><title>Example</title></head>
<body>Hello World!</body>
</html>

5. 关闭TCP连接:如果是HTTP/1.1的“长连接”(默认开启),连接会保持一段时间供后续请求复用;否则直接断开。

这里有个关键知识点:HTTP是“无状态”协议——服务器不会记住上一次和客户端的通信内容,比如你第一次访问淘宝和第二次访问,服务器默认不知道“你是同一个人”,所以需要Cookie来解决状态问题(比如登录状态保持)。

HTTPS:给HTTP穿上加密的“防弹衣”

HTTP的问题很明显:明文传输——如果有人在网络中间截获请求,能直接看到你的密码、银行卡号等敏感信息。HTTPS就是解决这个问题的——它在HTTP和TCP之间加了一层SSL/TLS加密层(SSL是旧版,TLS是新版,现在常用TLS 1.3)。

我们用“逛淘宝买东西”的场景拆解HTTPS流程:
1. 客户端发起HTTPS请求:你在浏览器输入https://www.taobao.com,浏览器首先向服务器发送“Client Hello”报文,包含:
– 支持的TLS版本(比如TLS 1.3)
– 支持的加密算法(比如AES-256-GCM)
– 一个随机数(Client Random)
2. 服务器回复“Server Hello”:服务器收到请求后,返回:
– 选中的TLS版本和加密算法
– 另一个随机数(Server Random)
服务器证书(包含公钥和CA签名,用来证明服务器身份)
3. 客户端验证证书有效性:浏览器会做3件事:
– 检查证书是否由“可信CA”(比如DigiCert、Let’s Encrypt)颁发;
– 检查证书的有效期(没过期);
– 检查证书的域名是否和当前访问的域名一致(防止“钓鱼网站”)。
如果证书有问题,浏览器会弹出“不安全”提示(比如红锁或者警告页)。
4. 生成会话密钥:验证通过后,客户端生成一个“预主密钥”(Pre-Master Secret),用服务器证书里的公钥加密后发送给服务器。
5. 服务器解密得到预主密钥:服务器用自己的私钥(只有服务器知道)解密,得到预主密钥。
6. 双方生成会话密钥:客户端和服务器用之前的两个随机数(Client Random + Server Random)+ 预主密钥,生成同一个会话密钥(对称加密密钥)。
7. 开始加密通信:接下来的所有HTTP请求和响应,都用这个会话密钥加密——即使被截获,没有会话密钥也无法解密内容。

关键细节:那些容易混淆的“技术卡点”

1. TCP三次握手:HTTP的“通信前提”

HTTP依赖TCP传输数据,所以每次HTTP请求前必须先完成TCP三次握手(建立可靠连接):
第一步:客户端发送SYN报文(“我想和你连接”);
第二步:服务器回复SYN+ACK报文(“我同意连接”);
第三步:客户端发送ACK报文(“我知道了,开始通信吧”)。
为什么要三次?因为要确认“客户端能发、服务器能收”且“服务器能发、客户端能收”——两次握手无法保证双向通信正常。

2. 对称加密 vs 非对称加密:HTTPS的“加密组合拳”

HTTPS没有用单一加密方式,而是结合了两者的优点:
| 加密方式 | 原理 | 优点 | 缺点 | HTTPS中的作用 |
|—————-|——————————-|———————–|———————–|——————————-|
| 对称加密 | 用同一个密钥加密/解密 | 速度快 | 密钥传输不安全 | 加密实际的HTTP数据(高效) |
| 非对称加密 | 公钥加密、私钥解密(反之亦然) | 密钥传输安全 | 速度慢 | 传输对称加密的密钥(安全) |

3. HTTPS的“性能开销”在哪里?

很多人说HTTPS比HTTP慢,主要慢在TLS握手
– 第一次访问时,需要完成证书验证、密钥交换等步骤,大概增加100-500ms延迟;
– 但TLS 1.3优化了握手流程(从“两次往返”变成“一次往返”),且支持“会话复用”(后续访问不用重新握手),所以现在HTTPS的性能开销已经很小了。

用“实战工具”验证原理

你可以用以下命令亲手测试HTTP/HTTPS流程:
看HTTP请求curl -v http://httpbin.org/get(会输出完整的请求头和响应头);
看HTTPS握手curl -v https://httpbin.org/get(会输出TLS握手的细节,比如“SSL connection using TLSv1.3”);
检查证书openssl s_client -connect www.taobao.com:443(会输出服务器证书的详细信息,比如颁发者、有效期)。

常见误区澄清

  • ❌ “HTTPS是100%安全的”:HTTPS能防止“中间人攻击”和“明文窃取”,但如果服务器的私钥泄露,或者CA颁发了虚假证书,还是有风险;
  • ❌ “HTTPS需要付费证书”:Let’s Encrypt提供免费的可信证书(有效期3个月,可自动续期),大部分网站都在用;
  • ❌ “HTTP只能用80端口,HTTPS只能用443端口”:理论上可以改,但默认端口是约定俗成的——浏览器会自动给HTTP加:80,HTTPS加:443

原创文章,作者:,如若转载,请注明出处:https://zube.cn/archives/271

(0)