HTTP协议超详细学习笔记:从基础到实战
一、HTTP协议概述
1.1 基本定义
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是互联网上应用最为广泛的网络协议之一。它基于TCP/IP通信协议来传递数据(HTML文件、图片、查询结果等)。
1.2 核心特点
- 无状态:服务器不保存任何客户端的状态信息,每次请求都是独立的
- 无连接:HTTP/1.1之前每次请求都需要建立一个TCP连接,请求完成后立即断开
- 基于请求-响应模型:客户端发送请求,服务器返回响应
- 可扩展:通过头部字段可以扩展各种功能
- 明文传输:HTTP本身不加密,数据在网络上以明文形式传输
1.3 版本演进
| 版本 | 发布时间 | 主要改进 |
|---|---|---|
| HTTP/0.9 | 1991年 | 仅支持GET方法,只能传输HTML文本 |
| HTTP/1.0 | 1996年 | 支持POST、HEAD等方法,引入状态码和头部 |
| HTTP/1.1 | 1999年 | 持久连接、管道化、分块传输、缓存机制 |
| HTTP/2 | 2015年 | 二进制帧、多路复用、头部压缩、服务器推送 |
| HTTP/3 | 2022年 | 基于QUIC协议,解决队头阻塞问题 |
二、HTTP请求结构
HTTP请求由请求行 、请求头 、空行 和请求体四部分组成。
2.1 请求行
请求行包含三个部分:请求方法、请求URI和HTTP版本,格式如下:
Method Request-URI HTTP-Version
示例:
GET /index.html HTTP/1.1
POST /api/user/login HTTP/1.1
2.2 请求头
请求头包含客户端向服务器传递的附加信息,由多个键值对组成,每行一个。常用请求头:
| 头部字段 | 说明 |
|---|---|
| Host | 请求的主机名和端口号 |
| User-Agent | 客户端浏览器信息 |
| Accept | 客户端能接收的媒体类型 |
| Accept-Encoding | 客户端支持的编码方式(gzip、deflate等) |
| Accept-Language | 客户端支持的语言 |
| Connection | 连接管理(keep-alive表示持久连接) |
| Cookie | 客户端存储的Cookie信息 |
| Referer | 请求的来源页面 |
| Content-Type | 请求体的媒体类型 |
| Content-Length | 请求体的长度 |
2.3 空行
请求头和请求体之间必须有一个空行,用于分隔头部和内容。
2.4 请求体
请求体包含要发送给服务器的数据,GET请求通常没有请求体,POST、PUT等请求有请求体。常见的请求体格式:
application/x-www-form-urlencoded:表单数据application/json:JSON数据multipart/form-data:文件上传text/plain:纯文本
三、HTTP响应结构
HTTP响应由状态行 、响应头 、空行 和响应体四部分组成。
3.1 状态行
状态行包含三个部分:HTTP版本、状态码和状态描述,格式如下:
HTTP-Version Status-Code Reason-Phrase
示例:
HTTP/1.1 200 OK
HTTP/1.1 404 Not Found
3.2 响应头
响应头包含服务器向客户端传递的附加信息,常用响应头:
| 头部字段 | 说明 |
|---|---|
| Server | 服务器软件信息 |
| Content-Type | 响应体的媒体类型 |
| Content-Length | 响应体的长度 |
| Content-Encoding | 响应体的编码方式 |
| Set-Cookie | 服务器设置Cookie |
| Cache-Control | 缓存控制 |
| Expires | 缓存过期时间 |
| Last-Modified | 资源最后修改时间 |
| ETag | 资源的唯一标识 |
| Location | 重定向目标URL |
3.3 空行
响应头和响应体之间必须有一个空行。
3.4 响应体
响应体包含服务器返回给客户端的数据,如HTML页面、JSON数据、图片等。
四、常用HTTP状态码详解
HTTP状态码分为5大类,由三位数字组成,第一个数字定义了状态码的类别:
4.1 1xx:信息性状态码
表示服务器已接收请求,正在处理。
- 100 Continue:继续,客户端应继续发送请求
- 101 Switching Protocols:切换协议,服务器将切换到客户端请求的协议
4.2 2xx:成功状态码
表示请求已成功被服务器接收、理解和处理。
- 200 OK:请求成功,服务器返回了请求的资源
- 201 Created:资源创建成功,通常用于POST请求
- 204 No Content:请求成功,但没有返回任何内容
- 206 Partial Content:部分内容,用于断点续传或分块下载
4.3 3xx:重定向状态码
表示需要客户端进一步操作才能完成请求。
- 301 Moved Permanently:永久重定向,资源已永久移动到新URL
- 302 Found:临时重定向,资源临时移动到新URL
- 304 Not Modified:未修改,资源未发生变化,客户端可以使用缓存
- 307 Temporary Redirect:临时重定向,与302类似,但不允许改变请求方法
- 308 Permanent Redirect:永久重定向,与301类似,但不允许改变请求方法
4.4 4xx:客户端错误状态码
表示客户端发送的请求有错误,服务器无法处理。
- 400 Bad Request:请求语法错误,服务器无法理解
- 401 Unauthorized:未授权,需要身份验证
- 403 Forbidden:禁止访问,服务器拒绝请求
- 404 Not Found:资源未找到,服务器找不到请求的资源
- 405 Method Not Allowed:方法不允许,请求方法不被服务器支持
- 408 Request Timeout:请求超时,服务器等待请求时间过长
- 409 Conflict:冲突,请求与服务器当前状态冲突
- 413 Payload Too Large:请求体过大,服务器无法处理
- 415 Unsupported Media Type:不支持的媒体类型,请求体格式不被支持
- 429 Too Many Requests:请求过多,客户端请求频率超过服务器限制
4.5 5xx:服务器错误状态码
表示服务器在处理请求时发生了错误。
- 500 Internal Server Error:服务器内部错误,服务器遇到了意外情况
- 501 Not Implemented:未实现,服务器不支持请求的功能
- 502 Bad Gateway:网关错误,网关或代理服务器收到了无效的响应
- 503 Service Unavailable:服务不可用,服务器暂时无法处理请求
- 504 Gateway Timeout:网关超时,网关或代理服务器等待响应超时
- 505 HTTP Version Not Supported:不支持的HTTP版本
五、HTTP请求方法
HTTP定义了多种请求方法,用于指定对资源的操作类型:
| 方法 | 说明 | 幂等性 | 安全性 |
|---|---|---|---|
| GET | 获取资源 | 是 | 是 |
| HEAD | 获取资源的头部信息 | 是 | 是 |
| POST | 提交数据,创建资源 | 否 | 否 |
| PUT | 更新资源 | 是 | 否 |
| DELETE | 删除资源 | 是 | 否 |
| PATCH | 部分更新资源 | 否 | 否 |
| OPTIONS | 获取服务器支持的方法 | 是 | 是 |
| CONNECT | 建立隧道连接 | 否 | 否 |
| TRACE | 追踪请求路径 | 是 | 是 |
幂等性 :多次执行相同的操作,结果相同。
安全性:操作不会修改服务器上的资源。
六、Cookie与Session详解
由于HTTP是无状态协议,服务器无法识别不同的客户端,因此需要Cookie和Session来保持会话状态。
6.1 Cookie
Cookie是服务器发送给客户端并存储在客户端的一小段数据,客户端下次请求时会自动携带该数据。
工作原理
- 客户端第一次请求服务器
- 服务器生成Cookie,通过
Set-Cookie响应头发送给客户端 - 客户端将Cookie保存到本地
- 客户端后续请求时,自动在
Cookie请求头中携带该Cookie - 服务器通过Cookie识别客户端身份
Cookie属性
- Name:Cookie的名称
- Value:Cookie的值
- Domain:Cookie所属的域名
- Path:Cookie生效的路径
- Expires/Max-Age:Cookie的过期时间
- Secure:仅在HTTPS连接中发送
- HttpOnly:禁止JavaScript访问,防止XSS攻击
- SameSite:防止CSRF攻击,可选值:Strict、Lax、None
Cookie的限制
- 每个域名下的Cookie数量有限制(通常为50个)
- 每个Cookie的大小限制为4KB左右
- 存储在客户端,安全性较低
6.2 Session
Session是服务器端存储的用户会话信息,每个Session有一个唯一的Session ID。
工作原理
- 客户端第一次请求服务器
- 服务器创建Session,生成唯一的Session ID
- 服务器将Session ID通过Cookie发送给客户端
- 客户端后续请求时,携带包含Session ID的Cookie
- 服务器根据Session ID找到对应的Session,识别客户端身份
Session与Cookie的区别
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务器端 |
| 安全性 | 较低,容易被窃取和篡改 | 较高 |
| 存储容量 | 4KB左右 | 无限制(取决于服务器内存) |
| 生命周期 | 可设置长期有效 | 通常较短,会话结束或超时失效 |
| 服务器压力 | 无 | 较大,大量用户同时在线时会消耗服务器资源 |
Session的实现方式
- 基于Cookie:最常用的方式,将Session ID存储在Cookie中
- URL重写:将Session ID附加在URL后面,适用于禁用Cookie的情况
- 隐藏表单字段:将Session ID放在表单的隐藏字段中提交
七、HTTP缓存机制
HTTP缓存是提高网站性能的重要手段,可以减少网络传输和服务器负载。
7.1 缓存分类
- 强缓存:直接从本地缓存中获取资源,不向服务器发送请求
- 协商缓存:向服务器发送请求,由服务器判断是否使用缓存
7.2 强缓存
强缓存通过以下响应头控制:
- Expires:绝对过期时间,格式为GMT时间
- Cache-Control:相对过期时间,优先级高于Expires
Cache-Control常用值:
max-age=3600:缓存有效期为3600秒no-cache:不使用强缓存,需要进行协商缓存no-store:不使用任何缓存public:可以被任何缓存(包括代理服务器)缓存private:只能被客户端浏览器缓存
7.3 协商缓存
协商缓存通过以下响应头控制:
- Last-Modified/If-Modified-Since:基于资源最后修改时间
- ETag/If-None-Match:基于资源的唯一标识,优先级高于Last-Modified
工作流程
- 客户端第一次请求资源,服务器返回资源和
Last-Modified/ETag - 客户端将资源和响应头缓存到本地
- 客户端再次请求资源时,发送
If-Modified-Since/If-None-Match请求头 - 服务器比较资源的最后修改时间或ETag
- 如果资源未变化,返回304 Not Modified,客户端使用缓存
- 如果资源已变化,返回200 OK和新的资源
八、HTTPS简介
HTTPS(HyperText Transfer Protocol Secure)是HTTP的安全版本,在HTTP和TCP之间加入了SSL/TLS层,对数据进行加密传输。
8.1 HTTPS工作原理
- 客户端向服务器发送HTTPS请求,建立TCP连接
- 服务器返回数字证书,包含公钥和证书信息
- 客户端验证证书的合法性
- 客户端生成随机的对称密钥,用服务器的公钥加密后发送给服务器
- 服务器用私钥解密得到对称密钥
- 双方使用对称密钥进行加密通信
8.2 HTTPS的优点
- 数据加密:防止数据在传输过程中被窃取
- 数据完整性:防止数据在传输过程中被篡改
- 身份认证:验证服务器的身份,防止钓鱼网站
8.3 HTTPS的缺点
- 性能开销:加密和解密需要消耗CPU资源
- 证书成本:需要购买和维护数字证书
- 握手延迟:SSL/TLS握手需要额外的网络往返
九、HTTP/1.1 vs HTTP/2 vs HTTP/3
9.1 HTTP/1.1的问题
- 队头阻塞:同一TCP连接中,前一个请求未完成,后面的请求会被阻塞
- 头部冗余:每次请求都携带大量重复的头部信息
- 明文传输:安全性差
- 不支持服务器推送:服务器无法主动向客户端推送资源
9.2 HTTP/2的改进
- 二进制帧:将请求和响应分割成二进制帧,提高传输效率
- 多路复用:同一TCP连接中可以同时传输多个请求和响应,解决队头阻塞问题
- 头部压缩:使用HPACK算法压缩头部,减少传输量
- 服务器推送:服务器可以主动向客户端推送资源
- 流优先级:可以设置请求的优先级,优先传输重要资源
9.3 HTTP/3的改进
- 基于QUIC协议:使用UDP协议,解决TCP的队头阻塞问题
- 0-RTT握手:减少连接建立时间
- 连接迁移:客户端网络切换时,连接不会中断
- 内置TLS 1.3:默认加密,提高安全性
十、常见HTTP安全问题
- XSS(跨站脚本攻击):攻击者在网页中注入恶意脚本,窃取用户信息
- CSRF(跨站请求伪造):攻击者利用用户已登录的身份,执行未授权的操作
- SQL注入:攻击者在请求中注入SQL语句,获取或修改数据库数据
- 中间人攻击:攻击者在客户端和服务器之间拦截和篡改数据
- 点击劫持:攻击者将目标网站隐藏在透明层中,诱导用户点击
十一、总结
HTTP协议是互联网的基础,理解HTTP协议对于Web开发至关重要。本文详细介绍了HTTP协议的基本概念、请求响应结构、状态码、请求方法、Cookie与Session、缓存机制、HTTPS以及不同版本的HTTP协议。掌握这些知识可以帮助我们更好地开发和调试Web应用,提高应用的性能和安全性。