一、HTTP 是什么
HTTP(HyperText Transfer Protocol,超文本传输协议),是应用层协议,基于TCP。
默认端口 80。
HTTP 是万维网(Web)的基础协议,浏览器和Web服务器之间传输网页、图片、JS、CSS、接口数据都使用HTTP。
简单理解:浏览器(客户端)向服务器发送请求,服务器返回响应,一问一答。
注意:HTTP是明文传输,不加密;加密版本为HTTPS(HTTP+TLS),端口443。
二、HTTP 核心特点
- 请求-响应模型:客户端主动发起请求,服务器被动返回响应;
- 无状态:服务器不会记住上一次客户端是谁,每次请求相互独立。>
解决无状态:Cookie、Session、Token;
- 无连接(HTTP/1.1之前):一次请求响应完成就断开TCP连接;HTTP/1.1默认支持长连接(Keep-Alive),复用TCP连接;
- 明文传输:请求、响应全部裸奔,中间人可以抓包查看和篡改内容;
- 基于文本:报文是可读的文本格式。
版本区分:
- HTTP/1.0:短连接,一次请求一次连接;
- HTTP/1.1:默认长连接、管道化、缓存、Host头(现在最广泛使用);
- HTTP/2:二进制、多路复用、头部压缩;
- HTTP/3:基于QUIC(UDP)。
三、HTTP 请求报文结构
由四部分组成:请求行、请求头、空行、请求体
GET /index.html HTTP/1.1 # 请求行
Host: www.example.com # 请求头
User-Agent: Mozilla/5.0
Accept: text/html
# 空行(必须)
【请求体,POST/PUT等方法才有】
- 请求行:请求方法 + 请求资源路径 + HTTP版本
- 请求头(Header):键值对,描述客户端信息、资源类型、Cookie等
- 空行:用来分隔头部和请求体
- 请求体(Body):POST、PUT携带提交的数据;GET没有请求体
常用请求方法
| 方法 | 含义 | 是否有请求体 |
|---|---|---|
| GET | 获取资源,查询数据 | 一般不使用body |
| POST | 提交数据,新增资源 | ✅有body |
| PUT | 全量更新资源 | ✅有body |
| DELETE | 删除资源 | 可选 |
| HEAD | 只获取响应头,不要响应体 | 无 |
| OPTIONS | 查询服务器支持哪些方法 | 可选 |
RESTful风格就是利用这几个方法表达资源操作语义。
四、HTTP 响应报文结构
状态行、响应头、空行、响应体
HTTP/1.1 200 OK # 状态行
Server: nginx
Content-Type: text/html
Content-Length: 1024
# 空行
<html>...</html> # 响应体(网页内容)
- 状态行:HTTP版本 + 状态码 + 描述短语
- 响应头:服务器返回的元信息(资源类型、缓存策略、Cookie等)
- 响应体:网页、图片、JSON接口返回数据
常见状态码分类
- 1xx 信息类:继续处理
- 2xx 成功
- 200 OK:成功
- 201 Created:创建成功
- 3xx 重定向
- 301 Moved Permanently:永久重定向
- 302 Found:临时重定向
- 304 Not Modified:资源未修改,使用本地缓存
- 4xx 客户端错误
- 400 Bad Request:请求报文错误
- 401 Unauthorized:未认证
- 403 Forbidden:权限拒绝
- 404 Not Found:资源不存在
- 5xx 服务端错误
- 500 Internal Server Error:服务器内部错误
- 502 Bad Gateway:网关错误
- 503 Service Unavailable:服务不可用
五、重要请求头与响应头示例
请求头
Host:目标主机域名(HTTP1.1强制)User-Agent:客户端浏览器/设备标识Cookie:携带Cookie信息Accept:客户端可接收的数据类型Referer:从哪个页面跳转过来
响应头
Content-Type:响应体MIME类型(text/html、application/json、image/png)Content-Length:响应体字节长度Set-Cookie:服务器下发Cookie给浏览器Cache-Control:缓存控制Location:重定向地址(301/302使用)
六、无状态问题与解决方案
HTTP本身无状态:服务器无法区分两次请求是不是同一个用户。
解决方案:
- Cookie:保存在浏览器本地,每次请求自动携带发给服务器;
- Session:服务端存储用户会话信息,Cookie存放SessionID;
- Token(JWT等):令牌放在请求头Authorization,适合前后端分离、APP接口。
七、HTTP长连接 Keep-Alive
HTTP/1.1 默认开启Keep-Alive。
- 一次TCP连接,可以连续发送多个HTTP请求;
- 不用每次请求都新建、断开TCP连接,减少三次握手、四次挥手开销;
- 超过超时时间,服务器自动关闭TCP连接。
注意:长连接是TCP连接复用,不是HTTP协议本身保持会话状态。
八、HTTP缓存简单理解
浏览器会缓存静态资源(图片、js、css),减少重复请求:
- 协商缓存:
Last-Modified/ETag,服务器对比资源是否更新,返回304; - 强缓存:
Cache-Control: max-age,有效期内直接使用本地缓存,不访问服务器。
九、HTTP vs HTTPS
| 项目 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | ❌明文 | ✅TLS加密 |
| 安全性 | 低,可抓包篡改 | 高,防窃听、防篡改、身份校验 |
| 底层 | TCP | TCP+TLS |
HTTPS并不是新协议,是HTTP跑在TLS加密通道之上。
十、小结
- HTTP应用层TCP协议,80端口,Web网页与API接口基础;
- 一问一答请求响应模型,无状态,靠Cookie/Session/Token记录用户;
- 报文分为请求报文、响应报文,文本格式;
- HTTP1.1支持Keep-Alive长连接,复用TCP;
- 状态码用来表达请求结果;HTTP明文不安全,生产环境推荐HTTPS。
思考题:HTTP是无状态,Keep-Alive是长连接,这两个概念有什么区别,不要混淆?
0 条笔记