http 介绍
大约 8 分钟
HTTP 基础知识
请求/响应模型
请求方法:
- GET:从服务器获取资源。请求参数附加在 URL 上。
- POST:向服务器发送数据,通常用于提交表单或上传文件。数据包含在请求体中。
- PUT:更新资源,将客户端提供的资源完整替换。
- DELETE:删除指定资源。
- HEAD:与 GET 类似,但只返回响应头,不包含响应体。
- PATCH:部分更新资源,而非完全替换。
请求的构成:
- 请求行:包括 HTTP 方法、目标 URL 和 HTTP 版本。
- 请求头:包含元数据(如
User-Agent
、Accept
、Authorization
)。 - 请求体:携带数据内容(如表单数据、JSON 数据)。
响应的构成:
- 状态行:包括 HTTP 版本、状态码和状态描述(如
HTTP/1.1 200 OK
)。 - 响应头:包含元数据(如
Content-Type
、Content-Length
)。 - 响应体:实际的内容数据(如 HTML 文档、图片)。
- 状态行:包括 HTTP 版本、状态码和状态描述(如
HTTP 状态码
1xx 信息性状态码:
- 100 Continue:表示客户端可以继续发送请求。
2xx 成功状态码:
- 200 OK:请求成功,服务器返回所请求的数据。
- 201 Created:资源已创建,通常用于 POST 请求。
3xx 重定向状态码:
- 301 Moved Permanently:永久重定向。
- 302 Found:临时重定向。
4xx 客户端错误状态码:
- 400 Bad Request:请求格式错误。
- 401 Unauthorized:未授权,需要身份验证。
- 404 Not Found:请求的资源不存在。
5xx 服务器错误状态码:
- 500 Internal Server Error:服务器内部错误。
- 503 Service Unavailable:服务器暂时无法处理请求。
HTTP 头
请求头:
- Content-Type:说明请求体的内容类型(如
application/json
)。 - Accept:客户端愿意接受的响应类型(如
Accept: text/html
)。 - Authorization:用于传递身份验证信息(如
Bearer
令牌)。
- Content-Type:说明请求体的内容类型(如
响应头:
- Content-Type:响应体的内容类型(如
Content-Type: text/html
)。 - Cache-Control:控制缓存行为(如
no-cache
、max-age=3600
)。
- Content-Type:响应体的内容类型(如
URL 和 URI
- URL 的组成部分:
- 协议:如
http://
或https://
。 - 域名:如
www.example.com
。 - 端口:如
:80
或:443
。 - 路径:如
/path/to/resource
。 - 查询参数:如
?key=value
。
- 协议:如
HTTP 方法的幂等性和安全性
- 幂等性:方法执行多次和执行一次的效果相同。例如,GET 和 DELETE 是幂等的,POST 通常不是。
- 安全性:指该操作不会对服务器上的资源进行修改,如 GET 方法是安全的,而 POST 则不是。
HTTP 协议版本
HTTP/1.0 和 HTTP/1.1
- HTTP/1.0:每个请求需要建立单独的 TCP 连接,请求完成后关闭连接。
- HTTP/1.1:引入了连接保持(Keep-Alive),允许在同一连接上发送多个请求。还引入了分块传输编码(chunked transfer encoding),支持部分内容请求(Range 请求)。
HTTP/2
- 多路复用:在同一个 TCP 连接上并发发送多个请求,解决了 HTTP/1.1 的队头阻塞问题。
- 头部压缩:使用 HPACK 压缩请求和响应头,减少了带宽消耗。
- 服务器推送:服务器可以主动向客户端推送资源,避免客户端需要再次请求。
HTTP/3
- 基于 QUIC 协议:使用 UDP 而非 TCP 进行传输,减少了连接建立时间,提升了传输效率。
- 抗网络抖动:改善了在高丢包率、抖动较大的网络环境下的性能。
安全性
HTTPS
- 工作原理:HTTP over TLS,使用公钥和私钥对传输的数据进行加密,确保数据的保密性和完整性。需要配置 SSL/TLS 证书。
- 证书链:理解根证书、中间证书和服务器证书之间的信任关系。
CORS(跨域资源共享)
- 原理:浏览器的同源策略限制了跨域请求,CORS 通过设置
Access-Control-Allow-Origin
等响应头来允许跨域访问。
身份验证
- 基本认证和摘要认证:基于用户名和密码的简单验证方法。
- 基于令牌的身份验证:如 JSON Web Token (JWT),在请求头中传递令牌来验证身份。
CSRF/XSS 攻击
- CSRF 防御:通过使用令牌(如 CSRF Token)或
SameSite
Cookie 来防止跨站请求伪造攻击。 - XSS 防御:通过输入输出的严格验证和编码来防止跨站脚本攻击。
HTTP 缓存
缓存控制头
- Cache-Control:如
no-store
(不缓存),no-cache
(需重新验证),max-age=3600
(缓存时长为 3600 秒)。 - ETag 和 Last-Modified:用于缓存验证,ETag 是资源的唯一标识符,而 Last-Modified 则基于资源的最后修改时间。
强缓存和协商缓存
- 强缓存:在缓存有效期内不会与服务器通信,直接使用本地缓存。
- 协商缓存:在缓存有效期过后,通过 ETag 或 Last-Modified 验证资源是否更新,决定是否重新获取资源。
CDN 和缓存层
- CDN:通过将资源缓存到靠近用户的节点,减少访问延迟,提高网站加载速度。
- 缓存层:可以在服务器端配置反向代理或缓存服务器(如 Varnish)来提高性能。
HTTP 在实际开发中的应用
API 开发和调用
- RESTful API:设计基于资源的接口,使用 HTTP 方法来表示不同的操作(如 GET 获取资源,POST 创建资源)。
- 状态码的使用:合理使用状态码来表示不同的操作结果,如 201 表示资源创建成功,204 表示删除成功但无返回内容。
调试工具
curl
:命令行工具,用于发送 HTTP 请求并查看响应。- Postman:用于调试和测试 API 的图形化工具。
- 浏览器开发者工具(DevTools):用于查看页面的 HTTP 请求和响应,分析网络性能。
- Fiddler 和 Wireshark:用于捕获和分析 HTTP 流量,帮助调试网络问题。
WebSocket
- WebSocket:提供全双工的通信能力,允许服务器和客户端实时通信。WebSocket 在 HTTP 协议的基础上进行升级,之后切换为专用的 WebSocket 协议。
HTTP 性能优化
压缩
- Gzip/Brotli:通过压缩响应内容,减少传输的数据量,从而提升页面加载速度。Brotli 在压缩效率上优于 Gzip。
请求优化
- 减少 HTTP 请求数量:通过合并 CSS、JavaScript 文件,使用 CSS Sprites 合并图片,减少页面加载时的请求数量。
- 懒加载:对于图片或其他资源,使用懒加载技术,即在用户滚动到相应位置时才加载资源。
HTTP/2 和 HTTP/3 的性能优势
- HTTP/2:多路复用、服务器推送、头部压缩等特性显著减少了请求延迟,提高了页面加载速度。
- HTTP/3:通过使用基于 UDP 的 QUIC 协议,进一步减少了网络延迟,改善了不良网络环境下的传输效率。
高级 HTTP 特性
代理和负载均衡
- 反向代理:通过反向代理服务器(如 Nginx、HAProxy)处理客户端请求,并将请求转发到后端服务器。可以提高安全性、扩展性和负载分担能力
。
- 负载均衡器:通过负载均衡器分配流量,确保多个服务器间的请求均衡,避免单一服务器过载。
Webhooks
- Webhooks:一种基于 HTTP 的事件回调机制,当特定事件发生时,服务器自动向预设的 URL 发送 POST 请求。
SSE(Server-Sent Events)
- SSE:一种单向的服务器推送技术,通过 HTTP 连接,服务器可以持续向客户端推送更新的数据,常用于实时通知等场景。
HTTP 的扩展和定制
HTTP 扩展机制
- 自定义 HTTP 头:可以通过添加自定义的请求头或响应头来传递额外的信息(如
X-Custom-Header
)。 - 扩展状态码和方法:某些特定场景下,可以定义私有的状态码或方法(尽量避免与标准规范冲突)。
传输编码
- Chunked Transfer-Encoding:用于分块传输大数据,服务器分批发送数据块,客户端将其组装成完整的响应体。
HTTP 的错误处理
重试策略
- 幂等操作:对于幂等的操作(如 GET、PUT),在请求失败时可以安全地进行重试,而不会导致数据重复提交或操作错误。
网络故障恢复
- 重试延迟:实现指数退避算法,逐步增加重试的时间间隔,以避免在网络恢复前过度占用资源。
HTTP 协议在架构中的角色
微服务通信
- RESTful API 与 gRPC:REST API 基于 HTTP 进行通信,适用于跨平台和跨语言的微服务架构;gRPC 则基于 HTTP/2,更适合高性能需求的服务间通信。
异步 HTTP 调用
- 消息队列和任务系统:在高并发或长时间任务处理中,结合队列(如 RabbitMQ)和任务系统(如 Celery)进行异步处理,减少 HTTP 请求的等待时间。
总结
HTTP 协议在现代网络应用开发中无处不在。要真正熟悉 HTTP,不仅要掌握其基础知识,还需要深入了解各个版本的特性、安全性要求、缓存机制、性能优化以及实际开发中的应用场景。通过不断学习和实践,尤其是在 API 开发、调试、优化和安全性方面的应用,可以逐步提高对 HTTP 的掌握程度。