跳转至

http 手册

以下是一个更详细的 HTTP 面试手册,包含了概念、流程、常见问题以及图表和表格来帮助理解。


HTTP 面试手册

1. HTTP 基础概念

1.1 HTTP 协议概述

HTTP(Hypertext Transfer Protocol)是一个基于请求-响应模式的应用层协议。它定义了客户端与服务器之间的数据传输规则。HTTP 是无状态协议,每个请求都是独立的,没有上下文关联。

1.2 HTTP 版本

  • HTTP/0.9: 最初版本,只有简单的 GET 请求。
  • HTTP/1.0: 支持更多请求方法(如 POST 和 HEAD)和响应状态码。
  • HTTP/1.1: 增加了持久连接、分块传输编码等特性,是目前最广泛使用的版本。
  • HTTP/2: 引入二进制帧、多路复用、头部压缩等特性,提升了性能。
  • HTTP/3: 基于 QUIC 协议,进一步减少了延迟,提高了传输效率。

1.3 HTTP 请求与响应结构

请求结构

  • 请求行: 包含 HTTP 方法、请求 URL、HTTP 版本。
  • 请求头: 包含客户端的信息、请求参数等。
  • 请求体: 包含 POST、PUT 等方法的数据内容(如表单数据)。

响应结构

  • 状态行: 包含 HTTP 版本、状态码、状态短语。
  • 响应头: 包含服务器信息、响应数据的属性等。
  • 响应体: 包含实际的响应数据(如 HTML 文档、JSON 数据)。

2. HTTP 请求方法

2.1 常见 HTTP 方法

方法 作用 是否幂等 是否安全
GET 请求资源
POST 提交数据处理请求
PUT 更新指定资源
DELETE 删除指定资源
HEAD 获取资源的头部信息
OPTIONS 获取服务器支持的请求方法
PATCH 部分更新指定资源

2.2 GET 与 POST 的区别

  • GET
  • 参数通过 URL 传递。
  • 数据大小受限于 URL 长度。
  • 请求可以被缓存、保存在浏览器历史记录中。
  • 常用于获取数据。

  • POST

  • 参数通过请求体传递。
  • 没有数据大小限制。
  • 请求不会被缓存,不会保存在浏览器历史记录中。
  • 常用于提交表单数据。

2.3 状态码详解

分类 状态码 含义 示例
1xx 100 继续(Continue) 请求收到,继续处理
2xx 200 成功(OK) 请求成功,返回所需资源
204 无内容(No Content) 请求成功,无返回内容
3xx 301 永久重定向(Moved Permanently) 请求的资源已被永久移动到新位置
304 未修改(Not Modified) 资源未修改,可以使用缓存
4xx 400 错误请求(Bad Request) 请求参数错误
401 未授权(Unauthorized) 请求未通过认证
403 禁止(Forbidden) 服务器拒绝执行请求
404 未找到(Not Found) 资源未找到
5xx 500 服务器内部错误(Internal Server Error) 服务器发生错误
503 服务不可用(Service Unavailable) 服务器暂时无法处理请求

3. HTTP 报文结构

3.1 请求报文

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Connection: keep-alive

3.2 响应报文

HTTP/1.1 200 OK
Date: Tue, 27 Jul 2021 12:28:53 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Mon, 26 Jul 2021 15:00:00 GMT
Content-Length: 44
Content-Type: text/html
Connection: Closed

<html><body><h1>Hello, World!</h1></body></html>

3.3 报文头部常见字段

字段名称 用途
Host 请求资源所在的主机地址
User-Agent 客户端软件的名称和版本
Accept 客户端能够处理的内容类型
Content-Type 请求或响应的内容类型
Content-Length 请求或响应的内容长度
Connection 控制连接的管理(如:keep-alive 以保持连接)
Cookie 客户端发送的 Cookie,用于会话管理和状态保持

4. HTTP 特性

4.1 无状态性

HTTP 是无状态协议,每个请求是独立的,服务器不会保留客户端请求的状态信息。无状态性简化了服务器的设计,但在需要状态管理时,需要使用 Cookie、Session 或 Token。

4.2 持久连接

HTTP/1.1 默认使用持久连接,允许多个请求复用同一个 TCP 连接,减少了握手延迟,提高了性能。

4.3 缓存机制

  • 强缓存: 使用 ExpiresCache-Control 头来控制缓存。
  • 协商缓存: 使用 Last-ModifiedETag 头来判断资源是否需要更新。

4.4 重定向

服务器可以通过返回 3xx 状态码和 Location 头部实现重定向,将客户端请求重定向到其他 URL。

5. HTTP 安全性

5.1 HTTPS

HTTPS(HTTP Secure)是在 HTTP 基础上增加了 SSL/TLS 加密层,保障数据传输的安全性。它通过证书验证服务器身份,并加密数据以防止被窃听或篡改。

5.2 常见的安全问题

  • 中间人攻击: 攻击者窃听或篡改客户端与服务器之间的通信。
  • XSS(跨站脚本攻击): 攻击者通过注入恶意脚本来攻击用户的浏览器。
  • CSRF(跨站请求伪造): 攻击者诱使用户在已认证的状态下执行恶意操作。

6. HTTP/2 和 HTTP/3

6.1 HTTP/2

  • 二进制协议: HTTP/2 使用二进制帧进行传输,提高了传输效率。
  • 多路复用: 一个连接上可以并行发送多个请求和响应,减少了延迟。
  • 头部压缩: 使用 HPACK 算法对头部进行压缩,降低了数据传输量。

6.2 HTTP/3

  • 基于 QUIC: HTTP/3 使用基于 UDP 的 QUIC 协议代替了传统的 TCP,减少了连接建立和恢复的延迟。
  • 更快的连接恢复: QUIC 支持更快速的连接恢复机制,特别是在网络不稳定的环境下。

