HTTP和HTTPS

概念

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网中最核心的应用层协议,用于客户端(如浏览器、APP)与服务器之间的资源传输(如网页、图片、接口数据等)

协议定位

属于 TCP/IP 协议栈的应用层协议,基于传输层的 TCP 协议(HTTP/3 基于 UDP,但主流仍为 HTTP/1.1 和 HTTP/2)。

核心作用:定义客户端与服务器之间的 "通信规则",包括请求格式、响应格式、资源定位、状态管理等。

核心特性

无状态:协议本身不记录客户端的历史请求状态(每次请求都是独立的),需通过 Cookie、Session 等机制实现状态保持。

无连接(HTTP/1.0 特性):默认短连接,每次请求后关闭 TCP 连接;HTTP/1.1 引入 keep-alive 支持长连接,复用 TCP 连接减少开销。

媒体无关:可传输任意类型数据(文本、图片、视频等),通过 Content-Type 字段标识数据类型。

基于请求 - 响应模型:客户端主动发起请求,服务器被动响应,无服务器主动推送(HTTP/2 支持服务器推送,HTTP/1.1 不支持)。

HTTP 协议版本演进(重点对比)

HTTP 版本对比

版本 核心特性 优势与不足
HTTP/1.0 • 短连接(默认关闭 TCP 连接) • 无管线化 • 头部不压缩 优势: • 简单易实现 不足: • 连接开销大 • 并发性能差(同一域名最多同时建立 6 个 TCP 连接)
HTTP/1.1 • 长连接(keep-alive 默认开启) • 管线化(批量发送请求) • 支持 Chunked 编码 优势: • 解决 HTTP/1.0 的连接开销问题 不足: • 头部冗余大 • 管线化支持有限(需服务器配合)
HTTP/2 • 二进制帧传输 • 多路复用(同一 TCP 连接并发传输多个请求) • 头部压缩 • 服务器推送 优势: • 并发性能大幅提升 • 减少带宽占用 • 兼容 HTTP/1.1 语义,无需修改业务代码
HTTP/3 • 基于 UDP 协议(QUIC 协议) • 0-RTT 握手 • 更强的拥塞控制 优势: • 解决 TCP 队头阻塞问题 • 弱网环境下性能更优 现状: • 目前支持度逐步提升(如 Chrome、Nginx)

复习重点:HTTP/1.1 是目前最主流的版本,需掌握其长连接、管线化等核心优化;HTTP/2 的多路复用和头部压缩是关键升级点。

HTTP 请求格式(Request)

HTTP 请求由 请求行、请求头部、空行、请求正文 四部分组成(空行是请求头部与正文的分隔符,不可省略)。

请求行(Request Line)

格式:请求方法 + 资源路径 + 协议版本 + \r\n

请求方法:表示客户端对服务器的操作意图,核心方法如下:

HTTP 请求方法对比

方法 作用 特点
GET 请求获取服务器资源(如网页、图片) • 无请求正文 • 参数拼接在 URL 中(长度有限制,约 2KB) • 幂等(多次请求结果一致)
POST 向服务器提交数据(如表单提交、接口请求) • 有请求正文 • 参数在正文中(无长度限制) • 非幂等(多次提交可能产生不同结果)
PUT 向服务器上传资源(全量更新) • 幂等 • 如更新用户信息(全量覆盖)
DELETE 请求删除服务器资源 • 幂等 • 如删除文件
HEAD 类似 GET,但仅返回响应头部,不返回正文(用于检查资源是否存在、获取文件大小) • 无正文 • 响应格式与 GET 一致
OPTIONS 询问服务器支持的请求方法、头部等信息(跨域请求预检常用) • 用于跨域预检请求 • 获取服务器支持的HTTP方法

资源路径:客户端请求的服务器资源地址(如 /index.html、/api/user),可包含查询参数(如 /?id=1&name=test)。

协议版本:如 HTTP/1.1、HTTP/2。

示例请求行:GET /index.html?name=test HTTP/1.1\r\n

请求头部(Request Headers)

键值对格式(Key: Value\r\n),用于传递请求的附加信息(如客户端类型、正文类型、连接方式等),核心头部如下:

HTTP 头部字段说明

头部字段 作用 示例
Host 指定服务器域名和端口(HTTP/1.1 必选头部) Host: www.example.com:8080
Connection 指定连接类型(长连接 / 短连接) Connection: keep-alive(长连接)
Content-Type 指定请求正文的媒体类型(POST 请求必选) application/json(JSON 数据) multipart/form-data(文件上传)
Content-Length 指定请求正文的长度(字节数) Content-Length: 1024
User-Agent 标识客户端类型(浏览器、APP 等),服务器可据此返回适配内容 Mozilla/5.0 (Windows NT 10.0; ...)
Accept 客户端可接收的响应数据类型 Accept: text/html,application/json
Cookie 客户端存储的会话信息(用于状态保持) Cookie: sessionId=abc123

请求正文(Request Body)

可选部分,仅 POST、PUT 等方法需要(GET、HEAD 无正文)。

内容格式由 Content-Type 决定,常见类型:

表单数据:application/x-www-form-urlencoded(如 name=test&age=20)。

JSON 数据:application/json(如 {"name":"test","age":20})。

文件上传:multipart/form-data(含文件二进制数据和表单字段)。

完整请求示例(POST)

复制代码
POST /api/user HTTP/1.1\r\n
Host: www.example.com\r\n
Connection: keep-alive\r\n
Content-Type: application/json\r\n
Content-Length: 30\r\n
User-Agent: Mozilla/5.0\r\n
\r\n
{"name":"test","age":20}

HTTP 响应格式(Response)

HTTP 响应由 状态行、响应头部、空行、响应正文 四部分组成,与请求格式对称。

状态行(Status Line)

格式:协议版本 + 状态码 + 状态描述 + \r\n

协议版本:与请求版本一致(如 HTTP/1.1)。

HTTP 状态码详解

状态码范围 类别 核心含义 常见状态码及说明
1xx 信息响应 服务器已接收请求,需继续处理 100 Continue :客户端需发送剩余请求 • 101 Switching Protocol:切换协议,如 HTTP/2
2xx 成功响应 请求已成功处理 200 OK :请求成功 • 204 No Content :成功无返回正文 • 206 Partial Content:分片下载
3xx 重定向 需客户端进一步操作 301 Moved Permanently :永久重定向,如域名变更 • 302 Found :临时重定向 • 304 Not Modified:资源未修改,使用缓存
4xx 客户端错误 客户端请求有误 400 Bad Request :请求参数错误 • 401 Unauthorized :未授权,需登录 • 403 Forbidden :禁止访问 • 404 Not Found:资源不存在
5xx 服务器错误 服务器处理失败 500 Internal Server Error :服务器内部错误 • 502 Bad Gateway :网关错误 • 503 Service Unavailable :服务过载 • 504 Gateway Timeout:网关超时

状态描述:状态码对应的英文描述(如 200→OK,404→Not Found)。

示例状态行:HTTP/1.1 200 OK\r\n

响应头部(Response Headers)

键值对格式,传递响应的附加信息(如服务器类型、正文类型、缓存策略等),核心头部如下:

HTTP 响应头部字段说明

头部字段 作用 示例
Server 标识服务器软件类型 Server: Nginx/1.21.0
Content-Type 指定响应正文的媒体类型(客户端据此解析) text/html; charset=utf-8(网页) image/jpeg(图片)
Content-Length 指定响应正文的长度 Content-Length: 2048
Content-Encoding 指定响应正文的压缩方式(如 gzip) Content-Encoding: gzip
Set-Cookie 服务器向客户端设置 Cookie(用于状态保持) Set-Cookie: sessionId=abc123; Path=/
Cache-Control 指定响应的缓存策略(如是否可缓存、缓存时长) Cache-Control: max-age=3600(缓存 1 小时)
Location 重定向目标地址(3xx 状态码必含) Location: https://new.example.com

响应正文(Response Body)

服务器返回的核心数据(如网页 HTML、JSON 接口数据、图片二进制等)。

格式由 Content-Type 决定,与请求正文对应(如客户端请求 application/json,响应正文为 JSON 字符串)。

完整响应示例

复制代码
HTTP/1.1 200 OK\r\n
Server: Nginx/1.21.0\r\n
Content-Type: application/json; charset=utf-8\r\n
Content-Length: 25\r\n
Cache-Control: max-age=3600\r\n
\r\n
{"code":0,"msg":"success"}

HTTP 核心机制

长连接与短连接(HTTP/1.1 关键优化)

短连接(HTTP/1.0 默认):每次请求建立 TCP 连接,处理完响应后关闭连接。

缺点:频繁建立 / 关闭 TCP 连接(三次握手、四次挥手),开销大。


长连接(HTTP/1.1 默认):通过 Connection: keep-alive 启用,TCP 连接在处理完多个请求后才关闭(默认超时时间约 60 秒)。

优势:减少连接开销,提升并发性能;同一域名最多同时保持 6 个长连接(浏览器限制)。

缓存机制(减少重复请求,提升性能)

HTTP 缓存分为 强缓存 和 协商缓存,通过响应头部控制:

