计算机网络学习(三)——HTTP

一、HTTP

HTTP(HyperText Transfer Protocol,超文本传输协议)是Web的核心协议,是客户端(如浏览器)与服务器之间进行数据通信的基础。

它是一种基于请求-响应模型的应用层协议,定义了客户端如何向服务器请求资源,以及服务器如何返回响应。

作用:

  • 传输超文本(HTML)、图像、音视频、JSON、XML等数据;
  • 是浏览器、APP、爬虫等与Web服务器通信的桥梁。

关键特性:

特性名称 说明
无状态(Stateless) 每次请求独立,服务器不会记录上一次请求的信息,除非借助 Cookie、Session 等机制
面向请求-响应(Request/Response) 客户端发起请求,服务器返回响应,遵循请求-响应模型
基于文本(Text-based) 报文是纯文本格式 ,易于读取和调试(如GETPOST 等)
灵活的媒体类型 通过 Content-Type 指定传输数据类型,如HTMLJSON、图片等
可扩展性强 支持多种方法(如PUTDELETE),也支持自定义头部字段
连接可复用(HTTP/1.1+) 支持长连接(Keep-Alive,多个请求可复用一个 TCP 连接,提升效率
无连接(早期 HTTP) 每个请求完成后就断开连接(HTTP/1.0 的默认行为)
支持代理、缓存、身份验证等机制 可通过中间服务器缓存内容、压缩内容、控制访问
支持多种方法 如:GETPOSTPUTDELETEHEADOPTIONS
明文传输(非加密) 数据不加密,易被中间人监听,通常配合 TLS 使用形成 HTTPS

注:

  • HTTP运行在 TCP/IP 协议栈的应用层

二、HTTP 协议的发展

(1) HTTP/0.9(1991):

  • 仅支持GET请求,仅传输 HTML。
  • 单行请求,无头部,功能简单。

(2) HTTP/1.0(1996):

  • 增加请求方法(POSTHEAD)、状态码和头部。
  • 每次请求建立新 TCP 连接,效率较低。

(3) HTTP/1.1(1997):

  • 引入 Keep-Alive,支持连接复用。
  • 支持管道化(Pipelining),允许发送多个请求而无需等待响应(但实际应用有限)。
  • 增加Host头部,支持虚拟主机。

(4) HTTP/2(2015):

  • 基于SPDY协议,支持二进制分帧,提高效率。
  • 多路复用:同一连接上并行处理多个请求。
  • 头部压缩(HPACK),减少开销。
  • 服务器推送:主动向客户端推送资源。

(5) HTTP/3(2022):

  • 基于UDPQUIC协议,取代 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(各浏览器略有不同)

服务器设置 Cookie(响应头):

http 复制代码
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(请求头):

http 复制代码
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

示例:

http 复制代码
Cache-Control: max-age=3600
  • 表示该资源可在客户端缓存 3600 秒。

Expires

示例:

http 复制代码
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

首次响应:

http 复制代码
Last-Modified: Tue, 20 May 2025 10:00:00 GMT

后续请求:

http 复制代码
If-Modified-Since: Tue, 20 May 2025 10:00:00 GMT

如果资源未变,服务器返回:

http 复制代码
HTTP/1.1 304 Not Modified
  • 客户端使用本地缓存。

ETag + If-None-Match

首次响应:

http 复制代码
ETag: "abc123"

后续请求:

http 复制代码
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格式)。
相关推荐
某人辛木24 分钟前
软考学习中
学习
Space Chars1 小时前
【大前端】使用NodeJs HTTP模块创建web服务器、SSE通讯
服务器·前端·http
天氰色等烟雨1 小时前
HTTP Digest 认证:原理剖析与服务端实现详解
网络·网络协议·http
清风徐来QCQ3 小时前
python语法学习
学习
miaoyumeng_wn3 小时前
5月21日学习笔记
笔记·学习·oracle
岂是尔等觊觎4 小时前
PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
经验分享·笔记·嵌入式硬件·学习·pcb工艺
拾忆-eleven4 小时前
NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
学习·自然语言处理·概率论
清晨朝暮5 小时前
【Linux 学习计划】-- git 在Linux远端服务器上的部署与简单使用
学习
打倒焦虑5 小时前
计算机网络学习20250524
计算机网络