7. 面试常见问题

7.1 HTTP 和 HTTPS 的区别

  • 安全性: HTTPS 增加了 SSL/TLS 加密层,保障数据传输的安全性。
  • 端口: HTTP 使用 80 端口,HTTPS 使用 443 端口。
  • 速度: HTTPS 由于加密解密过程,可能稍慢于 HTTP,但由于 HTTP/2 的引入,差距缩小。

7.2 如何实现 HTTP 缓存机制?

使用 Cache-ControlExpires 进行强缓存控制,使用 ETagLast-Modified 进行协商缓存控制。

7.3 为什么 HTTP 是无状态的?

无状态性简化了服务器的设计,降低了资源占用,但在需要状态管理时,需要依赖 Cookie、Session 等技术。


继续深入探讨 HTTP 相关知识,并补充更多内容。


8. HTTP 会话管理

Cookie 是一种在客户端存储少量数据的技术,通常用于会话管理、用户跟踪和个性化设置。 - 持久性: Cookie 可以设置过期时间,成为持久 Cookie。 - 作用域: Cookie 的作用域由 DomainPath 属性决定。 - 安全性: 通过 Secure 标记只允许在 HTTPS 连接中传输,HttpOnly 标记禁止 JavaScript 访问。

Cookie 示例:

Set-Cookie: sessionId=abc123; Expires=Wed, 09 Jun 2024 10:18:14 GMT; Path=/; Secure; HttpOnly

8.2 Session

Session 是一种在服务器端保存用户会话数据的技术,通常使用 Session ID 进行标识。Session ID 通常通过 Cookie 或 URL 参数传递。 - 持久性: Session 通常是短暂的,默认在用户关闭浏览器或超时后失效。 - 存储位置: Session 数据存储在服务器端,通常在内存、数据库或文件系统中。

8.3 Token

Token 是一种无状态的认证机制,常见的如 JWT(JSON Web Token)。它包含用户的身份信息,服务器通过验证 Token 来识别用户,而无需存储会话数据。 - 无状态性: Token 是无状态的,适合分布式系统。 - 安全性: Token 可以被签名和加密,确保数据完整性和保密性。

9. HTTP 报头详解

9.1 常见请求头字段

字段名称 解释 示例
Host 指定请求资源的主机和端口 Host: www.example.com
User-Agent 客户端软件信息 User-Agent: Mozilla/5.0
Accept 客户端可处理的 MIME 类型 Accept: text/html,application/xhtml+xml
Content-Type 请求体内容的类型 Content-Type: application/json
Authorization 请求资源的认证信息 Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Referer 请求的来源页面 Referer: https://www.google.com/
Cookie 请求附带的 Cookie 信息 Cookie: sessionId=abc123

9.2 常见响应头字段

字段名称 解释 示例
Content-Type 响应内容的 MIME 类型 Content-Type: text/html; charset=UTF-8
Content-Length 响应体的字节长度 Content-Length: 1234
Set-Cookie 设置客户端的 Cookie Set-Cookie: sessionId=abc123; HttpOnly
Cache-Control 指定缓存策略 Cache-Control: no-cache
Expires 指定资源的过期时间 Expires: Wed, 09 Jun 2024 10:18:14 GMT
ETag 资源的实体标签,用于缓存验证 ETag: "5d8c72a5edda9c7"
Server 服务器软件的信息 Server: Apache/2.4.1 (Unix)

10. HTTP 缓存机制

10.1 强缓存

强缓存 是指客户端可以直接从缓存中获取资源,而不需要向服务器发送请求。强缓存由 ExpiresCache-Control 头部控制。

  • Expires: 指定资源的到期时间,基于服务器时间。 plaintext Expires: Wed, 09 Jun 2024 10:18:14 GMT

  • Cache-Control: 提供更灵活的缓存控制选项,例如:

  • max-age: 指定资源的最大缓存时间。
  • no-cache: 每次使用缓存前必须向服务器验证。
  • no-store: 不缓存请求或响应的任何内容。

plaintext Cache-Control: max-age=3600

10.2 协商缓存

协商缓存 是指客户端需要向服务器验证缓存的资源是否已更新,如果未更新,可以继续使用缓存资源。常用的头部字段有 Last-ModifiedETag

  • Last-Modified: 指定资源的最后修改时间。 plaintext Last-Modified: Wed, 09 Jun 2023 10:18:14 GMT

  • ETag: 为资源生成唯一标识符,用于判断资源是否修改。 plaintext ETag: "5d8c72a5edda9c7"

11. HTTP 状态码详解

11.1 1xx 信息响应

状态码 含义 说明
100 继续(Continue) 客户端应继续请求
101 切换协议(Switching Protocols) 服务器同意切换协议

11.2 2xx 成功响应

状态码 含义 说明
200 成功(OK) 请求成功,返回请求的数据
201 已创建(Created) 请求成功并且服务器创建了新资源
204 无内容(No Content) 请求成功,但没有返回内容

11.3 3xx 重定向响应

状态码 含义 说明
301 永久移动(Moved Permanently) 请求的资源已被永久移动到新位置
302 临时移动(Found) 请求的资源暂时从不同的 URI 响应
304 未修改(Not Modified) 缓存的资源仍是最新的,可以使用

11.4 4xx 客户端错误

状态码 含义 说明
400 错误请求(Bad Request) 请求存在语法问题,服务器无法理解
401 未授权(Unauthorized) 请求需要身份验证
403 禁止(Forbidden) 服务器理解请求,但拒绝执行
404 未找到(Not Found) 服务器无法找到请求的资源

11.5 5xx 服务器错误

