HTTP基础

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式、超媒体信息系统的应用层协议,主要用于万维网(WWW)的数据通信。它基于 TCP/IP 通信协议,设计目的是确保客户端(如浏览器)与服务器之间能够有效地进行通信。下面是对上述内容的详细解释:

基本概念

  1. 分布式系统:HTTP 支持分布式系统,这意味着信息和资源可以存储在不同的服务器上,用户可以通过网络访问这些资源。

  2. 协作式系统:HTTP 允许多个用户和系统之间进行协作和信息共享。例如,多个用户可以同时访问和编辑一个共享的文档。

  3. 超媒体信息系统:超媒体不仅包括文本,还包括图像、视频、音频等各种媒体格式。HTTP 允许这些不同类型的媒体通过网络传输和访问。

HTTP 的主要特点

  1. 应用层协议:HTTP 是一个应用层协议,位于 OSI 模型的第七层。它定义了客户端和服务器之间通信的格式和规则。

  2. 基于 TCP/IP:HTTP 运行在 TCP/IP 协议之上,利用 TCP 提供的可靠数据传输服务。TCP 负责数据包的传输和重组,而 HTTP 负责数据内容的请求和响应。

  3. 无状态协议:HTTP 是一种无状态协议,每个请求和响应都是独立的,服务器不会保留以前请求的任何信息。这简化了服务器设计,但也意味着每次请求需要重新验证身份信息等。

HTTP 的设计目的

  1. 发布和接收 HTML 页面:最初设计 HTTP 的目的是为了通过网络发布和接收 HTML 页面,使得用户可以通过浏览器访问和浏览网页。

  2. 资源的标识:通过 HTTP 或 HTTPS 协议请求的资源由统一资源标识符(URI)来标识。URI 是一种字符串,用于标识互联网上的资源,包括网页、图片、视频等。

工作流程

  1. 客户端发起请求:用户在浏览器中输入 URL 或点击链接,浏览器作为客户端向服务器发起 HTTP 请求。

  2. 服务器处理请求:服务器接收到请求后,处理请求并返回相应的资源(如 HTML 文件、图片文件等)。

  3. 客户端接收响应:浏览器接收到服务器的响应后,解析并显示内容给用户。

HTTPS

为了增强安全性,HTTP 的安全版本是 HTTPS(HTTP Secure)。HTTPS 在 HTTP 的基础上加入了 SSL/TLS 协议,用于加密数据传输,确保数据的机密性和完整性,防止数据被窃取或篡改。

HTTP 的请求-响应

HTTP 的基本工作原理是客户端(通常是 web 浏览器)向服务器发送请求,服务器接收到请求后,返回相应的资源。这些资源可以是网页、图像、音频文件、视频等。

HTTP 使用了客户端-服务器模型,其中客户端发送请求,服务器返回响应。

HTTP 的请求-响应模型通常由以下几个步骤组成:

1. 建立连接

  • 传统 HTTP:基于 TCP/IP 协议。客户端(通常是浏览器)通过 TCP 三次握手与服务器建立连接。
  • HTTP/2:仍然基于 TCP,但引入了二进制分帧层,更高效地处理多路复用请求。
  • HTTP/3:基于 UDP 使用 QUIC 协议,进一步减少连接建立的延迟并改善传输效率。

2. 发送请求

客户端发送 HTTP 请求,包含以下部分:

  • 请求行:包括请求方法(如 GET、POST)、请求的 URL 和 HTTP 版本。
  • 请求头:包含元数据信息,如 Accept(客户端可接受的媒体类型)、User-Agent(客户端软件信息)等。
  • 请求体:对于某些方法(如 POST、PUT),请求体包含需要发送的数据(如表单数据、文件)。

示例请求:

1
2
3
4
GET /index.html HTTP/1.1
Host: www.example.com
Accept: text/html
User-Agent: Mozilla/5.0

这是一条典型的 HTTP 请求示例,使用 GET 方法请求服务器上的资源。让我们逐行解释:

GET /index.html HTTP/1.1

  • GET:HTTP 请求方法,表示请求服务器上的资源。GET 方法通常用于请求数据,而不是修改数据。
  • /index.html:请求的资源路径,这里是网站的首页文件 index.html
  • HTTP/1.1:HTTP 版本号,表示使用 HTTP/1.1 协议。

Host: www.example.com

  • Host:请求头字段,指定请求的目标主机名及可选端口号。HTTP/1.1 要求必须包含 Host 头部。这里指定的主机名是 www.example.com

