原文链接:https://www.pubnub.com/guides/http/

HTTP 概述

HTTP,即超文本传输协议,是互联网通信的基础。它在客户端-服务器模型上运行,其中前端客户端(例如网络浏览器)通过向服务器发送HTTP请求消息来发起请求,例如请求网页(例如搜索引擎)。然后,服务器使用包含所请求资源的 HTTP 响应消息进行响应,如果资源不可用,则使用错误消息进行响应。

HTTP 是一种无状态协议,这意味着每个请求都是独立的,与之前或将来的请求无关。这允许客户端和服务器之间进行有效的通信。

HTTP 于 1991 年首次引入,作为 Tim Berners-Lee 创建的万维网项目的一部分,并由互联网工程任务组 (IETF)进行标准化。 IETF 负责开发和维护 HTTP、TCP/IP、DNS 等协议,以及他们在 RFC 或“征求意见”中记录的许多其他协议。

早期,需要一种标准化协议来促进不同计算机和服务器之间的通信。这导致了各种协议的发展,包括 HTTP。

HTTP 0.9,该协议的第一个版本,是一个简单且有限的系统,仅支持超文本文档的检索。它不支持标头,只允许传输纯文本数据。

1996 年,HTTP 1.0 发布,引入了至今仍在使用的几个重要功能。它增加了对多种媒体类型的支持,允许传输图像、视频和其他文件格式。它还引入了使用标头来实现更高级的功能,例如缓存和身份验证。

1999 年发布的 HTTP 1.1 进一步改进了该协议。它引入了持久连接,允许通过单个 TCP 连接发送多个请求和响应。这极大地提高了客户端和服务器之间通信的效率和速度。

近年来,人们致力于增强和优化HTTP协议。这导致了HTTP/2的开发,并于 2015 年发布。HTTP/2 带来了多项改进,包括多路复用、标头压缩和服务器推送,以减少延迟并提高性能。

最后是 HTTP/3。HTTP/3也称为 HTTP over QUIC(快速 UDP Internet 连接),是最新的 HTTP 协议版本,旨在解决以前版本的一些限制并提高性能。

HTTP/3 构建在 QUIC 传输协议之上,该协议使用用户数据报协议 (UDP)而不是 TCP。与 TCP 相比,UDP 具有多种优势,例如减少延迟和改进拥塞控制。 HTTP/3 使用 UDP,旨在提供更快、更可靠、更安全的连接。

HTTP/3 的关键特性之一是它支持多路复用和流多路复用的能力。这允许通过单个连接同时发送多个请求和响应,从而提高效率并减少延迟。此外,HTTP/3 还包含零 RTT 连接建立、改进的拥塞控制以及通过加密提高安全性等功能。

HTTP 和服务器

服务器对于处理 HTTP 请求和提供相应的响应至关重要。以下是HTTP与服务器关系的几个要点:

  1. 请求-响应模型:如前所述,HTTP 遵循请求-响应模型。客户端向服务器发送 HTTP 请求,指定所需的操作,例如检索网页或提交表单数据。服务器处理请求并发回 HTTP 响应,其中包括状态代码、标头和请求的内容(如果适用)。
  2. Web 服务器:Web 服务器是处理 HTTP 请求的软件应用程序或程序。它们侦听特定网络端口(通常为 HTTP 的端口 80)上的传入请求,并将它们路由到适当的资源或应用程序。流行的 Web 服务器软件包括 Apache、Nginx和 Microsoft IIS。
  3. 路由和资源处理:在 HTTP 服务器中,路由确定传入请求如何映射到特定资源或端点处理程序。例如,当接收到针对特定 URL 或路径的请求时,服务器使用路由规则来确定哪个代码或资源应处理该请求并生成适当的响应。
  4. 处理和生成响应:当 HTTP 请求到达服务器时,它会触发与所请求的资源关联的代码或资源处理程序的执行。这些处理程序可以从数据库检索数据、与外部服务交互或生成动态内容。服务器根据请求处理这些数据,并生成带有必要标头和内容的 HTTP 响应。
  5. 状态代码:HTTP 响应包括指示请求结果的状态代码。这些状态代码的范围从信息性 (1xx) 到成功 (2xx)、重定向 (3xx)、客户端错误 (4xx) 和服务器错误 (5xx)。常见状态代码包括 200(正常)、404(未找到)和 500(内部服务器错误)。
  6. 无状态:HTTP 是一种无状态协议,这意味着每个请求/响应交互都是独立的,并且不保留有关先前请求的信息。为了维护用户会话或跟踪用户交互,服务器通常使用 cookie 或会话管理技术。

HTTP 是如何工作的?

当客户端想要从服务器检索网页或新资源时,它会发起 HTTP 请求。该请求由几个部分组成:

  • 请求方法:客户端指定它希望服务器执行的所需操作。最常见的方法是“GET”,它检索资源,但“POST”、“PUT”和“DELETE”等其他方法也用于各种目的。
  • URL(统一资源定位符):URL标识客户端想要访问的特定资源。它包括协议 (HTTP)、服务器的域名或 IP 地址以及服务器上资源的路径。
  • 标头:HTTP 标头字段提供有关请求和客户端的附加信息。它们可以包括用户代理(发出请求的客户端应用程序)、接受的内容类型和 cookie 等信息。一个常见的例子是内容长度。 Content-Length 指定请求或响应中的消息正文大小。它指示 HTTP 消息中包含的实体主体或有效负载的长度(以字节为单位)。
  • 正文(可选):某些请求可能包含包含附加数据的正文,通常与“POST”或“PUT”等方法一起使用以将数据发送到服务器。

一旦客户端发送 HTTP 请求,它就会到达服务器。服务器处理请求并生成适当的响应。 HTTP 响应也由几个组件组成:

  • 状态行:该行包括 HTTP 版本、三位数状态代码和相应的状态消息。状态代码指示请求的结果,例如 200 表示请求成功,404 表示未找到资源。
  • 标头:与请求标头类似,响应标头提供有关响应和服务器的附加信息。它们可以包括内容类型、缓存控制指令和服务器信息等信息。
  • Body:响应正文包含发送回客户端的内容。例如,如果请求针对 HTML 网页,则响应正文将包含 HTML 标记。

内容协商

内容协商是客户端和服务器就内容类型传达其偏好和功能的过程。这可以灵活地为客户提供最合适的内容。

客户端请求中的 Accept 标头指定它可以处理的内容类型,并按首选项排序。例如,客户端可以发送带有“text/html”和“application/json”的 Accept 标头,以指示它可以处理 HTML 和 JSON(JavaScript对象表示法)内容类型。 XML 是 Accept 标头中提到的另一种受支持的格式,表明客户端希望接收 XML 格式的响应。

服务器检查 Accept 标头并将其与它可以传送的可用内容类型进行比较。如果匹配,服务器将发送具有相应内容类型的响应。如果不匹配,服务器可能会使用不同的内容类型进行响应,或者返回 406 状态代码,指示客户端不可接受任何可用的内容类型。

内容协商可以通过多种方式完成,包括:

  1. Content-Type 标头:服务器可以在响应中使用“Content-Type”标头来指示正在发送的内容的类型。例如,如果服务器响应“Content-Type:text/html”,则表明内容是 HTML 格式。 MIME 在 HTTP 中发挥着至关重要的作用,它提供了一种标准化的方法来识别和处理各种内容类型,促进客户端和服务器的正确解释和处理。 Content-Type 标头是 HTTP 消息中携带此信息的关键组件。
  2. 文件扩展名:服务器还可以根据请求资源的文件扩展名来确定内容类型。例如,如果客户端请求一个扩展名为“.json”的文件,服务器可以假设该内容是 JSON 格式。
  3. 查询参数:协商内容的另一种方法是通过 URL 中的查询参数。客户端可以在 URL 中包含参数来指定所需的内容类型。例如,客户端可以在 URL 中包含“?format=json”,以指示它需要 JSON 格式的响应。
  4. 语言标头:除了内容类型协商之外,服务器还可以协商内容的语言。客户端可以包含“Accept-Language”标头以指示请求中的首选语言。然后,服务器可以使用请求的语言发送响应(如果可用)。

HTTP 方法有哪些不同类型?

HTTP 定义了一组方法或动词,指示要对资源执行的所需操作。以下是常用的不同类型的 HTTP 方法:

  1. GET:[GET 方法](https://www.w3schools.com/tags/ref_httpmethods.asp#:~:text=The GET Method,data from a specified resource.&text=Some notes on GET requests,remain in the browser history)从服务器检索信息。它请求指定资源的表示并且不修改它。 GET 请求被认为是安全且幂等的,因为它们对服务器或请求的资源没有任何副作用。
  2. POST:[POST方法](https://www.w3schools.com/tags/ref_httpmethods.asp#:~:text=The POST Method,to create%2Fupdate a resource.&text=Some notes on POST requests,remain in the browser history)用于提交数据以供服务器处理。它请求服务器接受所包含的实体作为指定资源的新从属实体。 POST 请求不是幂等的,这意味着多个相同的请求可能会产生不同的效果。
  3. PUT:[PUT 方法](https://www.arubanetworks.com/techdocs/AOS-CX/10.12/HTML/rest_v10-0x/Content/Chp_REST_ref/put-met-usa-con-10.htm#:~:text=The PUT method updates an,afterward are called immutable attributes.)用所包含的实体更新或替换现有资源。它请求服务器将所包含的实体存储在指定的 URI 处。 PUT 请求是幂等的,因为多个相同的请求与单个请求具有相同的效果。
  4. DELETE:DELETE方法删除指定的资源。它请求服务器删除 URI 标识的资源。 DELETE 请求是幂等的,因为多个相同的请求与单个请求具有相同的效果。
  5. PATCH:[PATCH 方法](https://en.wikipedia.org/wiki/PATCH_(HTTP)#:~:text=In computing%2C the PATCH method,Uniform Resource Identifier (URI).)部分更新资源。它请求服务器对 URI 标识的资源应用部分修改。 PATCH 请求不是幂等的,这意味着多个相同的请求可能会产生不同的效果。

这些 HTTP 方法构成了客户端-服务器通信的基础,对于构建 Web 应用程序至关重要。每种方法都有特定的目的,开发人员必须根据所需的操作和应用程序的语义仔细考虑使用哪种方法

什么是 HTTP 状态代码?

HTTP 状态代码是 Web 服务器响应客户端请求而返回的三位数。它提供有关所请求资源的状态的信息,并有助于了解请求的结果。

每个 HTTP 状态代码分为五个类别之一,指示不同类型的响应:

1xx - 信息性

2xx - 成功

3xx - 重定向

4xx - 客户端错误

5xx - 服务器错误

让我们更深入地了解每个类别:

1xx - 信息性:这些状态代码表示服务器已收到请求并正在继续该过程。它们主要用于通信目的,不需要客户端采取进一步的操作。

2xx - 成功:这些状态代码表示服务器成功接收、理解并接受客户端的请求。该类别最常见的状态代码是 200 OK,这意味着请求成功。

3xx - 重定向:这些状态代码表示客户端需要采取进一步操作才能完成请求。当资源被移动或临时重定向到不同位置时,通常会使用它们。

4xx - 客户端错误:这些状态代码表示客户端的请求格式错误、未经授权或服务器无法满足。此类别中最著名的状态代码是 404 Not Found,它表示在服务器上找不到所请求的资源。

5xx - 服务器错误:这些状态代码指示服务器端在处理客户端请求时发生错误。它们表明服务器由于某些内部错误或问题而无法满足请求。此类别最常见的状态代码是 500 内部服务器错误,它表示一般服务器端错误。

为什么 HTTP 状态代码对于应用程序开发人员很重要?

HTTP 状态代码对于应用程序开发人员至关重要,因为它们提供有关请求结果的宝贵信息。通过分析这些状态代码,开发人员可以了解他们的请求是否成功或遇到任何问题。

以下是 HTTP 状态代码对于应用程序开发人员很重要的一些关键原因:

  • 错误处理:HTTP 状态代码帮助开发人员识别和处理客户端与服务器通信期间可能发生的错误。
  • 故障排除:当应用程序未按预期运行时,开发人员可以使用 HTTP 状态代码来解决问题。通过检查返回的状态代码,开发人员可以缩小问题范围并采取必要的步骤来修复它。
  • API 文档:在使用 API时,开发人员经常参考 API 文档来了解如何与 API 端点交互。 HTTP 状态代码在 API 文档中至关重要,它提供有关可能的响应及其含义的信息。这有助于开发人员了解 API 的预期行为并相应地处理不同的场景。
  • 用户体验:HTTP 状态代码间接影响应用程序的用户体验。当用户在使用应用程序时遇到错误或问题时,应用程序在 HTTP 状态代码中的响应可以提供有价值的反馈。
  • 性能优化:HTTP状态代码还可以帮助开发人员优化应用程序的性能。
  • 安全性:HTTP 状态代码可以提供对安全相关问题的深入了解。通过监视和分析这些状态代码,开发人员可以识别潜在的安全漏洞并采取适当的措施来解决它们。

最常见的 HTTP 状态代码有哪些?

开发 Web 应用程序时,理解和处理 HTTP 状态代码至关重要。这些代码是服务器响应客户端请求而发送的三位数,提供有关请求状态的信息。让我们探讨一些最常见的 HTTP 状态代码及其含义。

  1. 200 OK:这是最常遇到的状态码,表示请求成功。它通常是响应 GET 和 POST 请求而发送的,通知客户端服务器已满足请求。
  2. 404 Not Found:当在服务器上找不到所请求的资源时,返回404状态码。表示客户端提供的URL或端点不存在或找不到。
  3. 500 内部服务器错误:此状态代码表示服务器端错误。这表明服务器在处理客户端请求时出现了问题,但服务器无法提供有关错误的具体详细信息。
  4. 403 Forbidden:403状态码表示服务器理解客户端的请求但拒绝执行它。这可能是由于权限不足或身份验证问题。
  5. 302 Found/Redirect:此代码用于临时重定向。当客户端遇到此状态代码时,系统会指示它向不同的 URL 发出新请求,通常在响应的“Location”标头中提供。
  6. 400 Bad Request:当服务器由于语法或格式错误而无法理解或处理客户端的请求时,会返回400状态码。如果客户端发送无效数据或服务器期望缺少某些参数,则可能会发生这种情况。
  7. 301 Moved Permanently:此状态代码用于永久重定向。它表明所请求的资源已永久移动到新位置。客户端必须更新其书签或对新 URL 的引用。
  8. 304 Not Modified:当客户端发送有条件的 GET 请求,并且所请求的资源自上次请求以来没有被修改时,服务器返回 304 状态码。这表明客户端的资源缓存版本仍然有效,无需再次传输实际内容。
  9. 503 Service Unavailable:该状态码表示服务器暂时无法处理客户端的请求。它可能是由于服务器过载、维护或其他临时问题而发生的。客户端可以在一段时间后重试该请求。
  10. 429 Too Many Requests:当客户端超过服务器设置的速率限制时,返回此状态码。它表明服务器正在限制来自客户端的请求数量以防止滥用或过载。

HTTP 和 HTTPS 有什么区别?

HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是通过 Internet 传输数据的协议。两者之间的主要区别在于它们提供的安全级别。

HTTP 在 TCP(传输控制协议)之上运行并且未加密。任何访问网络的人都可以轻松拦截并读取HTTP数据。缺乏加密使得 HTTP 容易受到各种安全威胁,例如数据篡改、窃听和中间人攻击。

另一方面,HTTPS 是 HTTP 的安全版本,它使用SSL/TLS(安全套接字层/传输层安全)协议来加密传输的数据。这种加密可确保数据受到保护,并且未经授权的个人无法轻易破译。 HTTPS 为通信通道添加了一层安全性,使攻击者更难拦截和操纵数据。

为了实现这种加密,HTTPS 需要使用 SSL/TLS 证书。该证书由受信任的第三方组织(证书颁发机构 (CA))颁发。该证书包含用于加密数据的公钥和保密并用于解密的私钥。当用户使用 HTTPS 访问网站时,其浏览器会验证 SSL/TLS 证书的真实性,以确保通信安全。

除了加密之外,HTTPS 还提供身份验证。这意味着用户可以放心地与目标网站而不是冒名顶替者进行交流。 SSL/TLS 证书包含有关网站身份的信息,例如其域名。用户的浏览器根据证书颁发机构的记录检查此信息,以验证该网站是否合法。如果证书不匹配或存在任何其他问题,浏览器将警告用户,表明该网站可能不安全。

HTTP 安全

虽然 HTTP 本身不提供内置安全性,但您可以采取多种措施来增强基于 HTTP 的通信的安全性:

  1. HTTPS:保护 HTTP 流量的主要方法是使用 HTTPS,它可以保护敏感数据免遭窃听和篡改。要实施 HTTPS,您必须获取 SSL/TLS 证书并配置 Web 服务器以使用它。
  2. SSL/TLS 证书:SSL/TLS 证书是由受信任的证书颁发机构 (CA) 颁发的数字证书,包含用于加密和解密数据的加密密钥。有效的 SSL/TLS 证书可保护通过 HTTP 传输的数据。
  3. 服务器配置:正确配置 Web 服务器对于增强 HTTP 安全性非常重要。这包括禁用不安全和过时的协议、启用安全密码套件以及正确配置安全标头以防止某些类型的攻击,例如跨站点脚本攻击 (XSS)点击劫持
  4. 内容安全策略 (CSP):内容安全策略允许您定义网页可以加载内容的源,包括脚本、样式表和图像。通过实施定义良好的 CSP,您可以降低跨站点脚本 (XSS) 攻击和其他内容注入漏洞的风险。
  5. 安全 Cookie 处理:当使用 cookie 进行会话管理或身份验证时,确保它们的安全非常重要。实施安全 cookie 标志,例如“Secure”和“HttpOnly”,以防止它们通过不安全的通道传输或被恶意脚本访问。
  6. 定期更新和补丁:使用最新的安全补丁更新您的网络服务器和其他软件。这包括服务器的操作系统、Web 服务器软件以及第三方组件或库。
  7. Web 应用程序安全:在 Web 应用程序中实施安全编码实践,以防止常见漏洞,例如[SQL 注入](https://www.imperva.com/learn/application-security/sql-injection-sqli/#:~:text=SQL injection%2C also known as,lists or private customer details.)、跨站点脚本 (XSS) 和跨站点请求伪造 (CSRF)。验证和清理输入数据,使用参数化查询,并实施强大的身份验证和访问控制。

请记住,即使采取了这些安全措施,随着新威胁和漏洞的出现,定期检查和更新安全实践也很重要。采用分层安全方法并遵循最佳实践将有助于确保基于 HTTP 的通信的安全性。