状态码 含义 说明
500 服务器内部错误(Internal Server Error) 服务器遇到意外情况,无法完成请求
502 错误网关(Bad Gateway) 服务器作为网关或代理时收到无效响应
503 服务不可用(Service Unavailable) 服务器暂时无法处理请求

12. HTTP 与 RESTful API

12.1 RESTful API 概念

REST(Representational State Transfer) 是一种架构风格,常用于设计网络应用程序。RESTful API 遵循以下原则: - 资源: 一切皆资源,每个资源都由一个 URI 唯一标识。 - 方法: 使用标准的 HTTP 方法(GET、POST、PUT、DELETE)对资源进行操作。 - 状态转移: 通过超链接在资源之间导航,实现状态转移。

12.2 RESTful API 的设计要点

  • URI 设计: 简洁且有层次结构的 URI 设计,如 /users/{id}/posts
  • 使用 HTTP 方法: 根据操作类型选择合适的 HTTP 方法。
  • 返回格式: 通常使用 JSON 作为数据交换格式。
  • 状态码: 使用标准的 HTTP 状态码表示操作结果。

12.3 RESTful API 的优势

  • 简单性: 基于 HTTP 协议,易于理解和实现。
  • 无状态性: 每个请求独立,不依赖于服务器的存储状态。
  • 可扩展性: RESTful API 适合大规模分布式系统的设计。

13. HTTP 安全与优化

13.1 HTTP 安全性

  • SSL/TLS: 使用 SSL/TLS 协议来加密 HTTP 通信,形成 HTTPS,保障数据传输的安全性。
  • 跨站脚本攻击(XSS): 通过输出过滤、防止用户输入恶意脚本来防范 XSS 攻击。
  • 跨站请求伪造(CSRF): 通过验证请求来源和使用 CSRF Token 防止 CSRF 攻击。

13.2 HTTP 性能优化

  • 压缩: 使用 Gzip 压缩响应数据,减少数据传输量。
  • 缓存: 利用强缓存和协商缓存减少服务器负担和响应时间。
  • 内容分发网络(CDN): 使用 CDN 加速内容分发,减少服务器负载。

继续扩展 HTTP 面试手册的内容,以帮助你全面了解 HTTP 协议及其相关的技术细节。


14. HTTP 代理服务器

14.1 正向代理

正向代理 是位于客户端和服务器之间的一种代理服务器,客户端通过正向代理访问目标服务器。常见用途包括: - 访问控制: 通过代理服务器过滤不符合策略的请求。 - 缓存: 在代理服务器中缓存响应,以减少请求次数和带宽消耗。 - 匿名访问: 通过代理隐藏客户端的真实 IP 地址。

正向代理示意图:

客户端 --> 代理服务器 --> 目标服务器

14.2 反向代理

反向代理 是位于服务器端的一种代理服务器,客户端并不知道其请求的资源实际来自哪个服务器。常见用途包括: - 负载均衡: 反向代理将请求分发到多个后端服务器,以实现负载均衡。 - 安全性: 反向代理可以隐藏后端服务器的真实地址,增强安全性。 - 缓存: 在反向代理中缓存静态内容,减少后端服务器的负载。

反向代理示意图:

客户端 --> 反向代理 --> 多个后端服务器

14.3 透明代理

透明代理 是一种不需要客户端配置的代理服务器。客户端发送的请求被透明代理捕获和处理,而客户端不感知代理的存在。常用于网络监控和内容过滤。

15. HTTP/2 协议详解

15.1 HTTP/2 简介

HTTP/2 是 HTTP/1.1 的升级版本,旨在提高 Web 性能和效率。HTTP/2 的主要特点包括: - 二进制帧: HTTP/2 使用二进制格式传输数据,相比 HTTP/1.x 的文本格式更高效。 - 多路复用: 在同一个 TCP 连接上,可以并发处理多个请求和响应,避免了 HTTP/1.x 的队头阻塞(Head-of-Line Blocking)。 - 头部压缩: HTTP/2 使用 HPACK 算法对请求和响应头部进行压缩,减少传输的数据量。 - 服务器推送: 服务器可以在客户端请求之前,主动向客户端推送资源,进一步提升性能。

15.2 HTTP/2 与 HTTP/1.1 的对比

特性 HTTP/1.1 HTTP/2
数据格式 文本 二进制
多路复用 不支持 支持
头部压缩 不支持 支持(HPACK)
服务器推送 不支持 支持
连接管理 多个并发连接 单个连接

15.3 HTTP/2 的优化机制

  • 连接复用: 通过单个 TCP 连接传输多个并发请求,减少了 TCP 握手和连接管理的开销。
  • 流优先级: 每个 HTTP/2 流都有一个优先级,服务器可以根据优先级决定资源分配策略。
  • 流量控制: HTTP/2 允许客户端和服务器对流进行流量控制,避免带宽被某个流独占。

16. HTTP/3 与 QUIC 协议

16.1 HTTP/3 简介

HTTP/3 是基于 QUIC 协议的 HTTP 协议版本,旨在进一步提高网络传输效率和可靠性。QUIC 是由 Google 开发的基于 UDP 的传输协议。

16.2 HTTP/3 的优势

  • 基于 UDP: QUIC 基于 UDP,而非 TCP,这使得连接建立更快,数据传输延迟更低。
  • 无队头阻塞: QUIC 通过多路传输机制避免了 TCP 的队头阻塞问题。
  • 集成 TLS: QUIC 将 TLS 集成到协议本身中,实现了更快速的加密握手过程。

16.3 HTTP/3 的关键技术

  • 连接迁移: QUIC 支持连接迁移,这意味着在网络切换时,客户端和服务器之间的连接不会中断。
  • 包重传机制: QUIC 使用包级别的重传机制,减少了数据丢失对传输速度的影响。