Accept: text/html

  • Accept:请求头字段,指定客户端可接受的内容类型(MIME 类型)。text/html 表示客户端希望接收到的响应内容是 HTML 格式。

User-Agent: Mozilla/5.0

  • User-Agent:请求头字段,包含客户端软件的信息,通常是浏览器的标识字符串。这有助于服务器识别客户端的类型和版本,可能会返回特定于客户端的内容或进行兼容性处理。Mozilla/5.0 是一种常见的 User-Agent 字符串格式,表示请求是由 Mozilla 浏览器(如 Firefox)或与其兼容的浏览器发出的。

这条请求是一个典型的 HTTP GET 请求,客户端(浏览器)请求 www.example.com 服务器上的 index.html 文件。请求包含以下信息:

  • 请求方法:GET,请求资源而不修改它。
  • 资源路径/index.html,表示请求的具体资源路径。
  • 协议版本:HTTP/1.1,使用 HTTP 的 1.1 版本。
  • Host 头部:指定请求的目标主机名 www.example.com
  • Accept 头部:客户端希望接收 HTML 格式的响应。
  • User-Agent 头部:客户端软件信息,用于服务器识别客户端类型。

3. 处理请求

服务器接收到请求后,根据请求信息进行处理:

  • 静态资源:直接读取并返回文件(如 HTML、CSS、图像)。
  • 动态资源:可能需要执行服务器端脚本(如 PHP、Python、Node.js),从数据库获取数据并生成响应内容。

4. 发送响应

服务器处理完成后,将结果返回给客户端,响应包含以下部分:

  • 状态行:包括 HTTP 版本、状态码(如 200 OK、404 Not Found)。
  • 响应头:包含元数据,如 Content-Type(响应内容类型)、Content-Length(响应体长度)。
  • 响应体:实际的资源内容(如 HTML 文档、图像数据)。

示例响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 137

<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>

5. 关闭连接

在完成请求-响应周期后,连接可以关闭:

  • HTTP/1.0:默认每次请求后关闭连接。
  • HTTP/1.1:默认使用持久连接(keep-alive),可以复用同一个连接处理多个请求-响应周期。
  • HTTP/2 和 HTTP/3:更加优化的连接管理,提高了性能和资源利用效率。

小结

HTTP 的工作原理通过一系列的请求和响应,客户端请求服务器资源,服务器返回资源或相应的状态信息。通过不断的发展,从 HTTP/1.0 到 HTTP/3,协议性能和安全性不断提升,使得互联网体验更加高效和可靠。

HTTP 方法

HTTP 方法指定了客户端可以对服务器上的资源执行哪些动作,定义了与资源交互的不同方式。主要的 HTTP 方法及其用途如下:

GET

  • 用途:请求从服务器获取指定资源。

  • 特点:这是最常用的方法。用于访问网页或获取数据。

  • 请求体:无请求体,所有数据都包含在 URL 中。

  • 幂等性:是(多次请求同一资源,结果相同)。

  • 示例:访问网页或从 API 获取数据。

    1
    2
    GET /index.html HTTP/1.1
    Host: www.example.com

POST

  • 用途:请求服务器接受并处理请求体中的数据。

  • 特点:通常用于提交表单、上传文件或发送数据到服务器以创建或更新资源。

  • 请求体:包含数据(如表单数据、文件)。

  • 幂等性:否(多次请求可能导致多次创建资源或副作用)。

  • 示例:提交注册表单或上传文件。

    1
    2
    3
    4
    5
    POST /submit-form HTTP/1.1
    Host: www.example.com
    Content-Type: application/x-www-form-urlencoded

    name=John&age=30

PUT

  • 用途:请求服务器存储一个资源,并用请求体中的内容替换目标资源的所有内容。

  • 特点:用于更新资源或创建资源(如果资源不存在)。

  • 请求体:包含要上传或更新的资源内容。

  • 幂等性:是(多次请求结果相同)。

  • 示例:更新用户信息或上传文件。

    1
    2
    3
    4
    5
    6
    7
    8
    PUT /user/123 HTTP/1.1
    Host: www.example.com
    Content-Type: application/json

    {
    "name": "John",
    "age": 30
    }

DELETE

  • 用途:请求服务器删除指定的资源。

  • 特点:用于删除资源。

  • 请求体:通常无请求体。

  • 幂等性:是(多次请求结果相同)。

  • 示例:删除用户或移除文件。

    1
    2
    DELETE /user/123 HTTP/1.1
    Host: www.example.com
  • 用途:与 GET 类似,但不获取资源的内容,只获取响应头信息。

  • 特点:用于获取资源的元数据(如响应头部),而不下载资源本身。

  • 请求体:无请求体。

  • 幂等性:是(多次请求结果相同)。

  • 示例:检查资源是否存在或获取资源的大小。

    1
    2
    HEAD /index.html HTTP/1.1
    Host: www.example.com

