HTTP到底是什么?一次讲清楚

​

HTTP协议原理

HTTP(Hyper Transfer Protocol) 超文本传输协议

本质上就是: 客户端(浏览器/前端)和服务器之间通信的规则

比如访问: http://localhost:8000/userList背后其实就是: 浏览器发请求-->服务器返回响应

HTTP工作流程

text 复制代码
浏览器 → 发请求(Request) → 服务器
服务器 → 返回响应(Response) → 浏览器

比如前端代码:

javascript 复制代码
fetch('/userList')

其实发的是:

复制代码
GET /userList HTTP/1.1
Host: localhost:8080

HTTP请求结构

一个http请求长这样:

复制代码
请求行
请求头
空行
请求体(可选)

一个真实的请求

复制代码
GET /domains/example/ HTTP/1.1      // 请求行: 请求方法 请求 URI HTTP 协议/协议版本
Host:www.iana.org               // 服务端的主机名
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4          // 浏览器信息
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  // 客户端能接收的 mine
Accept-Encoding:gzip,deflate,sdch       // 是否支持流压缩
Accept-Charset:UTF-8,*;q=0.5        // 客户端字符编码集
// 空行,用于分割请求头和消息体
// 消息体,请求资源参数,例如 POST 传递的参数

1请求行

GET /userList HTTP/1.1

包含三部分:

  • 请求方法(GET/PSOT/PUT/DELETE)
  • 请求路径
  • 协议版本

2请求头(Header)

复制代码
Host:localhost:8080
Content-Type: application/json
Authorization: Bearer xxx

3请求体(body)

只有 POST/PUT 才有用

json 复制代码
{
    "username":"admin",
    "password":"123456",
}

HTTP响应结构

text 复制代码
状态行
响应头
空行
响应体

例如:

复制代码
HTTP/1.1 200 OK                     // 状态行
Server: nginx/1.0.8                 // 服务器使用的 WEB 软件名及版本
Date: Tue, 30 Oct 2012 04:14:25 GMT     // 发送时间
Content-Type: text/html             // 服务器发送信息的类型
Transfer-Encoding: chunked          // 表示发送 HTTP 包是分段发的
Connection: keep-alive              // 保持连接状态
Content-Length: 90                  // 主体内容长度
// 空行 用来分割消息头和主体
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... // 消息体

1状态行

复制代码
HTTP/1.1 200 OK

2响应头

复制代码
Content-Type:application/json
Set-Cookie:token=xxx

3响应体

json 复制代码
{
    "code":200.
    "data":[]
}

HTTP常见状态码

1xx:信息性(临时响应)

100 Continue: 客户端可继续发送请求

101 Switching Protocols: 切换协议(如升级到 WebSocket)

2xx:成功

200 OK:请求成功,正常返回

201 Created:资源创建成功(常用于POST)

204 No Content:请求成功但无返回内容

3xx:重定向

301 Moved Permanently: 永久重定向

302 Found: 临时重定向

304 Not Modified:资源未修改,可使用缓存

4xx:客户端错误

400 Bad Request:请求语法错误

401 Unauthorized:未认证(需要登录)

403 Forbidden:服务器拒绝访问(权限不足)

404 Not Found:资源不存在

405 Method Not Allowed:请求方法不允许

429 Too Many Request:请求频率超限

5xx:服务器错误

500 Internet Server Error:服务器内部错误

502 Bad Gateway:网关错误

503 Service Unavailable:服务暂时不可用

504 Gateway Timeout:网关超时

HTTP 核心特点

1.无状态

HTTP 不记住你是谁,每次请求都是独立的:

复制代码
登录 → 请求A
获取用户信息 → 请求B

服务器默认不知道A和B是同一个人

解决方法:

JWT

2.基于TCP

HTTP是建立在 TCP 之上的

TCP是可靠连接

HTTP方法

方法 作用 例子 参数位置 安全性 长度限制 幂等性
GET 查询 获取用户 URL 暴露 有限制 有
POST 创建 注册 请求体 相对安全 基本没有 无
PUT 修改 修改用户
DELETE 删除 删除用户

什么是幂等: 多次执行同一个操作,结果是一样的

哪些 HTTP方法是幂等的

方法 是否幂等 原因
GET ✔️ 只是获取数据
PUT ✔️ 覆盖更新
DELETE ✔️ 删除一次和多次一样
POST ❌ 每次都会创建新资源

HTTP 缓存技术

HTTP缓存有哪些实现方式

对于一些具有重复性的HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了,这样的话HTTP/1.1 的性能肯定肉眼可见的提升

所以,避免发送 HTTP 请求的方法就是通过缓存技术

HTTP 缓存有两种实现方式,分别是 强制缓存 和 协商缓存

强制缓存

强制缓存指的是, 只要浏览器判断缓存没过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边

协商缓存

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是 304,这是告诉浏览器可以使用本地缓存的资源,通常这种通过服务器告知客户端是否可以使用缓存的方式被称为协商缓存

TCP和UDP