17. HTTP 方法安全性与幂等性

17.1 HTTP 方法安全性

HTTP 方法根据其对服务器资源的影响可以分为两类: - 安全方法: 不会修改服务器资源的 HTTP 方法,主要包括 GET、HEAD 和 OPTIONS。安全方法的请求可以重复执行,而不会改变服务器的状态。 - 非安全方法: 可能修改服务器资源的 HTTP 方法,主要包括 POST、PUT、DELETE。使用这些方法时,需要注意请求的副作用。

17.2 HTTP 方法的幂等性

幂等性是指某个操作无论执行多少次,结果都不会改变。在 HTTP 方法中,以下方法是幂等的: - GET: 多次获取同一资源,结果相同。 - PUT: 多次上传相同的资源,结果相同。 - DELETE: 多次删除相同的资源,结果相同(资源不存在时删除操作无效)。

17.3 非幂等方法

POST 方法通常用于创建资源或提交数据,因为每次 POST 请求都会导致服务器状态发生变化,因此它是非幂等的。

18. HTTP 状态码详解(补充)

18.1 426 Upgrade Required

426 Upgrade Required 状态码表示客户端应切换到不同的协议版本,例如从 HTTP/1.1 升级到 HTTP/2。

451 Unavailable For Legal Reasons 状态码表示由于法律原因,服务器无法提供所请求的资源。例如,某些国家或地区的法律限制访问某些内容。

19. HTTP 报文的详细结构

19.1 HTTP 请求报文

HTTP 请求报文由以下几部分组成: 1. 请求行: 包含 HTTP 方法、请求目标 URI 和协议版本。例如: GET /index.html HTTP/1.1 2. 请求头部: 包含客户端请求的各种信息和参数,例如 Host、User-Agent 等。 3. 空行: 请求头部与请求体之间的空行,用于分隔头部和正文。 4. 请求体: 发送给服务器的数据,通常用于 POST、PUT 等方法。

19.2 HTTP 响应报文

HTTP 响应报文由以下几部分组成: 1. 状态行: 包含协议版本、状态码和状态描述。例如: HTTP/1.1 200 OK 2. 响应头部: 包含服务器端的信息和请求的响应参数,例如 Content-Type、Content-Length 等。 3. 空行: 响应头部与响应体之间的空行,用于分隔头部和正文。 4. 响应体: 服务器返回给客户端的数据,通常是 HTML、JSON 等格式的内容。

20. 常见的 HTTP 安全漏洞及防护

20.1 跨站脚本攻击(XSS)

XSS 是一种通过在网页中注入恶意脚本来攻击用户的技术,主要防护措施包括: - 输入过滤: 对用户输入的数据进行严格的过滤和验证。 - 输出编码: 在输出到网页前,对数据进行编码,避免脚本执行。 - 内容安全策略(CSP): 使用 CSP 限制网页中允许执行的脚本来源。

20.2 跨站请求伪造(CSRF)

CSRF 是一种通过伪造用户请求来执行未授权操作的攻击,主要防护措施包括: - CSRF Token: 在表单提交时加入唯一的 Token,并在服务器端验证该 Token 的有效性。 - 验证来源: 验证请求的来源是否可信,例如通过 Referer 头部或 Origin 头部进行检查。 - 双重提交 Cookie: 在 Cookie 和表单中同时传递 Token,并在服务器端进行比对。

20.3 中间人攻击(MITM)

中间人攻击 是指攻击者在客户端与服务器之间拦截和篡改通信内容,主要防护措施包括: - 使用 HTTPS: 通过 SSL/TLS 加密通信,防止数据被篡改和窃取。 - 证书验证: 客户端验证服务器提供的 SSL 证书是否可信,避免连接到假冒服务器。


继续扩展 HTTP 面试手册的内容,为你提供更全面的知识覆盖。


21. HTTP Keep-Alive 机制

21.1 Keep-Alive 简介

Keep-Alive 机制,也称为持久连接,是 HTTP/1.1 的默认行为。它允许在同一 TCP 连接上复用多个 HTTP 请求和响应,减少连接建立和关闭的开销。

21.2 Keep-Alive 的优势

  • 减少延迟: 避免每次请求都要重新建立 TCP 连接,从而降低延迟。
  • 节省资源: 复用连接可以减少服务器和客户端的资源消耗,如 CPU 和内存使用。

21.3 Keep-Alive 的工作原理

  • 持久连接: HTTP/1.1 默认使用持久连接,除非客户端或服务器明确关闭连接。
  • Connection: keep-alive: 在 HTTP/1.0 中,客户端和服务器可以通过 Connection: keep-alive 头部指示继续保持连接。
  • 连接超时: 服务器通常设置一个超时时间,如果在此时间内没有新的请求,连接将被关闭。

22. HTTP 认证机制

22.1 Basic 认证

Basic 认证 是最简单的 HTTP 认证机制,客户端通过将用户名和密码进行 Base64 编码后发送给服务器。尽管实现简单,但其安全性较低,因为编码后的字符串容易被解码。

Basic 认证示例:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

22.2 Digest 认证

Digest 认证 提供了比 Basic 认证更高的安全性,通过对用户凭据进行 MD5 哈希,并附加随机数(nonce)来防止重放攻击。

22.3 Bearer Token

Bearer Token 是 OAuth 2.0 中常用的认证方式,客户端通过携带令牌(Token)来访问受保护的资源。服务器验证令牌的有效性后允许访问。

Bearer Token 示例:

Authorization: Bearer <token>

22.4 HTTP 认证头部

常用的 HTTP 认证头部包括: - Authorization: 客户端发送的认证信息。 - WWW-Authenticate: 服务器要求客户端提供认证信息时返回的头部。

23. HTTP 头部详解