总结

  • GET:获取资源,常用于访问网页或获取数据。
  • POST:提交数据,常用于表单提交和数据上传。
  • PUT:更新或创建资源,用于替换资源的全部内容。
  • DELETE:删除资源,常用于移除数据或文件。
  • HEAD:获取响应头信息,不返回资源内容,常用于检查资源存在性或元数据。

HTTP 状态码

HTTP 状态码是服务器在响应客户端请求时返回的三位数字代码,用于表示请求的处理结果。状态码分为五类,每类有特定的含义:

1xx(信息性状态码)

这些状态码表示接收的请求正在处理,通常不需要客户端采取进一步的行动。这些状态码在实际应用中较少见。

  • 100 Continue:客户端应继续其请求。此状态码通常在发送较大的请求体前,服务器要求确认继续发送。
  • 101 Switching Protocols:服务器正在根据客户端的请求切换协议,例如从 HTTP/1.1 切换到 WebSocket。

2xx(成功状态码)

这些状态码表示请求已成功被服务器接收、理解并处理。

  • 200 OK:请求成功,服务器已成功处理请求并返回所请求的资源。
  • 201 Created:请求成功并且服务器创建了一个新的资源,通常用于 POST 请求。
  • 202 Accepted:服务器已接受请求,但尚未处理完成。请求可能会在稍后处理。
  • 204 No Content:请求成功,但服务器没有返回任何内容。常用于更新操作。

3xx(重定向状态码)

这些状态码表示需要客户端进行进一步操作以完成请求,通常是跟随重定向的 URL。

  • 301 Moved Permanently:请求的资源已永久移动到新 URL,客户端应使用新 URL。
  • 302 Found:请求的资源临时移动到新 URL,客户端应使用当前 URL 进行请求。
  • 303 See Other:建议客户端使用 GET 方法访问另一个 URL 获取资源,通常用于 POST 请求后的重定向。
  • 304 Not Modified:资源未被修改,客户端可以使用缓存的版本。

4xx(客户端错误状态码)

这些状态码表示请求包含语法错误或无法完成,通常是客户端的错误。

  • 400 Bad Request:请求语法有误,服务器无法理解请求。
  • 401 Unauthorized:请求需要身份验证,客户端未提供有效凭证。
  • 403 Forbidden:服务器理解请求,但拒绝执行,通常是权限问题。
  • 404 Not Found:请求的资源不存在,服务器无法找到该资源。
  • 405 Method Not Allowed:请求方法不被允许,服务器拒绝执行。

5xx(服务器错误状态码)

这些状态码表示服务器在处理请求的过程中发生了错误。

  • 500 Internal Server Error:服务器遇到未知错误,无法完成请求。
  • 501 Not Implemented:服务器不支持请求的方法,无法处理请求。
  • 502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效响应。
  • 503 Service Unavailable:服务器暂时无法处理请求,通常是由于服务器过载或维护。
  • 504 Gateway Timeout:服务器作为网关或代理,未能及时从上游服务器接收到响应。

总结

HTTP 状态码分为五类,用于指示请求的处理结果和下一步操作:

  • 1xx 信息性状态码:请求正在处理。
  • 2xx 成功状态码:请求成功处理。
  • 3xx 重定向状态码:需要后续操作完成请求。
  • 4xx 客户端错误状态码:请求有错误或无法完成。
  • 5xx 服务器错误状态码:服务器处理请求时发生错误。

了解这些状态码有助于调试和优化客户端与服务器之间的通信。

HTTP 版本

HTTP 有多个版本,随着时间的推移,每个新版本都引入了显著的改进以提高性能和安全性。以下是 HTTP/1.1、HTTP/2 和 HTTP/3 的详细解释:

HTTP/1.1

  • 持久连接:HTTP/1.1 默认启用了持久连接(Keep-Alive),这意味着多个请求和响应可以复用同一个 TCP 连接。这减少了每次请求都需要建立和关闭连接的开销。
  • 请求/响应流水线化:允许在同一个连接上同时发送多个请求,而无需等待前一个请求完成。然而,真正的并行处理仍然受到限制,容易出现“队头阻塞”问题(Head-of-line blocking)。
  • 缓存控制:引入了更复杂的缓存机制,通过头字段如 Cache-ControlETagIf-Modified-Since 等来优化缓存管理。
  • 虚拟主机支持:通过 Host 头字段,使得同一个 IP 地址可以托管多个域名。

HTTP/2

  • 二进制分帧:HTTP/2 使用二进制分帧层将数据分解为更小的帧,而不是基于文本的格式。这提高了解析效率并减少了错误的可能性。
  • 多路复用:允许在单个连接上并行发送多个请求和响应,所有这些都在不同的流中进行,从而解决了 HTTP/1.1 中的“队头阻塞”问题。
  • 头部压缩:使用 HPACK 压缩算法对 HTTP 头部进行压缩,减少传输数据量,提高传输效率。
  • 服务器推送:允许服务器在客户端请求之前主动推送资源到客户端,从而减少延迟。例如,服务器可以在响应 HTML 页面时提前推送所需的 CSS 和 JavaScript 文件。

HTTP/3

  • 基于 QUIC 协议:HTTP/3 是基于 QUIC 协议的。QUIC 使用 UDP 而不是 TCP,并在用户空间实现了可靠传输、拥塞控制等功能,从而减少了连接建立的延迟。
  • 改进的连接建立:QUIC 减少了连接建立的往返时间(RTT),通常在一次 RTT 内即可建立连接并开始数据传输,而 TCP 需要至少三次握手。
  • 内置加密:QUIC 和 HTTP/3 默认使用 TLS 1.3 加密通信,提供了更好的安全性。
  • 更好的多路复用:QUIC 的多路复用特性更加先进,不同流之间的丢包不会相互阻塞,提高了传输效率和可靠性。

总结

  • HTTP/1.1:引入持久连接和请求流水线化,但仍存在队头阻塞问题。
  • HTTP/2:通过二进制分帧、多路复用和头部压缩解决了队头阻塞问题,显著提高了性能。
  • HTTP/3:基于 QUIC 协议,进一步减少连接延迟,增强了安全性,并改善了多路复用的效率。

HTTP与HTTPS

HTTP 和 HTTPS 是用于在网络上传输数据的两种协议,它们定义了客户端(如浏览器)与服务器之间的通信方式。以下是对 HTTP 和 HTTPS 的详细解释:

HTTP (Hypertext Transfer Protocol)

基本概念

HTTP 是用于从万维网(WWW: World Wide Web)服务器传输超文本到本地浏览器的传输协议。它是无状态的,即每个请求都是独立的,不会保留之前请求的任何信息。

工作机制

HTTP 工作在 TCP/IP 模型之上,通常使用端口 80。HTTP 协议的通信流程包括以下几个步骤:

  1. 建立连接:客户端和服务器通过 TCP 三次握手建立连接。
  2. 发送请求:客户端发送包含请求行、请求头和可选请求体的 HTTP 请求。
  3. 处理请求:服务器解析请求并处理,找到对应的资源。
  4. 发送响应:服务器发送包含状态行、响应头和可选响应体的 HTTP 响应。
  5. 关闭连接:除非使用了持久连接(Keep-Alive),否则连接关闭。

传输内容

HTTP 可以传输各种类型的数据,包括 HTML 文件、图片、视频、JSON 数据等。

不安全性

由于 HTTP 数据未加密,传输过程中可能会被窃听或篡改。例如,攻击者可以拦截并读取传输的数据,或者篡改数据包。

HTTPS (Hypertext Transfer Protocol Secure)

基本概念

HTTPS 是 HTTP 的安全版本,在 HTTP 下增加了 SSL/TLS(Secure Sockets Layer / Transport Layer Security)协议。HTTPS 提供了数据加密、完整性校验和身份验证。

工作机制

HTTPS 通常使用端口 443。HTTPS 的工作流程如下:

  1. 建立连接:客户端和服务器通过 TCP 三次握手建立连接。
  2. TLS 握手:在 TLS 握手过程中,客户端和服务器协商加密算法和密钥,确保通信加密。
  3. 发送请求:客户端发送加密的 HTTP 请求。
  4. 处理请求:服务器解密请求,处理并找到对应的资源。
  5. 发送响应:服务器加密响应并发送给客户端。
  6. 关闭连接:除非使用了持久连接(Keep-Alive),否则连接关闭。

安全性

HTTPS 通过 SSL/TLS 提供以下安全功能:

  • 数据加密:加密传输的数据,防止窃听。
  • 数据完整性:确保数据在传输过程中未被篡改。
  • 身份验证:通过数字证书验证服务器身份,防止中间人攻击。

