HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层最核心的通信协议之一,是整个万维网的数据交互基础。它规定了客户端(浏览器、APP)与 Web 服务器之间的通信格式、交互流程与语义规则,我们日常浏览网页、调用接口,底层都依赖 HTTP 完成。
一、核心基础认知
1. 基本定位
- 层级:OSI 七层模型的应用层协议,无需关心底层传输细节
- 模型:经典的请求 - 响应模型,永远是客户端主动发起请求,服务器被动返回响应
- 底层传输:
- HTTP/1.x、HTTP/2 默认基于TCP 协议,默认端口号 80
- HTTPS 是 HTTP 的加密版本,基于 TLS/SSL,默认端口号 443
- HTTP/3 基于 UDP 协议的 QUIC 实现
2. 三大核心特性
- 无状态:协议本身不记录请求的上下文信息,每次请求都是独立的,服务器默认不知道上一次请求的用户身份(通过 Cookie/Session/Token 解决状态保持)
- 明文传输:HTTP/1.x 报文是纯文本格式,抓包可直接读取内容,安全性差(HTTPS 解决该问题)
- 可扩展:通过自定义头部字段可以扩展能力,比如鉴权、缓存、跨域规则都通过头部实现
二、一次完整的 HTTP 请求流程
从输入网址到页面加载,HTTP 完整执行步骤:
- 域名解析:通过 DNS 系统将域名解析为服务器的 IP 地址
- 建立连接:客户端与服务器完成 TCP 三次握手,建立传输通道
- 发送请求:客户端构造 HTTP 请求报文,发送给服务器
- 服务端处理:服务器解析请求报文,执行业务逻辑(查数据库、读文件等)
- 返回响应:服务器构造 HTTP 响应报文,将结果回传给客户端
- 连接管理:根据
Connection头部决定保持长连接还是关闭连接 - 客户端解析:浏览器 / 客户端解析响应内容(HTML、JSON、图片等),完成渲染或业务处理
三、HTTP 报文结构详解
HTTP 报文分为请求报文(客户端发)和响应报文(服务器发),结构高度统一,都由 4 部分组成:起始行 + 头部字段 + 空行 + 实体主体
1. 请求报文
结构拆解
- 请求行:第一行,格式为
请求方法 + 请求URL + HTTP版本 - 请求头:多行键值对,描述客户端环境、请求参数、偏好设置
- 空行:单独一行(CRLF),用来标记头部结束,是报文格式的强制分隔符
- 请求体:可选,POST/PUT 等方法携带的业务数据(JSON、表单等)
完整示例
http
POST /api/user/login HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Content-Type: application/json Content-Length: 48 Connection: keep-alive {"username":"test","password":"123456"}2. 响应报文
结构拆解
- 状态行:第一行,格式为
HTTP版本 + 状态码 + 状态描述 - 响应头:多行键值对,描述服务器信息、响应数据属性、缓存规则等
- 空行:分隔头部和响应体
- 响应体:返回的实际数据,比如 HTML 页面、JSON 结果、图片二进制数据
完整示例
http
HTTP/1.1 200 OK Server: nginx Content-Type: application/json Content-Length: 65 Cache-Control: max-age=3600 {"code":0,"msg":"登录成功","data":{"token":"abc123xyz"}}四、HTTP 请求方法
HTTP/1.1 标准定义了 9 种请求方法,每种方法对应不同的业务语义,核心常用的有 5 种:
表格
| 方法 | 语义 | 幂等性 | 有无请求体 | 典型场景 |
|---|---|---|---|---|
| GET | 获取资源 | 是 | 一般无 | 打开网页、查询数据 |
| POST | 提交数据、创建资源 | 否 | 有 | 登录、提交表单、新增数据 |
| PUT | 全量更新资源 | 是 | 有 | 修改用户完整信息 |
| DELETE | 删除资源 | 是 | 一般无 | 删除一条数据 |
| HEAD | 获取资源的元信息(仅返回头部) | 是 | 无 | 检查文件是否存在、获取文件大小 |
幂等性:同一个请求执行 1 次和执行 N 次,对服务器资源的影响完全一致,就叫幂等。
高频考点:GET 和 POST 的核心区别
- 参数位置:GET 参数拼接在 URL 后;POST 参数放在请求体中
- 幂等性:GET 是幂等操作;POST 是非幂等操作
- 数据长度:GET 受 URL 长度限制(浏览器一般限制 2KB 左右);POST 无严格长度限制
- 缓存特性:GET 请求可以被浏览器缓存;POST 默认不可缓存
- 安全性:两者都不安全(HTTP 明文),只是 GET 参数更直观暴露在地址栏
五、HTTP 状态码
状态码是三位数字,用来标记请求的处理结果,共分为 5 大类:
1xx:信息性状态码(请求处理中)
表示请求已接收,正在处理,属于中间状态,日常很少见。
- 101 Switching Protocols:切换协议,比如升级 WebSocket
2xx:成功状态码
- 200 OK:请求成功,最常见的成功状态
- 201 Created:资源创建成功(POST/PUT 接口常用)
- 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:请求方法不被服务器支持
5xx:服务器端错误状态码
- 500 Internal Server Error:服务器内部错误,代码异常
- 502 Bad Gateway:网关错误,上游服务返回无效响应
- 503 Service Unavailable:服务不可用,服务器过载或停机
- 504 Gateway Timeout:网关超时,上游服务响应超时
六、HTTP 版本演进
1. HTTP/1.0
- 默认短连接:每次请求都要重新建立 TCP 连接,请求结束就断开
- 仅支持 GET、POST 等基础方法
- 缺点:连接建立成本高,并发效率极低
2. HTTP/1.1(当前主流版本)
- 默认长连接(
Connection: keep-alive):一个 TCP 连接可以串行发送多个请求 - 新增 Host 头部:支持一台服务器部署多个网站(虚拟主机)
- 新增 PUT、DELETE、OPTIONS 等方法
- 缺点:请求串行执行,存在队头阻塞—— 前一个请求阻塞,后续所有请求都会被卡住
3. HTTP/2.0
- 二进制分帧:报文不再是纯文本,拆分为二进制帧,解析效率更高
- 多路复用:一个 TCP 连接可以并行发送多个请求 / 响应,解决应用层队头阻塞
- 头部压缩:HPACK 算法压缩重复头部,减少传输体积
- 服务器推送:服务器可以主动向客户端推送资源
- 缺点:底层还是 TCP,TCP 层的队头阻塞依然存在(丢包会导致整个连接重传)
4. HTTP/3.0
- 基于 UDP 实现的 QUIC 协议,不再依赖 TCP
- 彻底解决队头阻塞:流之间独立,单流丢包不影响其他流
- 更快握手:0-RTT/1-RTT 即可建立连接,比 TCP+TLS 快很多
- 连接迁移:网络切换(WiFi 切 5G)时连接不中断
七、常用核心头部字段
请求头
Host:目标服务器的域名,虚拟主机必备User-Agent:客户端标识(浏览器、系统信息)Accept:客户端能接收的内容类型Content-Type:请求体的数据格式,如application/jsonCookie:客户端携带的身份凭证Referer:请求的来源页面地址
响应头
Server:服务器软件类型(nginx、Apache)Set-Cookie:向客户端写入 CookieContent-Type:响应体的数据格式Cache-Control:缓存控制规则Location:重定向的目标地址