23.1 常见请求头部

  • Host: 指定请求的主机和端口号,HTTP/1.1 中是必需的。
  • User-Agent: 标识客户端的浏览器和操作系统信息。
  • Accept: 指定客户端能够处理的内容类型(MIME 类型)。
  • Accept-Encoding: 指定客户端支持的内容编码方式,如 gzip、deflate。
  • Accept-Language: 指定客户端首选的语言和区域。

23.2 常见响应头部

  • Content-Type: 指定响应内容的 MIME 类型,如 text/htmlapplication/json
  • Content-Length: 指定响应内容的字节长度。
  • Content-Encoding: 指定响应内容的编码方式,如 gzip
  • Cache-Control: 控制缓存的行为,如 no-cacheno-store
  • Expires: 指定响应内容的过期时间,用于缓存控制。

23.3 安全相关头部

  • Strict-Transport-Security (HSTS): 强制客户端通过 HTTPS 访问,并防止降级攻击。
  • Content-Security-Policy (CSP): 限制网页中可以执行的内容来源,防止 XSS 攻击。
  • X-Content-Type-Options: 防止浏览器 MIME 类型嗅探,确保内容以声明的类型处理。
  • X-Frame-Options: 防止网页被嵌入到其他站点的 iframe 中,防止点击劫持攻击。

24. HTTP 协议在移动端的应用

24.1 移动端 HTTP 优化

  • 减少请求数: 合并请求,使用雪碧图(Sprite)、内联资源等技术减少 HTTP 请求数。
  • 内容压缩: 使用 Gzip、Brotli 等压缩技术减小响应内容大小。
  • 图片优化: 使用 WebP 等高效图片格式,并根据网络状况调整图片质量。
  • 懒加载: 延迟加载不在视口内的资源,以减少初始加载时间。

24.2 移动端缓存策略

  • 强缓存: 使用 Cache-ControlExpires 头部设置静态资源的缓存时间。
  • 协商缓存: 使用 ETagLast-Modified 头部实现资源更新的检查机制。

25. HTTP 请求方法的高级用法

25.1 PUT 与 PATCH 的区别

  • PUT: 用于更新资源的全部内容,客户端发送的请求体包含完整的资源表示。
  • PATCH: 用于部分更新资源,客户端发送的请求体只包含要修改的字段。

示例:

PUT /users/1 HTTP/1.1
Content-Type: application/json

{
  "name": "John Doe",
  "email": "john.doe@example.com"
}
PATCH /users/1 HTTP/1.1
Content-Type: application/json

{
  "email": "new.email@example.com"
}

25.2 OPTIONS 方法

OPTIONS 方法用于查询服务器支持的 HTTP 方法和其他通信选项,通常用于跨域请求的预检(preflight)请求。

示例:

OPTIONS /api/v1/users HTTP/1.1
Host: example.com

服务器的响应可能包含以下头部:

Allow: GET, POST, PUT, DELETE, OPTIONS

25.3 TRACE 方法

TRACE 方法用于回显客户端发送的请求,主要用于调试目的。由于安全性较低,现代浏览器和服务器通常禁用该方法。

26. HTTP 与 WebSocket

26.1 WebSocket 简介

WebSocket 是一种在单个 TCP 连接上提供全双工通信的协议,用于实时应用,如在线聊天和实时数据更新。与 HTTP 的主要区别在于,WebSocket 一旦连接建立,客户端和服务器之间可以相互发送数据,而无需再发起新的 HTTP 请求。

26.2 HTTP 和 WebSocket 的关系

  • 握手阶段: WebSocket 连接从 HTTP 协议开始,通过 HTTP Upgrade 头部将协议升级为 WebSocket。
  • 持久连接: WebSocket 连接一旦建立,通常保持打开状态,直到客户端或服务器主动关闭连接。
  • 低延迟: WebSocket 适用于低延迟的应用场景,因为它消除了 HTTP 的请求/响应延迟。

26.3 WebSocket 的应用场景

  • 实时聊天应用: WebSocket 支持双向通信,适合用于实现实时聊天功能。
  • 实时数据推送: 在金融、体育等需要实时数据更新的应用中,WebSocket 可以实时推送数据到客户端。
  • 多人在线游戏: WebSocket 的低延迟特性使其成为多人在线游戏通信的理想选择。

27. HTTP 的演进及未来发展

27.1 HTTP/1.0 到 HTTP/2 的演进

  • HTTP/1.0: 早期版本,采用无状态的请求/响应模型,每次请求都需要重新建立连接。
  • HTTP/1.1: 引入持久连接和管道化,减少连接开销,并支持 Host 头部,实现虚拟主机功能。
  • HTTP/2: 通过多路复用、头部压缩和服务器推送等机制,大幅提升了 Web 性能。

27.2 HTTP/3 的未来

HTTP/3 基于 QUIC 协议,使用 UDP 代替 TCP 提供可靠传输,目标是进一步降低延迟,提高网络传输效率。HTTP/3 的发展将继续推动互联网协议的演进,特别是在移动设备和高并发场景下的应用。

27.3 基于 HTTP 的现代应用协议

  • GraphQL: 基于 HTTP 的查询语言,允许客户端指定所需的数据结构,减少数据传输量。
  • gRPC: 基于 HTTP/2 的远程过程调用(RPC)框架,使用 Protocol Buffers 进行序列化,支持高效的数据传输和双向流通信。

继续扩展 HTTP 面试手册,涵盖更广泛的主题。


28. HTTP CORS 跨域资源共享

28.1 CORS 概述

跨域资源共享(CORS) 是一种机制,允许浏览器从与提供资源的服务器不同的域中请求资源。CORS 依赖于 HTTP 头部来告知浏览器请求是否被允许跨域。

28.2 同源策略

同源策略要求,网页的资源只能从与其所在页面相同源的 URL 获取。源包括协议、域名和端口。CORS 允许在符合条件时突破同源策略。

28.3 CORS 的关键头部

  • Access-Control-Allow-Origin: 指定哪些域名可以访问资源,常见值包括单个域名或通配符 *
  • Access-Control-Allow-Methods: 指定允许的 HTTP 方法,如 GET, POST, PUT
  • Access-Control-Allow-Headers: 指定允许的请求头部,如 Content-Type
  • Access-Control-Allow-Credentials: 指定是否允许跨域请求携带凭证(如 Cookies)。
  • Access-Control-Max-Age: 指定浏览器可以缓存预检请求结果的时间,以秒为单位。

28.4 预检请求

当跨域请求使用了非简单请求方法(如 PUT, DELETE)或自定义头部时,浏览器会在实际请求前发送一个 OPTIONS 请求,称为预检请求(Preflight Request)。服务器响应后,浏览器才会发送实际请求。

28.5 实战示例

CORS 请求示例:

GET /api/data HTTP/1.1
Host: api.example.com
Origin: https://www.example.com

CORS 响应示例:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type

29. HTTP 流媒体传输

29.1 流媒体概述

流媒体传输 是指在网络上实时传送音频、视频或多媒体数据的技术。HTTP 常用于传输流媒体内容,如视频点播、直播等。

29.2 基于 HTTP 的流媒体协议

  • HLS(HTTP Live Streaming): 由 Apple 开发的流媒体协议,使用 HTTP/HTTPS 传输视频内容,支持多种比特率的切换,适用于直播和点播。
  • DASH(Dynamic Adaptive Streaming over HTTP): 通过分片将视频内容按质量和比特率进行动态调整,广泛支持各类终端设备。

29.3 流媒体传输的 HTTP 头部

  • Content-Type: 指定媒体类型,如 video/mp4, audio/mpeg
  • Content-Length: 指定视频或音频片段的长度,以字节为单位。
  • Accept-Ranges: 指定是否支持范围请求,通常用于视频的快进和倒退。
  • Transfer-Encoding: chunked: 用于分块传输流媒体内容,避免一次性发送过大的数据包。

29.4 实战示例

HLS 请求示例:

GET /stream/playlist.m3u8 HTTP/1.1
Host: media.example.com

HLS 响应示例:

HTTP/1.1 200 OK
Content-Type: application/vnd.apple.mpegurl
Content-Length: 320

30. HTTP 安全性最佳实践

30.1 使用 HTTPS

HTTPS 是 HTTP 的加密版本,使用 SSL/TLS 协议加密数据传输,确保通信的保密性、完整性和身份验证。所有现代 Web 应用都应强制使用 HTTPS 进行数据传输。

30.2 强制 HTTPS

通过设置 HTTP Strict Transport Security (HSTS) 头部,可以告知浏览器在未来的请求中自动使用 HTTPS,防止中间人攻击。

HSTS 头部示例:

Strict-Transport-Security: max-age=31536000; includeSubDomains

30.3 防范常见攻击

  • 跨站脚本攻击(XSS): 通过使用 Content-Security-Policy (CSP) 头部限制资源的加载来源。
  • 跨站请求伪造(CSRF): 使用 CSRF 令牌(Token)来验证每个请求的合法性,防止恶意网站冒充用户发送请求。
  • 点击劫持: 使用 X-Frame-Options 头部防止页面被嵌入到 iframe 中,从而避免点击劫持。

30.4 API 安全性

为 REST API 添加身份验证和授权机制,如使用 OAuth 2.0JWT(JSON Web Token),确保 API 资源只能被授权用户访问。

31. HTTP 状态码的高级用法

31.1 重定向状态码

  • 301 Moved Permanently: 用于永久性重定向,浏览器会缓存重定向结果。
  • 302 Found: 用于临时重定向,浏览器不会缓存结果。
  • 303 See Other: 通常用于表单提交后重定向到另一资源,客户端应使用 GET 请求。
  • 307 Temporary Redirect: 类似于 302,但要求客户端重新发起相同的请求方法(如 POST)。
  • 308 Permanent Redirect: 类似于 301,但要求客户端使用相同的请求方法进行重定向。

31.2 客户端错误状态码

  • 400 Bad Request: 表示请求格式错误或参数无效。
  • 401 Unauthorized: 表示请求需要身份验证。
  • 403 Forbidden: 表示服务器拒绝请求,即使客户端已通过身份验证。
  • 404 Not Found: 表示请求的资源不存在。
  • 429 Too Many Requests: 表示客户端发送了过多请求,被限速。

31.3 服务器错误状态码

  • 500 Internal Server Error: 表示服务器内部错误,无法处理请求。
  • 502 Bad Gateway: 表示服务器作为网关或代理时收到无效响应。
  • 503 Service Unavailable: 表示服务器临时不可用,通常用于维护或过载。
  • 504 Gateway Timeout: 表示服务器作为网关或代理时,等待另一个服务器的响应超时。

32. HTTP 与 RESTful API

32.1 RESTful API 的基本原则

REST(Representational State Transfer) 是一种软件架构风格,利用 HTTP 协议的语义构建面向资源的 API。RESTful API 遵循以下原则:

  • 无状态性: 每个请求都是独立的,服务器不保存客户端的状态。
  • 统一接口: 通过标准的 HTTP 方法(GET, POST, PUT, DELETE)对资源进行操作。
  • 资源表示: 资源通过 URL 表示,通常使用 JSON 进行数据交换。
  • 客户端-服务器架构: 客户端和服务器的职责明确分离,客户端只负责界面和用户交互。

