计算机网络学习(三)——HTTP
一、HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是Web的核心协议,是客户端(如浏览器)与服务器之间进行数据通信的基础。
它是一种基于请求-响应模型的应用层协议,定义了客户端如何向服务器请求资源,以及服务器如何返回响应。
作用:
- 传输超文本(HTML)、图像、音视频、JSON、XML等数据;
- 是浏览器、APP、爬虫等与Web服务器通信的桥梁。
关键特性:
特性名称 | 说明 |
---|---|
无状态(Stateless) | 每次请求独立,服务器不会记录上一次请求的信息,除非借助 Cookie、Session 等机制 |
面向请求-响应(Request/Response) | 客户端发起请求,服务器返回响应,遵循请求-响应模型 |
基于文本(Text-based) | 报文是纯文本格式,易于读取和调试(如GET 、POST 等) |
灵活的媒体类型 | 通过 Content-Type 指定传输数据类型,如HTML 、JSON 、图片等 |
可扩展性强 | 支持多种方法(如PUT 、DELETE ),也支持自定义头部字段 |
连接可复用(HTTP/1.1+) | 支持长连接(Keep-Alive ),多个请求可复用一个 TCP 连接,提升效率 |
无连接(早期 HTTP) | 每个请求完成后就断开连接(HTTP/1.0 的默认行为) |
支持代理、缓存、身份验证等机制 | 可通过中间服务器缓存内容、压缩内容、控制访问 |
支持多种方法 | 如:GET 、POST 、PUT 、DELETE 、HEAD 、OPTIONS 等 |
明文传输(非加密) | 数据不加密,易被中间人监听,通常配合 TLS 使用形成 HTTPS |
注:
- HTTP运行在 TCP/IP 协议栈的应用层。
二、HTTP 协议的发展
(1) HTTP/0.9(1991):
- 仅支持
GET
请求,仅传输 HTML。 - 单行请求,无头部,功能简单。
(2) HTTP/1.0(1996):
- 增加请求方法(
POST
、HEAD
)、状态码和头部。 - 每次请求建立新 TCP 连接,效率较低。
(3) HTTP/1.1(1997):
- 引入
Keep-Alive
,支持连接复用。 - 支持管道化(Pipelining),允许发送多个请求而无需等待响应(但实际应用有限)。
- 增加
Host
头部,支持虚拟主机。
(4) HTTP/2(2015):
- 基于
SPDY
协议,支持二进制分帧,提高效率。 - 多路复用:同一连接上并行处理多个请求。
- 头部压缩(
HPACK
),减少开销。 - 服务器推送:主动向客户端推送资源。
(5) HTTP/3(2022):
- 基于
UDP
和QUIC
协议,取代 TCP,减少连接建立延迟。 - 内置加密,性能更优。
- 解决 TCP 的队头阻塞问题。
三、HTTP 的请求响应模型
(1)请求结构(Request)
请求报文结构:
示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
由三部分组成:
- 请求行(请求方法、URL、HTTP版本);
- 请求头(首部行)(元信息,如浏览器类型、接收数据格式);
- 请求体(实体主体)(
POST
请求时包含的数据)。
注:
请求头与请求体之间需用空行分割。
常见请求方法:
方法 | 作用 |
---|---|
GET | 请求资源(无副作用) |
POST | 提交数据 |
PUT | 更新资源 |
DELETE | 删除资源 |
HEAD | 类似GET但不返回正文 |
OPTIONS | 查询服务器支持的功能 |
(2)响应结构(Response)
响应报文结构:
示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 348<html>...</html>
由三部分组成:
- 状态行(版本、状态码、状态短语);
- 响应头(首部行)(如类型、长度、缓存策略等);
- 响应体(实体主体)(实际返回内容)。
注:
响应头与响应体之间需用空行分割。
常见状态码:
类别 | 状态码范围 | 示例 | 含义 |
---|---|---|---|
1xx | 信息 | 100 | Continue |
2xx | 成功 | 200 | OK、201 Created |
3xx | 重定向 | 301/302/304 | 永久或临时重定向 |
4xx | 客户端错误 | 400、403、404 | 错误请求、无权限、未找到 |
5xx | 服务器错误 | 500、502、503 | 服务器故障、网关超时 |
(3)典型请求-响应交互
客户端(浏览器) 服务器(Web Server)│ ││─▶ 1. 请求:GET /index.html HTTP/1.1 ││ Host: www.example.com ││ User-Agent: Mozilla... ││ ││ ││◀─ 2. 响应:HTTP/1.1 200 OK ││ Content-Type: text/html ││ Content-Length: 348 ││ ││ <html>...</html> │▼
页面显示在用户浏览器
四、HTTP 与Cookie
HTTP 是一种无状态协议,这意味着服务器不会自动记住客户端的身份和历史交互记录。为了解决这个问题,引入了 Cookie 机制,使得服务器可以“记住”客户端的部分信息,支持会话保持、登录验证、个性化设置等功能。
(1)Cookie 的特性
Cookie 是服务器通过 HTTP 响应头发送到客户端浏览器的一小段文本信息,浏览器在后续的请求中会自动携带这些 Cookie 发回给服务器。
特性 | 描述 |
---|---|
储存在客户端 | 浏览器将 Cookie 保存为本地文件 |
自动发送 | 浏览器在请求匹配的域名时会自动附带对应 Cookie |
可设置属性 | 可设置过期时间、安全性、作用路径、是否仅限 HTTP 等 |
小巧 | 单个 Cookie 最大 4KB,域名最多约 20 个 Cookie(各浏览器略有不同) |
(2)HTTP 与 Cookie 的交互过程
服务器设置 Cookie(响应头):
HTTP/1.1 200 OK
Set-Cookie: sessionid=abc123; Path=/; HttpOnly; Expires=Wed, 01 Jan 2025 12:00:00 GMT
Set-Cookie
告诉浏览器保存该 Cookie;- 设置属性如作用路径
Path
、过期时间Expires
、是否仅限 HTTP 访问等。
浏览器自动回传 Cookie(请求头):
GET /dashboard HTTP/1.1
Host: www.example.com
Cookie: sessionid=abc123
- 浏览器访问同一域名时自动携带 Cookie;
- 服务器通过 Cookie 恢复用户身份或状态。
HTTP与Cookie的关系:
[客户端浏览器] [服务器]─────────── 请求登录 ────────────▶(返回 Set-Cookie: sessionid=abc123)◀──────── 响应头包含 Cookie ─────────────── 携带 Cookie 的请求 ───────▶Cookie: sessionid=abc123◀────── 根据 Cookie 返回用户信息 ───────
五、HTTP 缓存
HTTP 缓存(HTTP Caching)是 Web 性能优化的重要机制,它允许客户端(浏览器)或中间服务器(如 CDN、代理)在一定时间内存储资源副本,避免重复向服务器请求,从而提升加载速度,减轻服务器压力,节省带宽。
主要有以下两种:
缓存类型 | 描述 |
---|---|
强缓存(强制缓存) | 客户端在本地直接使用缓存,不发请求给服务器 |
协商缓存(条件缓存) | 客户端向服务器确认缓存是否过期,决定是否使用缓存 |
常用响应头:
响应头字段 | 用途说明 |
---|---|
Cache-Control | 控制缓存行为,如 max-age , no-cache , no-store |
Expires | 设置资源过期时间(GMT 格式) |
ETag | 资源的唯一标识,配合 If-None-Match 做协商缓存 |
Last-Modified | 资源最后修改时间,配合 If-Modified-Since 使用 |
(1)强缓存机制(无需与服务器通信)
通过响应头中的以下字段控制:
Cache-Control
示例:
Cache-Control: max-age=3600
- 表示该资源可在客户端缓存 3600 秒。
Expires
示例:
Expires: Wed, 21 May 2025 12:00:00 GMT
- 设置一个过期的绝对时间点(已被
Cache-Control
取代)。
当强缓存生效时,请求不会发送到服务器,状态码为 200(from disk cache) 或 200(from memory cache)。
(2)协商缓存机制(需与服务器通信)
当强缓存失效时,客户端会向服务器发送请求并携带缓存验证信息,服务器判断资源是否修改:
Last-Modified
+ If-Modified-Since
首次响应:
Last-Modified: Tue, 20 May 2025 10:00:00 GMT
后续请求:
If-Modified-Since: Tue, 20 May 2025 10:00:00 GMT
如果资源未变,服务器返回:
HTTP/1.1 304 Not Modified
- 客户端使用本地缓存。
ETag
+ If-None-Match
首次响应:
ETag: "abc123"
后续请求:
If-None-Match: "abc123"
- 匹配成功,返回 304;否则返回新资源。
协商缓存状态码是 304 Not Modified。
(3)缓存控制示意图
首次访问 再次访问(强缓存) 再次访问(协商缓存)┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐│ 客户端发送请求 │ │ 客户端不发请求 │ │ 客户端带验证头发请求 ││ │ │ │ │ If-Modified-Since │└────────────────────┘ └────────────────────┘ └────────────────────┘│ │ │▼ ▼ ▼┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐│ 服务器返回资源 │ │ 客户端使用本地缓存 │ │ 服务器返回 304 ││ Cache-Control 等头 │ │ │ │ │└────────────────────┘ └────────────────────┘ └────────────────────┘
六、HTTP 与其他协议
- 属于应用层协议,基于TCP(HTTP/1/1.1/2)或UDP(HTTP/3);
- DNS 负责域名解析,TLS 负责加密;
- 与 REST、GraphQL、WebSocket 等现代接口技术密切相关;
- 浏览器与服务器之间的核心通信协议。
七、实际应用
- 浏览网页:浏览器发起GET请求获取网页资源;
- 提交表单:表单内容通过POST请求发送到服务器;
- 加载图片、视频等资源:通过HTTP并发多次请求;
- 接口调用(API):如Ajax、前后端通信(JSON格式)。