URL 和端口

  • HTTP URL:以 http:// 开头,默认使用端口 80。
  • HTTPS URL:以 https:// 开头,默认使用端口 443。

详细解释

HTTP 的缺点和风险

  1. 数据泄露风险:由于数据未加密,攻击者可以拦截并查看传输内容,造成隐私泄露。
  2. 数据篡改风险:攻击者可以在传输过程中修改数据,可能导致数据损坏或恶意代码注入。
  3. 无法验证服务器身份:客户端无法确认与其通信的服务器是否是真正的目标服务器,可能导致中间人攻击。

HTTPS 的优点和工作流程

  1. 数据加密:使用对称加密算法(如 AES)加密传输数据,即使被拦截,攻击者也无法解密。
  2. 身份验证:通过数字证书和公钥基础设施(PKI)验证服务器身份,确保客户端与可信服务器通信。
  3. 数据完整性校验:使用消息认证码(MAC)确保数据在传输过程中未被篡改。
TLS 握手过程
  1. 客户端问候:客户端发送支持的协议版本、加密算法和随机数。
  2. 服务器问候:服务器选择协议版本和加密算法,并发送数字证书和随机数。
  3. 密钥交换:客户端验证服务器证书,并生成会话密钥,使用服务器的公钥加密后发送给服务器。
  4. 加密通信:服务器使用私钥解密会话密钥,之后的通信使用会话密钥进行加密传输。

总结

  • HTTP:无状态且未加密,使用端口 80,存在安全风险,适用于不涉及敏感数据的通信。
  • HTTPS:基于 HTTP 加入了 SSL/TLS 加密,使用端口 443,提供数据加密、完整性校验和身份验证,适用于需要安全通信的场景,如登录页面、支付页面等。

主要区别如下:

  • 加密
    • HTTP:数据传输过程中不加密,容易被截获和篡改。
    • HTTPS:使用SSL/TLS协议对传输的数据进行加密,保护数据传输过程中的安全性。
  • 端口
    • HTTP:默认使用端口80。
    • HTTPS:默认使用端口443。
  • 安全性
    • HTTP:不提供数据加密,安全性较低。
    • HTTPS:提供数据加密和完整性校验,安全性较高。
  • 证书
    • HTTP:不需要证书。
    • HTTPS:需要SSL证书来启用加密,并验证服务器的身份。
  • 性能
    • HTTP:由于不加密数据,性能略高于HTTPS。
    • HTTPS:由于需要进行加密和解密,可能会有一定的性能开销。
  • 搜索引擎优化(SEO)
    • HTTP:搜索引擎可能会对没有使用HTTPS的网站进行降权。
    • HTTPS:搜索引擎倾向于优先索引和展示使用HTTPS的网站。
  • 浏览器显示
    • HTTP:在大多数现代浏览器中,HTTP网站通常显示为"不安全"。
    • HTTPS:浏览器会显示一个锁形图标,表示网站是安全的。
  • 成本
    • HTTP:通常免费。
    • HTTPS:需要购买SSL证书,可能会有一定的成本。
  • 应用场景
    • HTTP:适用于不需要传输敏感信息的网站,如新闻网站、博客等。
    • HTTPS:适用于需要传输敏感信息的网站,如网上银行、在线购物、电子邮件等。

HTTP 消息结构

HTTP 是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。

HTTP 消息是客户端和服务器之间通信的基础,它们由一系列的文本行组成,遵循特定的格式和结构。

HTTP消息分为两种类型:请求消息和响应消息。