在计算机网络中,数据传输并不是随意发送的,它依赖一套明确的通信规则, tcp 和 udp就是传输层中最核心的两种协议,他们运行在ip协议之上;二者最大的区别不在于速度,而在于 是否保证可靠性

TCP(Transmission Control Protocol)

连接导向: TCP是面向连接的协议.在发送数据之前,必须先建立一个连接

可靠: TCP提供可靠的传输,通过三次握手建立连接,通过确认和重传机制保障数据的完整性和顺序

流量控制: TCP 具备流量控制和拥塞控制机制,确保网络不被过载

按序传输: TCP保证数据包按发送顺序传输,并在接收端按相同顺序重组

下图是 TCP/IP 的主要协议之间的相关性

UDP(User Datagram Protocol)

无连接: UDP是无连接的协议,在发送数据之前无需建立连接

不可靠: UDP提供不可靠的数据传输,不保证数据的完整性和顺序

无流量控制: UDP不具备流量控制和拥塞控制机制,发送方可以毫无节制地发送数据

快速: UDP 传输速度较快,适用于对实验敏感的应用

对比

TCP UDP
连接方式 面向连接的协议,需要三次握手建立连接,确保双方准备就绪后再传输数据 无连接的协议,数据包可以在任何时间任意发送,无需建立连接
数据传输可靠性 提供可靠传输。通过序列号和确认应答确保数据按顺序传输和重组,重传丢失的数据包 不保证可靠性。没有重传机制,也不保证接收顺序
流量控制与拥塞控制 具备流量控制和拥塞控制机制,可防止发送方过快发送导致网络拥塞 没有流量控制和拥塞控制,发送方可连续发送数据,不考虑网络状况
数据包大小 每个TCP连接都有一个数据包大小限制(MSS,最大报文段大小),因而数据传输较为繁琐 支持更大的数据包,但每个UDP数据报的大小通常在应用网络最大传输单元(MTU)范围内
传输速度 较慢,因需要三次握手建立连接,并为了确保可靠性,存在重传和确认机制 较快,无需建立连接,亦没有重传和确认机制,适合实时应用
应用场景 适用于对数据传输可靠性和准确性要求较高的应用,比如 网页浏览,文件传输(FTP),电子邮件(SMTP),数据库同步等 适用于对传输速度和效率要求较高,但对可靠性要求较低的应用,比如实时视频,音乐流(VoIP),在线游戏,DNS查询等

​# HTTP1.1 vs HTTP2

特性 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3
连接方式 短连接 长连接(keep-alive) 单连接(多路复用)
并发能力 ❌ 无 ⚠️ 有但会阻塞 ✅ 强(多路复用)
队头阻塞 ❌ 无概念 ❌ 存在 ✅ 解决
传输格式 文本 文本 二进制
Host 头 ❌ 无 ✅ 有 ✅ 有
头部压缩 ❌ 无 ❌ 无 ✅ HPACK
缓存控制 基础 更强(ETag等) 同 HTTP/1.1
断点续传 ❌ ✅ 支持 ✅ 支持
服务器推送 ❌ ❌ ✅ 支持
传输协议 TCP TCP UDP

HTTP/2 是基于 HTTPS的

HTTP1.1 出现的问题

队头阻塞(Head-of-line blocking): 一个请求慢,后面全卡住

解决办法: 开多个 TCP 连接,但是开销大

无状态:

  • 好处:节省资源
  • 坏处:需要重复验证

HTTP2的改进

  • 多路复用: 一个TCP连接里面,可以同时发多个请求,不互相阻塞
  • 头部压缩: 减少重复 Header
  • 二进制传输(更高效)

HTTP和HTTPS的区别

HTTPS

HTTPS = HTTP + SSL/TLS 加密,是HTTP的安全

TLS和SSL本质上是同一类协议,但是TLS是SSL的升级版,现在实际上用的都是TLS

特性 HTTP HTTPS
是否加密 ❌ 明文 ✅ 加密(SSL/TLS)
安全性 ❌ 易被窃听/篡改 ✅ 防窃听、防篡改
端口 80 443
证书 ❌ 不需要 ✅ 需要 CA 证书
性能 稍快 略慢(但现在差距很小)

HTTPS工作流程

  1. TCP三次握手
  2. TLS握手
  3. 客户端发起HTTPS请求
  4. 服务器返回 数字证书(包含公钥)和 随机数
  5. 客户端验证证书合法性(CA机构)
  6. 生成"对称密钥",客户端 生成一个随机密钥,用服务器公钥加密后发送
  7. 服务器解密,得到对称密钥
  8. 后续全部使用: 对称加密

普通 HTTP工作流程 浏览器输入一个URL之后,会发生什么

DNS解析

TCP三次握手

发送HTTP请求

服务器处理

返回响应

浏览器解析HTML(加载CSS/JS)

渲染页面

TCP四次挥手(断开)

相关推荐
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
wuyk5556 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
XUEYUAN52126 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
QYRdata6 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
CHENKONG_CK6 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
chshang19926 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
萧瑟余晖6 天前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20236 天前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5556 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
z落落6 天前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp