HTTP 和 HTTPS 详解:工作原理、通信流程、使用方法及核心区别 本文将深入浅出地讲解 HTTP 和 HTTPS 的工作原理、通信流程、实际使用方法以及两者的核心区别。无论你是前端开发者、后端工程师还是网络安全爱好者这篇文章都能帮你建立完整的知识体系。目录一、什么是 HTTP二、什么是 HTTPS三、HTTP 工作原理与通信流程四、HTTPS 工作原理与通信流程五、SSL/TLS 握手详解六、HTTP 与 HTTPS 的核心区别七、实际使用方法八、常见问题与最佳实践九、总结一、什么是 HTTPHTTPHyperText Transfer Protocol超文本传输协议是互联网上应用最广泛的网络协议用于在客户端浏览器和服务器之间传输超文本HTML、图片、视频等。核心特征特征说明无状态每次请求独立服务器不记住之前的请求明文传输数据不加密任何人可截获阅读基于请求/响应客户端发起请求服务器返回响应默认端口80HTTP 版本演进HTTP/0.9 (1991) → HTTP/1.0 (1996) → HTTP/1.1 (1997) → HTTP/2 (2015) → HTTP/3 (2022)版本关键特性HTTP/1.0引入 Header、状态码、Content-TypeHTTP/1.1持久连接、管道化、Host 头HTTP/2多路复用、头部压缩、服务器推送、二进制帧HTTP/3基于 QUICUDP、0-RTT 建连、更好的移动支持二、什么是 HTTPSHTTPSHyperText Transfer Protocol Secure是在 HTTP 基础上加入了SSL/TLS 加密层的安全协议。核心特征特征说明加密传输数据经过加密无法被窃听身份验证通过证书验证服务器身份完整性保护数据无法被篡改默认端口443HTTPS HTTP SSL/TLS┌─────────────────────────────────┐ │ 应用层 │ │ ┌───────────────────────────┐ │ │ │ HTTP 协议 │ │ │ ├───────────────────────────┤ │ │ │ SSL/TLS 加密层 │ │ │ ├───────────────────────────┤ │ │ │ TCP 传输层 │ │ │ ├───────────────────────────┤ │ │ │ IP 网络层 │ │ │ └───────────────────────────┘ │ └─────────────────────────────────┘[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-972ZZ347-1785588519479)(https://www.cloudflare.com/img/learning/ssl/what-is-ssl/tls-ssl-layers.png)]三、HTTP 工作原理与通信流程3.1 HTTP 请求/响应模型客户端浏览器 服务器 │ │ │ ① 建立 TCP 连接三次握手 │ │ ───────────────────────────► │ │ ◄─────────────────────────── │ │ ───────────────────────────► │ │ │ │ ② 发送 HTTP 请求 │ │ ───────────────────────────► │ │ │ │ ③ 服务器处理并返回响应 │ │ ◄─────────────────────────── │ │ │ │ ④ 关闭连接或保持连接 │ │ ───────────────────────────► │3.2 TCP 三次握手在发送 HTTP 请求之前客户端和服务器需要先建立 TCP 连接客户端 服务器 │ │ │ ── SYN (seqx) ──────► │ ① 客户端发起连接请求 │ │ │ ◄── SYNACK (seqy, │ ② 服务器确认并回应 │ ackx1) ──────── │ │ │ │ ── ACK (acky1) ───► │ ③ 客户端确认 │ │ │ 连接建立开始传输 │3.3 HTTP 请求报文结构GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html,application/xhtmlxml Accept-Language: zh-CN,zh;q0.9,en;q0.8 Accept-Encoding: gzip, deflate, br Connection: keep-alive Cookie: session_idabc123; themedark3.4 HTTP 响应报文结构HTTP/1.1 200 OK Date: Mon, 21 Jul 2025 08:00:00 GMT Content-Type: text/html; charsetUTF-8 Content-Length: 1234 Server: nginx/1.24.0 Cache-Control: max-age3600 Set-Cookie: session_idabc123; HttpOnly !DOCTYPE html html headtitleExample/title/head bodyh1Hello, World!/h1/body /html3.5 常见 HTTP 方法方法用途是否有请求体是否幂等GET获取资源❌✅POST提交数据✅❌PUT全量更新✅✅PATCH部分更新✅❌DELETE删除资源❌✅HEAD获取头部❌✅OPTIONS预检请求❌✅3.6 常见 HTTP 状态码1xx 信息性状态码 100 Continue 继续 101 Switching Protocols 切换协议 2xx 成功 200 OK 请求成功 201 Created 资源已创建 204 No Content 无内容 3xx 重定向 301 Moved Permanently 永久重定向 302 Found 临时重定向 304 Not Modified 未修改使用缓存 4xx 客户端错误 400 Bad Request 请求格式错误 401 Unauthorized 未认证 403 Forbidden 无权限 404 Not Found 资源不存在 429 Too Many Requests 请求过于频繁 5xx 服务器错误 500 Internal Server Error 服务器内部错误 502 Bad Gateway 网关错误 503 Service Unavailable 服务不可用3.7 使用 curl 发送 HTTP 请求# GET 请求curl-vhttp://httpbin.org/get# POST 请求curl-XPOST http://httpbin.org/post\-HContent-Type: application/json\-d{username:admin,password:123456}# 带 Cookiecurl-bsessionabc123http://httpbin.org/cookies# 查看详细通信过程curl-vhttp://httpbin.org/get21输出示例* Trying54.175.129.45:80... * Connected to httpbin.org(54.175.129.45)port80GET /get HTTP/1.1Host: httpbin.orgUser-Agent: curl/8.1.0Accept: */*HTTP/1.1200OKContent-Type: application/jsonContent-Length:261{args:{},headers:{Host:httpbin.org,User-Agent:curl/8.1.0},origin:203.0.113.50,url:http://httpbin.org/get}3.8 Python 发送 HTTP 请求importrequests# GET 请求responserequests.get(http://httpbin.org/get)print(response.status_code)# 200print(response.headers)# 响应头print(response.json())# JSON 响应体# POST 请求data{username:admin,password:123456}responserequests.post(http://httpbin.org/post,jsondata)print(response.json())# 带自定义 Headerheaders{User-Agent:MyApp/1.0,Authorization:Bearer token123}responserequests.get(http://httpbin.org/headers,headersheaders)print(response.json())# 会话管理自动处理 Cookiesessionrequests.Session()session.get(http://httpbin.org/cookies/set/name/zhangsan)responsesession.get(http://httpbin.org/cookies)print(response.json())# {cookies: {name: zhangsan}}四、HTTPS 工作原理与通信流程4.1 HTTPS 整体流程客户端 服务器 │ │ │ ① TCP 三次握手 │ │ ──────────────────────────────────────► │ │ ◄────────────────────────────────────── │ │ ──────────────────────────────────────► │ │ │ │ ② TLS 握手详见第五章 │ │ ───── Client Hello ─────────────────► │ │ ◄──── Server Hello 证书 ──────────── │ │ ───── 密钥交换 ──────────────────────► │ │ ◄──── 握手完成 ─────────────────────── │ │ │ │ ③ 加密的 HTTP 请求/响应 │ │ ════════════════════════════════════► │ │ ◄════════════════════════════════════ │ │ ═══ 表示加密通道 │4.2 HTTPS 加密原理HTTPS 采用混合加密机制结合了对称加密和非对称加密的优点┌─────────────────────────────────────────────┐ │ HTTPS 加密体系 │ ├─────────────────────────────────────────────┤ │ │ │ 非对称加密RSA/ECC │ │ ┌──────────┐ ┌──────────┐ │ │ │ 公钥 │ ◄─────► │ 私钥 │ │ │ │ 可公开 │ │ 仅服务端 │ │ │ └──────────┘ └──────────┘ │ │ │ │ │ │ │ 用于协商对称密钥 │ │ │ │ 速度慢 │ │ │ ▼ ▼ │ │ 对称加密AES-256-GCM │ │ ┌──────────────────────────────┐ │ │ │ 会话密钥双方共享 │ │ │ │ 用于加密实际通信数据 │ │ │ │ 速度快 │ │ │ └──────────────────────────────┘ │ │ │ └─────────────────────────────────────────────┘4.3 数字证书工作原理┌─────────── 证书颁发流程 ───────────┐ │ │ │ 网站运营者 │ │ │ │ │ │ ① 生成密钥对 CSR │ │ ▼ │ │ CA 机构如 Lets Encrypt │ │ │ │ │ │ ② 验证域名所有权 │ │ │ ③ 签发证书 │ │ ▼ │ │ 数字证书包含 │ │ ├── 网站公钥 │ │ ├── 域名信息 │ │ ├── 有效期 │ │ ├── 颁发机构 │ │ └── CA 的数字签名 │ │ │ └─────────────────────────────────────┘[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBeCaczy-1785588519480)(https://www.ssl.com/wp-content/uploads/2017/09/certificate-structure.png)]4.4 使用 curl 发送 HTTPS 请求# 基本 HTTPS 请求curlhttps://www.baidu.com# 查看 TLS 握手过程curl-vhttps://www.baidu.com21|grep-ESSL|TLS|certificate# 查看服务器证书详情curl-vIhttps://www.baidu.com21|grep-A5SSL certificate# 跳过证书验证仅测试用生产环境禁止curl-khttps://self-signed.example.com# 指定 TLS 版本curl--tlsv1.3https://www.baidu.com输出示例* TLSv1.3(IN), TLS handshake, Server hello(2): * TLSv1.3(IN), TLS handshake, Encrypted Extensions(8): * TLSv1.3(IN), TLS handshake, Certificate(11): * TLSv1.3(IN), TLS handshake, Certificate Verify(15): * TLSv1.3(IN), TLS handshake, Finished(20): * TLSv1.3(OUT), TLS handshake, Finished(20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * Server certificate: * subject:CNwww.baidu.com * start date: Jul100:00:002025GMT * expire date: Aug1523:59:592026GMT * issuer:CUS;ODigiCert;CNDigiCert SHA2 Secure Server CA4.5 Python 发送 HTTPS 请求importrequestsimportsslimportsocketfromdatetimeimportdatetime# 基本 HTTPS 请求responserequests.get(https://www.baidu.com)print(f状态码:{response.status_code})print(f协议:{response.url})# 查看服务器证书信息defget_cert_info(hostname,port443):contextssl.create_default_context()withsocket.create_connection((hostname,port))assock:withcontext.wrap_socket(sock,server_hostnamehostname)asssock:certssock.getpeercert()print(f域名:{cert[subject][0][0][1]})print(f颁发者:{cert[issuer][0][0][1]})print(f有效期至:{cert[notAfter]})print(fTLS 版本:{ssock.version()})print(f加密套件:{ssock.cipher()[0]})get_cert_info(www.baidu.com)输出状态码: 200 协议: https://www.baidu.com/ 域名: www.baidu.com 颁发者: DigiCert SHA2 Secure Server CA 有效期至: Aug 15 23:59:59 2026 GMT TLS 版本: TLSv1.3 加密套件: TLS_AES_256_GCM_SHA384五、SSL/TLS 握手详解5.1 TLS 1.2 握手2-RTT客户端 服务器 │ │ │ ──── Client Hello ──────────────────────► │ │ - 支持的 TLS 版本 │ │ - 支持的加密套件列表 │ │ - 客户端随机数 (Client Random) │ │ │ │ ◄──── Server Hello ───────────────────── │ │ - 选定的 TLS 版本 │ │ - 选定的加密套件 │ │ - 服务器随机数 (Server Random) │ │ │ │ ◄──── Certificate ────────────────────── │ │ - 服务器证书含公钥 │ │ │ │ ◄──── Server Hello Done ──────────────── │ │ │ │ ──── Client Key Exchange ──────────────► │ │ - 预主密钥用服务器公钥加密 │ │ │ │ ──── Change Cipher Spec ───────────────► │ │ ──── Finished ─────────────────────────► │ │ │ │ ◄──── Change Cipher Spec ─────────────── │ │ ◄──── Finished ──────────────────────── │ │ │ │ ═══ 加密通信开始 ═══ │会话密钥计算主密钥 PRF(预主密钥, master secret, Client Random Server Random) 会话密钥 PRF(主密钥, key expansion, Server Random Client Random)5.2 TLS 1.3 握手1-RTT客户端 服务器 │ │ │ ──── Client Hello ──────────────────────► │ │ - 支持的加密套件 │ │ - 密钥共享扩展含公钥 │ │ - 客户端随机数 │ │ │ │ ◄──── Server Hello ──────────────────── │ │ ◄──── Encrypted Extensions ──────────── │ │ ◄──── Certificate ───────────────────── │ │ ◄──── Certificate Verify ────────────── │ │ ◄──── Finished ──────────────────────── │ │ │ │ ──── Finished ─────────────────────────► │ │ │ │ ═══ 加密通信开始仅 1 个 RTT═══ │5.3 TLS 1.2 vs TLS 1.3 对比特性TLS 1.2TLS 1.3握手延迟2-RTT1-RTT0-RTT❌✅ 支持密钥交换RSA / DHE / ECDHE仅 ECDHE加密套件375 个前向保密可选强制安全性中等更高5.4 Node.js 实现 TLS 握手抓包consttlsrequire(tls);constcryptorequire(crypto);constoptions{host:www.baidu.com,port:443,servername:www.baidu.com,};constsockettls.connect(options,(){console.log(TLS 版本:,socket.getProtocol());console.log(加密套件:,socket.getCipher().name);console.log(是否已授权:,socket.authorized);constcertsocket.getPeerCertificate();console.log(证书域名:,cert.subject.CN);console.log(颁发机构:,cert.issuer.CN);console.log(有效期至:,cert.valid_to);// 发送 HTTP 请求socket.write(GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n);});socket.on(data,(data){console.log(响应:,data.toString().substring(0,200));socket.end();});六、HTTP 与 HTTPS 的核心区别6.1 一览表对比维度HTTPHTTPS安全性❌ 明文传输✅ 加密传输默认端口80443协议前缀http://https://证书不需要需要 SSL/TLS 证书加密方式无对称加密 非对称加密性能较快握手阶段略慢传输阶段差异不大SEO无优势Google 优先收录费用免费证书可免费Let’s Encrypt数据完整性❌ 可被篡改✅ 不可篡改身份验证❌ 无✅ 证书验证服务器身份6.2 安全性对比图HTTP 通信不安全 ┌────────┐ 明文数据 ┌────────┐ │ 客户端 │ ──────────── │ 服务器 │ └────────┘ └────────┘ ↕ ↕ ┌───────┐ 可被截获/篡改 ┌───────┐ │ 攻击者 │ ←──────────→ │ 攻击者 │ └───────┘ └───────┘ HTTPS 通信安全 ┌────────┐ 加密数据 ┌────────┐ │ 客户端 │ ════════════ │ 服务器 │ └────────┘ └────────┘ ↕ ↕ ┌───────┐ 无法解密 ┌───────┐ │ 攻击者 │ ✗✗✗✗✗✗✗✗✗✗✗ │ 攻击者 │ └───────┘ └───────┘6.3 性能对比HTTP 请求耗时分解 DNS → TCP握手(1RTT) → HTTP请求/响应 → 总计 ≈30ms ≈80ms HTTPS (TLS 1.2) 请求耗时分解 DNS → TCP握手(1RTT) → TLS握手(2RTT) → HTTP请求/响应 → 总计 ≈30ms ≈60ms ≈140ms HTTPS (TLS 1.3) 请求耗时分解 DNS → TCP握手(1RTT) → TLS握手(1RTT) → HTTP请求/响应 → 总计 ≈30ms ≈30ms ≈110ms 现代硬件上HTTPS 的加密/解密开销几乎可以忽略。TLS 1.3 的性能已经非常接近 HTTP。6.4 Wireshark 抓包对比HTTP 抓包明文可见Frame 1: GET /login?useradminpass123456 HTTP/1.1 ↑ 用户名密码完全暴露HTTPS 抌包加密不可读Frame 1: Application Data: 17 03 03 00 25 a8 3f ... ↑ 完全无法看到原始内容七、实际使用方法7.1 Nginx 配置 HTTPSserver { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name example.com; # SSL 证书 ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # TLS 配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; # 安全头 add_header Strict-Transport-Security max-age63072000 always; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options DENY; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; } }7.2 Let’s Encrypt 免费证书# 安装 certbotsudoaptinstallcertbot python3-certbot-nginx# 自动获取并配置证书sudocertbot--nginx-dexample.com-dwww.example.com# 手动获取证书sudocertbot certonly--standalone-dexample.com# 查看证书信息sudocertbot certificates# 自动续期certbot 会自动设置 cronsudocertbot renew --dry-run7.3 Node.js Express 配置 HTTPSconstexpressrequire(express);consthttpsrequire(https);constfsrequire(fs);constappexpress();app.get(/,(req,res){res.send(Hello, HTTPS!);});// 读取证书constoptions{key:fs.readFileSync(/etc/ssl/private/privkey.pem),cert:fs.readFileSync(/etc/ssl/certs/fullchain.pem),};// 启动 HTTPS 服务器https.createServer(options,app).listen(443,(){console.log(HTTPS server running on port 443);});7.4 Python Flask 配置 HTTPSfromflaskimportFlask appFlask(__name__)app.route(/)defhello():returnHello, HTTPS!if__name____main__:# 开发环境使用自签名证书app.run(host0.0.0.0,port443,ssl_context(cert.pem,key.pem))7.5 生成自签名证书开发测试用# 生成私钥openssl genrsa-outserver.key2048# 生成证书签名请求CSRopenssl req-new-keyserver.key-outserver.csr\-subj/CCN/STBeijing/LBeijing/ODev/CNlocalhost# 生成自签名证书有效期365天openssl x509-req-days365-inserver.csr\-signkeyserver.key-outserver.crt# 一步生成开发用openssl req-x509-newkeyrsa:2048-keyoutkey.pem-outcert.pem\-days365-nodes-subj/CNlocalhost八、常见问题与最佳实践8.1 HTTP → HTTPS 迁移检查清单✅ 申请 SSL 证书Lets Encrypt 免费 ✅ 配置 Nginx/Apache 监听 443 端口 ✅ 设置 301 重定向HTTP → HTTPS ✅ 更新所有内部链接为 https:// ✅ 修复混合内容Mixed Content问题 ✅ 更新 CDN 配置支持 HTTPS ✅ 设置 HSTS 安全头 ✅ 启用 OCSP Stapling ✅ 更新 sitemap.xml 和 robots.txt ✅ 测试所有页面和 API8.2 常见安全头配置# 强制 HTTPS有效期2年 add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload; # 防止 MIME 类型嗅探 add_header X-Content-Type-Options nosniff; # 防止点击劫持 add_header X-Frame-Options DENY; # XSS 防护 add_header X-XSS-Protection 1; modeblock; # 内容安全策略 add_header Content-Security-Policy default-src self; script-src self unsafe-inline; # 引用来源策略 add_header Referrer-Policy strict-origin-when-cross-origin;8.3 混合内容问题!-- ❌ 错误HTTP 页面中引用 HTTPS 资源不会出问题 --!-- ❌ 错误HTTPS 页面中引用 HTTP 资源会被浏览器阻止 --!-- 混合内容示例会被浏览器阻止--imgsrchttp://example.com/image.pngscriptsrchttp://cdn.example.com/lib.js/script!-- ✅ 正确使用 HTTPS 或相对协议 --imgsrchttps://example.com/image.pngimgsrc//example.com/image.png!-- 自动跟随页面协议 --imgsrc/local/image.png!-- 相对路径 --8.4 HTTP/2 与 HTTPS# HTTP/2 通常需要 HTTPS server { listen 443 ssl http2; # 启用 HTTP/2 # ... } # 检查是否启用了 HTTP/2 curl -sI -o /dev/null -w %{http_version} https://www.baidu.com # 输出: 2九、总结核心要点┌─────────────────────────────────────────────────┐ │ HTTP vs HTTPS │ ├─────────────────────────────────────────────────┤ │ │ │ HTTP: 明文 → 快 → 不安全 → 端口80 │ │ HTTPS: 加密 → 略慢 → 安全 → 端口443 │ │ │ │ HTTPS HTTP SSL/TLS │ │ │ │ 加密方式 │ │ • 非对称加密 → 协商密钥RSA/ECC │ │ • 对称加密 → 传输数据AES │ │ • 哈希算法 → 验证完整性SHA-256 │ │ │ │ TLS 1.3: 1-RTT 握手强制前向保密 │ │ │ │ 现代 Web必须使用 HTTPS │ │ • 浏览器标记 HTTP 为不安全 │ │ • Google 搜索排名优先 HTTPS │ │ • Lets Encrypt 免费证书 │ │ │ └─────────────────────────────────────────────────┘一句话总结HTTP 是明信片谁都能看HTTPS 是密封信只有收件人能拆。在今天的互联网上使用 HTTPS 不是可选项而是必选项。参考资料RFC 9110 - HTTP SemanticsRFC 8446 - TLS 1.3MDN Web Docs - HTTPLet’s EncryptSSL Labs Server TestCloudflare Learning Center - SSL本文最后更新2025年7月