一个 HTTP 客户端是一个应用程序(Web 浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。

一个 HTTP 服务器 同样也是一个应用程序(通常是一个 Web 服务,如 Nginx、Apache 服务器或 IIS 服务器等),通过接收客户端的请求并向客户端发送 HTTP 响应数据。

客户端请求消息

客户端的HTTP请求消息是向服务器发出的请求,用于获取或操作服务器上的资源。它由四个主要部分组成,每个部分都承载着特定类型的信息:

请求行(Request Line):

请求行是HTTP请求的第一行,包含了请求的基本信息,以便服务器能够理解客户端的意图。

  • 方法(Method):指定了客户端要执行的操作,常见的方法包括GET、POST、PUT、DELETE等。
  • 请求URI(Uniform Resource Identifier):表示所请求资源的路径,通常包括主机名、端口号(如果不是默认端口)以及资源的具体路径和查询字符串。
  • HTTP版本(HTTP Version):指定了客户端使用的HTTP协议版本,例如HTTP/1.1或HTTP/2。

示例:GET /index.html HTTP/1.1

请求头部(Request Headers):

请求头部包含了客户端的环境信息和请求参数,为服务器提供了更多关于请求的上下文信息。

  • Host:指定了请求的目标服务器的主机名和端口号。
  • User-Agent:标识了客户端软件的名称和版本号,用于服务器端的识别和统计分析。
  • Accept:指定了客户端所能接受的响应内容的MIME类型。
  • Accept-Encoding:指定了客户端所支持的内容压缩算法,如gzip、deflate等。
  • Content-Length:如果请求包含消息体,则指定了消息体的长度。

空行:

空行是请求头部和请求体之间的分隔符,它表示请求头部的结束,同时标志着请求消息中的头部信息已经发送完毕。

请求体(可选):

在某些类型的HTTP请求中,例如POST和PUT,请求体包含了客户端要发送给服务器的数据。通常用于向服务器提交表单数据、上传文件等操作。

理解HTTP请求消息的结构和各个部分的作用有助于开发者更好地构建和处理HTTP请求,实现客户端与服务器之间的有效通信。

服务器响应消息

服务器的HTTP响应消息是对客户端请求的回应,也由四个主要部分组成,每个部分负责传递特定类型的信息:

状态行(Status Line):

状态行是HTTP响应的第一行,包含了响应的基本信息,以便客户端能够了解服务器对请求的处理结果。

  • HTTP版本(HTTP Version):与客户端请求中的版本相匹配,指示所使用的HTTP协议版本,例如HTTP/1.1或HTTP/2。
  • 状态码(Status Code):是一个三位数,用于表示请求的处理结果。常见的状态码包括200表示成功,404表示未找到资源,500表示服务器内部错误等。
  • 状态信息(Status Message):是状态码的简短描述,用于进一步说明请求的处理结果。

示例:HTTP/1.1 200 OK

响应头(Response Headers):

响应头包含了服务器的环境信息和响应参数,为客户端提供了更多关于响应的上下文信息。

  • Content-Type:指定了响应体的MIME类型,告诉客户端如何解析响应数据。
  • Content-Length:指定了响应体的长度,用于客户端正确接收和处理响应数据。
  • Server:标识了服务器软件的名称和版本号。
  • Set-Cookie:设置了一个或多个Cookie,用于在客户端存储会话信息等。

空行:

空行是响应头部和响应体之间的分隔符,它表示响应头部的结束,同时标志着响应消息中的头部信息已经发送完毕。

响应体(可选):

在某些情况下,服务器会返回响应体,其中包含了客户端请求的资源或数据。

理解HTTP响应消息的结构和各个部分的作用有助于开发者更好地理解服务器对请求的处理结果,并正确处理和解析服务器的响应。

实例

下面实例是一点典型的使用 GET 来传递数据的实例:

客户端请求:

1
2
3
4
5
6
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive

服务端响应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HTTP/1.1 200 OK
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<!-- The rest of the HTML content -->
</body>
</html>

在实际应用中,HTTP 消息可以包含更多的头字段,并且请求体和响应体的大小会根据传输的数据而变化。

这个实例展示了一个典型的使用GET方法传递数据的HTTP请求和服务器的HTTP响应。

客户端请求:

请求行:

1
GET /index.html HTTP/1.1

客户端发送了一个GET请求,请求的资源路径为/index.html,并指定了HTTP协议版本为HTTP/1.1。

请求头部:

1
2
3
4
5
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
  • Host:指定了请求的目标服务器的主机名。
  • User-Agent:标识了客户端软件的名称和版本号。
  • Accept:指定了客户端所能接受的响应内容的MIME类型。
  • Accept-Encoding:指定了客户端所支持的内容压缩算法。
  • Connection:指定了客户端和服务器之间的连接方式。

服务端响应:

状态行:

1
HTTP/1.1 200 OK

服务器返回了一个状态码为200的响应,表示请求成功。

响应头部:

1
2
3
4
5
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8
  • Date:指示了响应生成的日期和时间。
  • Server:标识了服务器软件的名称和版本号。
  • Last-Modified:指示了响应资源的最后修改时间。
  • Content-Length:指定了响应体的长度。
  • Content-Type:指定了响应体的MIME类型和字符集。

响应体:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<!-- The rest of the HTML content -->
</body>
</html>

服务器返回了一个HTML文档作为响应体,其中包含了一个标题为"Example Page"的页面和一个"Hell, World!"的标题。

HTTP 请求方法

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

序号 方法 描述
1 GET 用于请求服务器发送某个资源。GET 请求不应该对服务器上的资源做出任何更改,并且应该是幂等的(即多次重复的请求应该产生相同的结果)。例如,当你在浏览器中输入 URL 地址时,浏览器会发送一个 GET 请求来获取该 URL 对应的网页。
2 HEAD 类类似于 GET 请求,但服务器不返回请求的资源主体,只返回响应头。HEAD 请求通常用于获取资源的元信息,如资源的大小、类型等,而不需要获取资源的实际内容。
3 POST 用于向服务器提交数据,通常用于提交表单或上传文件。POST 请求可能会导致服务器上的状态更改,并且不一定是幂等的。例如,在提交注册表单时,浏览器通常会发送一个 POST 请求,将用户提供的信息发送到服务器进行处理。
4 PUT 用于向服务器上传资源,通常用于更新已存在的资源或创建新的资源。PUT 请求应该是幂等的,即多次执行相同的 PUT 请求应该产生相同的结果。
5 DELETE 用于请求服务器删除指定的资源。DELETE 请求应该是幂等的,即多次执行相同的 DELETE 请求应该产生相同的结果。
6 CONNECT 用于建立到服务器上指定端口的隧道,通常用于代理服务器。
7 OPTIONS 用于请求服务器返回支持的 HTTP 方法和其他选项。例如,客户端可以发送 OPTIONS 请求来确定服务器支持哪些 CORS(跨域资源共享)策略。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 用于在请求-响应链上的每个节点获取传输路径。TRACE 请求通常用于调试和测试,以查看请求在经过各种代理服务器和中间件时如何被修改。

如果有不知道什么幂等:

在计算机科学中,幂等(Idempotence)是指对于相同的操作,无论执行多少次,结果都是相同的。换句话说,如果对一个操作重复多次,结果与仅执行一次的结果相同,那么该操作就是幂等的。

在HTTP协议中,幂等性意味着对于相同的请求,无论发送多少次,服务器的状态都保持一致。这对于安全地重试请求、处理失败请求或处理网络中断后重新发送请求是非常重要的。

举例来说,HTTP的GET请求通常是幂等的,因为它只是请求服务器获取资源,并不会对服务器状态进行修改。而POST请求通常不是幂等的,因为它可能会导致服务器上的状态改变,比如在数据库中创建新的记录。

在设计和实现网络协议、API和分布式系统时,考虑到幂等性是非常重要的,因为它可以简化系统的复杂性,并降低因请求重复执行而导致的意外行为的风险。

HTTP 响应头信息

  1. Date:响应生成的日期和时间。
  2. Server:服务器软件的名称和版本。
  3. Content-Type:响应体的媒体类型(MIME类型)。
  4. Content-Length:响应体的大小,单位是字节。
  5. Content-Encoding:响应体的压缩编码。
  6. Content-Language:响应体的语言。
  7. Content-Location:响应体的URI。
  8. Content-Range:响应体的字节范围,用于分块传输。
  9. Cache-Control:控制响应的缓存行为。
  10. Connection:管理连接的选项。
  11. Set-Cookie:设置客户端的cookie。
  12. Expires:响应体的过期日期和时间。
  13. Last-Modified:资源最后被修改的日期和时间。
  14. ETag:资源的特定版本的标识符。
  15. Location:用于重定向的URI。
  16. Pragma:包含实现特定的指令。
  17. WWW-Authenticate:认证信息,通常用于HTTP认证。
  18. Accept-Ranges:指定可接受的请求范围类型。
  19. Age:响应生成后经过的秒数。
  20. Allow:列出资源允许的HTTP方法。
  21. Vary:告诉下游代理如何使用响应头信息来确定响应是否可以从缓存中获取。
  22. Strict-Transport-Security:指示浏览器仅通过HTTPS与服务器通信。
  23. X-Frame-Options:控制页面是否允许在框架中显示,防止点击劫持攻击。
  24. X-Content-Type-Options:指示浏览器不要尝试猜测资源的MIME类型。
  25. X-XSS-Protection:控制浏览器的XSS过滤和阻断。
  26. Public-Key-Pins:HTTP头信息,用于HTTP公共密钥固定(HPKP)。

HTTP 状态码

上有

HTTP content-type

Content-Type 是 HTTP 头部的一个字段,用于指示所传输数据的内容类型。它的语法格式通常是:

1
Content-Type: type/subtype; parameters

其中,type 指示主要的媒体类型,subtype 表示特定媒体类型的子类型,parameters 是可选的参数,用于指定一些额外的信息,比如字符集、编码方式等。

举个例子:

1
Content-Type: text/html; charset=utf-8

这个示例中,typetextsubtypehtml,而 charset=utf-8 是一个参数,指示该 HTML 文档使用 UTF-8 字符集编码。

另一个示例:

1
Content-Type: multipart/form-data; boundary=something

这里的 typemultipartsubtypeform-data,而 boundary=something 是参数,指示了边界字符串,用于分隔不同的数据块。

这样的头部信息能够帮助客户端正确地解析服务器返回的数据,以便进行适当的处理和显示。

MIME 类型

MIME(Multipurpose Internet Mail Extensions)类型是一种标准,用于描述网络上传输的数据的内容类型和格式。它是由类型和子类型组成,两者之间用斜杠分隔。

常见的 MIME 类型包括:

  • text:表示普通文本文件,如 HTML、CSS、JavaScript 等。例如:text/plain, text/html, text/css, text/javascript
  • image:表示图像文件,包括静态图像和动态图像(如 GIF)。例如:image/gif, image/png, image/jpeg
  • audio:表示音频文件。例如:audio/midi, audio/mpeg, audio/webm, audio/ogg
  • video:表示视频文件。例如:video/webm, video/ogg
  • application:表示二进制数据,以及各种应用程序特定的文件类型。例如:application/octet-stream, application/pdf, application/xml

MIME 类型在 Web 开发中非常重要,因为浏览器使用 MIME 类型来决定如何处理接收到的数据。例如,如果服务器将一个文件标记为 text/html 类型,浏览器就会将其解析为 HTML,并以网页形式展示给用户;如果是 application/pdf,浏览器则会以适当的方式打开 PDF 文件。

在 HTTP 响应头中,常常可以看到 Content-Type 字段,用于指定返回的数据类型,以确保浏览器正确解释内容。正确配置 MIME 类型对于确保网站正常运行和数据正确显示至关重要。

总结一下:

  1. HTTP 概述
    • HTTP(超文本传输协议)是用于传输超文本(例如 HTML)和其他 Web 资源的应用层协议。
    • 它是一个客户端-服务器协议,客户端发送请求,服务器发送响应。
  2. HTTP 请求
    • 请求由请求方法、URL、协议版本、请求头部、空行和请求体组成。
    • 常见的请求方法包括 GET、POST、PUT、DELETE 等。
    • 请求头部包括 Host、User-Agent、Content-Type 等信息。
  3. HTTP 响应
    • 响应由协议版本、状态码、状态消息、响应头部、空行和响应体组成。
    • 常见的状态码包括 200(成功)、404(未找到)、500(服务器内部错误)等。
    • 响应头部包括 Content-Type、Content-Length、Server 等信息。
  4. HTTP 方法
    • GET:从服务器获取资源。
    • POST:向服务器提交数据。
    • PUT:更新服务器上的资源。
    • DELETE:删除服务器上的资源。
    • HEAD:类似于 GET,但只返回头部信息,用于检查资源是否存在等。
  5. HTTP 头部
    • 请求头部包含了客户端向服务器传递的信息。
    • 响应头部包含了服务器向客户端传递的信息。
    • 常见的头部包括 Content-Type、User-Agent、Cookie、Cache-Control 等。
  6. HTTP 状态码
    • 1xx:信息响应,表示请求已被接收,继续处理。
    • 2xx:成功响应,表示请求已成功被服务器接收、理解、接受。
    • 3xx:重定向,表示需要进一步操作以完成请求。
    • 4xx:客户端错误,表示请求包含语法错误或无法完成请求。
    • 5xx:服务器错误,表示服务器无法完成显然有效的请求。
  7. HTTP 持久连接
    • HTTP/1.1 默认启用持久连接,一个 TCP 连接可以发送多个请求和接收多个响应,减少了连接的建立和关闭次数,提高了性能。
  8. HTTPS
    • HTTPS 是基于 HTTP 的加密协议,通过 SSL/TLS 提供安全通信。
    • 它使用加密算法对通信内容进行加密,确保数据在传输过程中不被窃取或篡改。
  9. HTTP 缓存
    • 缓存是为了提高性能而存储的数据副本,可以减少数据传输的时间和带宽消耗。
    • HTTP 客户端和服务器使用缓存来减少网络流量和提高响应速度。
  10. HTTP/2 和 HTTP/3
    • HTTP/2 引入了多路复用、头部压缩、服务器推送等特性,提高了性能和效率。
    • HTTP/3 基于 UDP 协议,使用 QUIC(Quick UDP Internet Connections)实现,进一步提高了性能和安全性。