强缓存:客户端直接使用本地缓存,不向服务器发起请求。

相关头部:Cache-Control: max-age=3600(缓存 1 小时)、Expires: Wed, 21 Oct 2025 07:28:00 GMT(过期时间)。

优先级:Cache-Control > Expires(Expires 依赖客户端时间,可能不准)。

协商缓存:客户端先向服务器询问缓存是否有效,有效则使用缓存(304 响应),无效则返回新数据(200 响应)。

相关头部:Last-Modified(资源最后修改时间)+ If-Modified-Since(客户端询问是否修改);ETag(资源唯一标识)+ If-None-Match(客户端询问标识是否变化)。

跨域资源共享(CORS)

问题:浏览器的 "同源策略" 限制不同域名、端口、协议的客户端向服务器发起请求(如 http://a.com 不能直接请求 http://b.com 的接口)。

解决:服务器通过响应头部开启 CORS:

Access-Control-Allow-Origin: *(允许所有域名跨域)。

Access-Control-Allow-Methods: GET,POST(允许的请求方法)。

Access-Control-Allow-Headers: Content-Type(允许的请求头部)。

预检请求:复杂跨域请求(如 POST 带 JSON 正文、自定义头部)会先发送 OPTIONS 请求,询问服务器是否允许跨域。

Cookie:客户端存储的小型文本数据(由服务器通过 Set-Cookie 设置),每次请求自动携带到服务器。

特点:大小限制约 4KB,可设置过期时间(Expires 或 Max-Age),支持跨域名隔离。

Session:服务器端存储的会话数据(如用户登录状态),通过 Cookie 中的 sessionId 关联客户端。

特点:数据存储在服务器(更安全),无大小限制,会话过期后自动销毁。

关系:Cookie 是 Session 的 "载体",客户端通过 Cookie 传递 sessionId,服务器据此识别用户身份。

复习重点总结

协议结构:请求 / 响应的四部分组成,核心头部字段的作用。

状态码:5 大类状态码的含义,常见状态码(200、301、302、304、400、401、403、404、500、502)的使用场景。

版本差异:HTTP/1.1 与 HTTP/2 的核心优化(长连接、多路复用)。

核心机制:长连接、缓存(强缓存 vs 协商缓存)、CORS、Cookie/Session。

请求方法:GET 与 POST 的区别(参数位置、长度限制、幂等性)。

HTTPS

HTTPS(HyperText Transfer Protocol Secure)是 HTTP 协议的安全版本,核心是在 HTTP 与 TCP 之间增加了 TLS/SSL 加密层,解决 HTTP 明文传输的安全隐患(窃听、篡改、伪造)。

HTTPS 核心技术解析

HTTPS 的核心定位与解决的问题

核心定位

  • 本质:HTTPS = HTTP + TLS/SSL(TLS 是 SSL 的升级版,目前主流为 TLS 1.2/1.3)
  • 底层依赖:基于 TCP 协议(TLS 握手需先建立 TCP 连接),端口为 443(HTTP 为 80)

解决 HTTP 的三大安全问题

  • 窃听风险:HTTP 明文传输,数据可能被中间网络设备(如路由器)窃取(如账号密码、支付信息)
  • 篡改风险:数据传输过程中可能被篡改(如修改订单金额、替换网页内容)
  • 伪造风险:攻击者可能伪造服务器身份,诱导客户端连接虚假服务器(如钓鱼网站)

HTTPS 的核心安全机制(TLS/SSL 加密原理)

TLS/SSL 采用"对称加密 + 非对称加密 + 数字证书"混合方案,兼顾安全性和传输效率:

对称加密(用于传输数据加密)

定义 :加密和解密使用同一把密钥(如 AES 算法)
优势 :加密速度极快,适合海量数据传输(如 HTTP 正文、图片等)
缺点:密钥需在客户端和服务器之间传递,直接传递易被窃取

2. 非对称加密(用于密钥协商)

定义 :使用一对"公钥 - 私钥",公钥公开(可被任何人获取),私钥保密(仅服务器持有)
特性 :公钥加密的数据,仅私钥能解密;私钥加密的数据,仅公钥能解密
优势 :无需传递密钥,仅需交换公钥,安全性高(如 RSA、ECC 算法)
缺点:加密速度慢,不适合海量数据传输

3. 数字证书(用于身份验证)

定义 :由权威 CA(Certificate Authority,证书颁发机构)颁发的"服务器身份凭证"
包含内容 :服务器公钥、服务器域名、证书有效期、CA 签名等信息
作用:证明服务器身份合法性,防止"公钥伪造"(攻击者无法伪造 CA 签名的证书)

4. 混合方案工作逻辑

非对称加密 安全传递"对称加密的密钥"(避免密钥被窃听)

对称加密 传输后续所有 HTTP 数据(保证传输效率)

数字证书验证服务器身份(避免连接伪造服务器)

HTTPS 完整工作流程(TLS 握手 + HTTP 传输)

以主流的 TLS 1.2 为例,核心分为 "TLS 握手""HTTP 数据传输" 两步:

第一步:TLS 握手(核心是安全协商密钥和验证身份)

关键结论 :握手完成后,客户端和服务器持有相同的会话密钥,且全程未明文传输密钥(安全)。

第二步:HTTP 数据传输

客户端将 HTTP 请求(如 GET /index.html)用**会话密钥(对称加密)**加密后,通过 TCP 发送给服务器

服务器用相同的会话密钥解密,处理请求后,将 HTTP 响应(如 HTML 内容)加密后返回

后续所有数据都通过会话密钥加密传输,直到连接关闭

TLS 1.3 的优化

握手流程简化 :仅需 1 个往返(TLS 1.2 需 2 个往返)
0-RTT 握手 :首次连接后二次连接可跳过部分步骤,速度更快
安全性提升 :移除不安全加密套件
传输效率:进一步提升

HTTPS 与 HTTP 的核心差异

HTTP vs HTTPS 详细对比

特性 HTTP HTTPS
安全性 明文传输,无加密、无身份验证 加密传输(TLS),服务器身份验证(证书)
端口 80 端口 443 端口
传输速度 无加密/握手开销,速度快 需 TLS 握手和加密解密,速度略慢(差距已缩小)
资源消耗 服务器/客户端消耗低 服务器/客户端需加密解密,消耗略高
证书要求 无需证书 需 CA 颁发的有效 SSL 证书(免费/付费)
核心用途 普通资源访问(如静态网页) 敏感数据传输(登录、支付、接口)
浏览器标识 无特殊标识 地址栏显示"小锁"图标,URL 前缀为 https

HTTPS 关键细节(复习重点)

证书相关

证书类型

域名型证书(DV) :仅验证域名所有权,免费(如 Let's Encrypt),适合个人网站
企业型证书(OV) :验证企业身份,付费,适合企业官网
增强型证书(EV):最高级别验证,地址栏显示企业名称,适合金融、电商平台

证书状态

证书过期/无效:浏览器会提示"证书无效",阻止用户访问(避免风险)

会话密钥的生命周期

会话密钥仅在当前 TCP 连接有效,连接关闭后密钥失效

长连接(keep-alive)中,同一连接复用会话密钥,无需重复握手

HTTPS 的加密范围

加密内容 :HTTP 请求/响应的全部内容(请求行、头部、正文)
不加密内容:TCP 头部、IP 头部(仅传输层和应用层数据加密)

常见误解

误解 1:HTTPS 是"绝对安全"的?

纠正:HTTPS 能防窃听、篡改、伪造,但无法防范服务器本身被入侵(如服务器私钥泄露)

误解 2:HTTPS 一定比 HTTP 慢很多?

纠正:TLS 1.3 优化后,握手开销大幅降低,加上硬件加密支持,日常使用中速度差距不明显

复习总结

HTTPS 的核心是 "用 TLS/SSL 解决 HTTP 的安全问题",关键记住:

核心方案:对称加密(传数据)+ 非对称加密(传密钥)+ 数字证书(验身份)。

工作流程:先 TLS 握手(协商密钥 + 验身份),再加密传输 HTTP 数据。

核心差异:HTTPS 多了加密和证书,端口 443,适合敏感场景

相关推荐
Ypuyu5 小时前
【GoLang】【框架学习】【GORM】4. 使用 BeforeUpdate hook 操作时,出现反射报错
开发语言·学习·golang
c语言鹌鹑蛋5 小时前
【进程间通信】--- 匿名管道,命名管道
linux
江輕木5 小时前
如何使用宿主机软件共享网络给CentOS 7
linux·运维·服务器
代码一天不写我浑森蓝廋5 小时前
CentOS7 使用 centos-release-scl-rh yum库安装 devtoolset
linux·centos·gcc·devtoolset
刀客Doc5 小时前
刀客doc:亚马逊和谷歌的广告战争,开始打到云上了
网络
ZIM学编程5 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
郁大锤5 小时前
conda虚拟环境占用空间太多,如何清理?
linux·conda
代码AC不AC5 小时前
【C++】哈希表封装实现 unordered_map 和 unordered_set
c++·unordered_map·unordered_set·哈希表封装
咖啡教室5 小时前
每日一个计算机小知识:DHCP
后端·网络协议