当前位置: 首页 > news >正文

计算机网络学习(三)——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信息100Continue
2xx成功200OK、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格式)。
http://www.xdnf.cn/news/609319.html

相关文章:

  • 详解Mysql的快照读和当前读区别
  • 基于BERT预训练模型(bert_base_chinese)训练中文文本分类任务(AI老师协助编程)
  • 25年上半年五月之软考之设计模式
  • Linux基本指令(二)
  • 【Linux】基础开发工具(下)
  • Android正则表达式
  • Android中ServiceManager与Binder驱动的关系
  • java 进阶 1.0.3
  • 使用 Elasticsearch 和 Red Hat OpenShift AI 提升工作流程效率
  • C#日期和时间:DateTime转字符串全面指南
  • leetcode513.找树左下角的值:递归深度优先搜索中的最左节点追踪之道
  • Typescript学习教程,从入门到精通,TypeScript 集合类型语法知识点及案例代码(11)
  • 前缀和数组一文详解
  • Vue3.5 企业级管理系统实战(二十):角色菜单
  • JDK21全景图:关键特性与升级价值
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月23日第86弹
  • 如何轻松擦U盘? (3个解决方案)
  • AI Study,学习计划
  • 2024 CKA模拟系统制作 | Step-By-Step | 3、CKA考试系统的技术设置
  • 基于SpringBoot的网上租赁系统设计与实现
  • YOLOv10 系列算法学习笔记一
  • vue开发中常用方法笔记
  • springboot3+vue3融合项目实战-大事件文章管理系统-登录优化redis
  • Vue3和React中插件化设计思想
  • YOLO11解决方案之速度估算探索
  • LaTeX中所有数字都应该在数学环境中吗?
  • Python项目中的文件夹命名和结构设计建议
  • JavaScript的三大核心组成:ECMAScript、DOM与BOM
  • WebGL开发技巧
  • 一些Dify聊天系统组件流程图架构图