32.2 RESTful API 的设计

  • 资源路径: 使用名词表示资源,如 /users 表示用户资源。
  • HTTP 方法: 使用不同的 HTTP 方法进行资源操作,如 GET /users 获取用户列表,POST /users 创建新用户。
  • 状态码: 使用适当的 HTTP 状态码表示操作结果,如 201 Created 表示成功创建资源。

32.3 RESTful API 的版本控制

通过在 URL 或请求头中指定 API 版本号来实现版本控制,确保 API 的向后兼容性。

示例:

GET /api/v1/users

32.4 RESTful API 的安全性

  • 身份验证: 使用 OAuth 2.0JWT 确保只有授权的用户可以访问 API。
  • 速率限制: 限制客户端在一定时间内的请求数量,防止滥用 API 资源。
  • 数据加密: 使用 HTTPS 确保数据在传输过程中不会被窃取或篡改。

33. HTTP 的未来发展趋势

33.1 基于 HTTP/3 的应用场景

HTTP/3 基于 QUIC 协议,旨在减少连接建立时间和提高传输效率。适用于延迟敏感的应用,如视频会议、在线游戏和高频交易。

33.2 增强型安全协议

随着网络攻击的复杂性增加,未来的 HTTP 版本可能集成更多的安全特性,如基于零信任模型的身份验证和更强大的加密算法。

33.3 HTTP 的去中心化应用

随着 Web3 和区块链技术的发展,去中心化应用(DApps)可能会使用 HTTP 协议与智能合约交互,推动 Web 技术向去中心化方向发展。


继续扩展 HTTP 面试手册,涵盖更多高级话题和技术细节:


34. HTTP 负载均衡

34.1 负载均衡概述

负载均衡 是指将客户端的请求分配到多个服务器上,以提高应用的可用性、性能和扩展性。负载均衡可以在不同层次进行,如 DNS 层、应用层和网络层。

34.2 负载均衡算法

  • 轮询(Round Robin): 按顺序将请求分配给每个服务器。
  • 加权轮询(Weighted Round Robin): 根据服务器的权重分配请求,权重越高的服务器获得更多请求。
  • 最少连接(Least Connections): 将请求分配给当前连接数最少的服务器。
  • IP 哈希(IP Hash): 根据客户端 IP 地址的哈希值选择服务器,确保同一 IP 的请求始终被分配到同一服务器。

34.3 负载均衡的实现方式

  • DNS 负载均衡: 通过 DNS 将不同的 IP 地址分配给请求者,适合于较低层次的负载均衡。
  • 硬件负载均衡器: 专用硬件设备,能够处理大量的流量,通常配置复杂但性能高。
  • 软件负载均衡器: 软件解决方案,如 NGINX、HAProxy,具有灵活性和可配置性。

34.4 实战示例

NGINX 配置示例:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

35. HTTP 缓存机制

35.1 缓存概述

缓存 机制用于减少重复请求的开销,提升应用性能和响应速度。缓存可以发生在浏览器、代理服务器和 CDN 中。

35.2 HTTP 缓存头部

  • Cache-Control: 指定缓存指令,如 max-age, no-cache, no-store
  • Expires: 指定资源过期的时间,若缓存时间过期,缓存内容被视为无效。
  • ETag: 资源的唯一标识符,客户端可以使用它来验证缓存是否仍然有效。
  • Last-Modified: 资源的最后修改时间,客户端可以根据此时间来检查资源是否更新。

35.3 缓存策略

  • 强缓存: 使用 Cache-ControlExpires 头部控制缓存内容的有效期。
  • 协商缓存: 使用 ETagLast-Modified 头部,客户端请求时检查缓存是否有效,服务器根据缓存状态决定是否返回新内容。

35.4 实战示例

缓存请求示例:

GET /resource HTTP/1.1
Host: example.com
Cache-Control: max-age=3600

缓存响应示例:

HTTP/1.1 200 OK
Cache-Control: max-age=3600
ETag: "abc123"

36. HTTP/2 和 HTTP/3 的对比

36.1 HTTP/2 的特性

  • 多路复用(Multiplexing): 在一个连接上并行处理多个请求和响应,避免了队头阻塞问题。
  • 头部压缩(Header Compression): 使用 HPACK 算法压缩 HTTP 头部,减少带宽占用。
  • 服务器推送(Server Push): 允许服务器主动推送资源到客户端,减少加载时间。

36.2 HTTP/3 的特性

  • 基于 QUIC 协议: HTTP/3 使用 QUIC 协议作为传输层,提供更低的延迟和更好的拥塞控制。
  • 零连接建立(Zero Round Trip Time, 0-RTT): 支持零延迟连接建立,提升连接速度。
  • 更强的加密: QUIC 协议内置了加密机制,确保数据传输的安全性。

36.3 性能对比

特性 HTTP/1.1 HTTP/2 HTTP/3
多路复用
头部压缩
服务器推送
传输层协议 TCP TCP QUIC
连接建立延迟 较低 更低

37. HTTP/2 流量控制

37.1 流量控制概述

流量控制 是一种机制,用于控制数据在客户端和服务器之间的传输速率,避免网络拥堵和数据丢失。

37.2 HTTP/2 的流量控制机制

  • 窗口大小(Window Size): 服务器和客户端使用流量控制窗口大小来控制接收数据的能力。窗口大小在 HTTP/2 中是动态调整的,确保数据传输的高效性。

37.3 流量控制示例

设置流量控制窗口:

SETTINGS FRAME: WINDOW_SIZE = 65535

38. HTTP 的 API 设计原则

38.1 RESTful API 设计

  • 资源的唯一性: 每个资源都有一个唯一的 URL。
  • 无状态性: 每次请求都包含所有处理该请求所需的信息。
  • 层次化系统: 通过中间层(如负载均衡器、缓存)提升系统的可扩展性和性能。
  • 表现层: 资源通过统一的接口进行操作,通常使用 JSON 或 XML 作为数据格式。

38.2 设计良好的 API

  • 简洁性: API 设计应尽量简洁易懂,避免复杂的路径和参数。
  • 一致性: API 的设计应保持一致性,如使用统一的命名规则和响应格式。
  • 文档化: 提供详尽的 API 文档,描述每个端点的功能、请求参数和响应格式。

38.3 实战示例

API 设计:

GET /api/v1/users/{id}   # 获取用户信息
POST /api/v1/users       # 创建新用户
PUT /api/v1/users/{id}   # 更新用户信息
DELETE /api/v1/users/{id} # 删除用户

以上是对 HTTP 相关的更详细的内容,包括负载均衡、缓存机制、HTTP/2 和 HTTP/3 的对比、流量控制、API 设计等方面。如果你还有其他问题或需要更多的详细信息,请告知我!

流量控制和API设计

流量控制

1. 流量控制概述

流量控制是一种机制,旨在管理和调节数据在网络中的传输速率,以防止网络拥塞、数据丢失以及确保传输的高效性。它在客户端和服务器之间进行,尤其在高并发场景下,流量控制的有效性至关重要。

2. 流量控制的作用

  • 防止拥塞: 通过限制数据发送速率,避免网络带宽被超负荷使用,从而防止网络拥塞。
  • 数据完整性: 控制流量可以减少数据包丢失的风险,确保数据完整传输。
  • 优化资源利用: 根据接收端的处理能力动态调整发送数据的速率,避免资源浪费。

3. HTTP/2 流量控制

3.1 流量控制窗口(Flow Control Window)
  • 初始窗口大小: HTTP/2 的每个连接和流都有一个初始窗口大小,默认值通常为 65,535 字节。这个值可以通过设置帧(SETTINGS FRAME)进行调整。
  • 动态调整: 在数据传输过程中,接收方可以通过 WINDOW_UPDATE 帧动态调整窗口大小,以告知发送方其接收数据的能力。
3.2 流量控制的层次
  • 连接级流量控制: 控制整个 HTTP/2 连接上的流量传输,确保不会超出接收方的处理能力。
  • 流级流量控制: 控制单个流的数据传输,避免某一流占用过多带宽,影响其他流的数据传输。
3.3 实战示例

HTTP/2 流量控制的工作流程: 1. 客户端与服务器建立 HTTP/2 连接,初始窗口大小为 65,535 字节。 2. 服务器根据窗口大小,按需发送数据。 3. 如果客户端的接收缓冲区接近满载,它会发送 WINDOW_UPDATE 帧,减少窗口大小。 4. 服务器接收到更新的窗口大小后,调整数据发送速率,避免数据丢失或传输阻塞。

API 设计

1. API 设计概述

API(应用程序接口)是应用程序之间通信的桥梁。良好的 API 设计有助于提高系统的可维护性、扩展性以及开发效率。RESTful API 是目前最流行的设计风格之一,它依赖 HTTP 协议,以资源为中心,通过标准化的操作进行数据交互。

2. RESTful API 设计原则

2.1 资源的唯一性

每个资源都有一个唯一的 URI 标识符,例如 /users/{id} 表示特定用户资源。

2.2 无状态性

每个请求都是独立的,必须包含处理该请求所需的全部信息,服务器不保留客户端状态。这种设计使得 API 更加灵活和可扩展。

2.3 层次化系统

API 可以通过多层架构进行设计,如加入缓存层、负载均衡器等,这些中间层提高了 API 的可扩展性和性能。

2.4 表现层

API 的操作接口统一,通常使用 JSON 或 XML 作为数据格式,这样客户端可以与不同类型的服务器交互。

3. API 设计最佳实践

3.1 清晰简洁的路径设计

API 路径应清晰简洁,反映资源的层次结构。例如,使用 /api/v1/users/{id} 获取用户信息,而不是 /getUserInfoById.

3.2 使用标准的 HTTP 方法
  • GET: 用于检索资源,不应对服务器状态产生副作用。
  • POST: 用于创建新资源。
  • PUT: 用于更新现有资源。
  • DELETE: 用于删除资源。
3.3 一致性和可预测性

API 的设计应保持一致性,如统一的命名规则、错误处理方式以及响应格式。这样可以减少开发者的学习成本。

3.4 版本控制

通过在路径中包含版本号(如 /api/v1/),可以确保 API 的向后兼容性,并在必要时进行版本升级。

3.5 安全性

API 需要考虑安全性,如使用 HTTPS 加密传输、OAuth 进行身份验证、以及避免暴露敏感信息。

3.6 实时文档

提供详尽的 API 文档,描述每个端点的功能、请求参数、响应格式、错误代码等信息。Swagger 是一个流行的工具,可以自动生成和维护 API 文档。

4. 实战示例

4.1 API 路径设计
GET /api/v1/users          # 获取所有用户
GET /api/v1/users/{id}     # 获取指定用户
POST /api/v1/users         # 创建新用户
PUT /api/v1/users/{id}     # 更新指定用户
DELETE /api/v1/users/{id}  # 删除指定用户
4.2 JSON 响应示例
{
    "id": 123,
    "name": "John Doe",
    "email": "john@example.com",
    "created_at": "2024-09-03T10:00:00Z"
}
4.3 错误处理示例
{
    "error": {
        "code": 404,
        "message": "User not found"
    }
}

通过流量控制,HTTP/2 可以有效管理数据传输速率,避免拥塞;而良好的 API 设计则确保了接口的易用性、扩展性和安全性。这些都是开发高质量软件系统的关键。如果你有更多问题或需要深入探讨某一主题,请随时告诉我!