Skip to content

HTTP 消息结构

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

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

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

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

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


请求

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

起始行

HTTP 请求是由客户端发出的消息,用来使服务器执行动作。起始行(start-line)包含三个元素:

  1. 一个 HTTP 方法,一个动词(像 GETPUT 或者 POST)或者一个名词(像 HEAD 或者 OPTIONS),描述要执行的动作。例如,GET 表示要获取资源,POST 表示向服务器推送数据(创建或修改资源,或者产生要返回的临时文件)。

  2. 请求目标(request target),通常是一个 URL,或者是协议、端口和域名的绝对路径,通常以请求的环境为特征。请求的格式因不同的 HTTP 方法而异。它可以是:

    • 一个绝对路径,末尾跟上一个 '?' 和查询字符串。这是最常见的形式,称为_原始形式_(origin form),被 GETPOSTHEAD 和 OPTIONS 方法所使用。
      • POST / HTTP/1.1
      • GET /background.png HTTP/1.0
      • HEAD /test.html?query=alibaba HTTP/1.1
      • OPTIONS /anypage.html HTTP/1.0
    • 一个完整的 URL,被称为_绝对形式_(absolute form),主要在使用 GET 方法连接到代理时使用。GET http://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages HTTP/1.1
    • 由域名和可选端口(以 ':' 为前缀)组成的 URL 的 authority 部分,称为 authority form。仅在使用 CONNECT 建立 HTTP 隧道时才使用。CONNECT developer.mozilla.org:80 HTTP/1.1
    • 星号形式(asterisk form),一个简单的星号('*'),配合 OPTIONS 方法使用,代表整个服务器。OPTIONS * HTTP/1.1
  3. HTTP 版本(HTTP version),定义了剩余消息的结构,作为对期望的响应版本的指示符。

标头(Header)

来自请求的 HTTP 标头遵循和 HTTP 标头相同的基本结构:不区分大小写的字符串,紧跟着的冒号(':')和一个结构取决于标头的值。整个标头(包括值)由一行组成,这一行可以相当长。

有许多请求标头可用,它们可以分为几组:

主体(Body)

请求的最后一部分是它的主体。不是所有的请求都有一个主体:例如获取资源的请求,像 GETHEADDELETE 和 OPTIONS,通常它们不需要主体。有些请求将数据发送到服务器以便更新数据:常见的情况是 POST 请求(包含 HTML 表单数据)。

主体大致可分为两类:

响应

状态行

HTTP 响应的起始行被称作 状态行(status line),包含以下信息:

  1. 协议版本,通常为 HTTP/1.1
  2. 状态码(status code),表明请求是成功或失败。常见的状态码是 200404 或 302
  3. 状态文本(status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

一个典型的状态行看起来像这样:HTTP/1.1 404 Not Found

标头(Header)

响应的 HTTP 标头 遵循和任何其他标头相同的结构:不区分大小写的字符串,紧跟着的冒号(':')和一个结构取决于标头类型的值。整个标头(包括其值)表现为单行形式。

许多不同的标头可能会出现在响应中。这些可以分为几组:

主体(Body)

响应的最后一部分是主体。不是所有的响应都有主体:具有状态码(如 201 或 204)的响应,通常不会有主体。

主体大致可分为三类:

  • 单资源(Single-resource)主体,由已知长度的单个文件组成。该类型主体由两个标头定义:Content-Type 和 Content-Length
  • 单资源(Single-resource)主体,由未知长度的单个文件组成。通过将 Transfer-Encoding 设置为 chunked 来使用分块编码。
  • 多资源(Multiple-resource)主体,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。

HTTP/2 帧

HTTP/1.x 消息有一些性能上的缺点:

  • 与主体不同,标头不会被压缩。
  • 两个消息之间的标头通常非常相似,但它们仍然在连接中重复传输。
  • 无法多路复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。

HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流(stream)中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用(multiplexing)的过程,它允许更有效的底层 TCP 连接。

HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。


实例

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

客户端请求:

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

服务端响应:

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 消息可以包含更多的头字段,并且请求体和响应体的大小会根据传输的数据而变化。

HTTP 请求方法

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

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

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

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

HTTP 响应头信息

HTTP 响应头信息是服务器在响应客户端的HTTP请求时发送的一系列头字段,它们提供了关于响应的附加信息和服务器的指令。

以下是一些常见的 HTTP 响应头信息:

响应头信息(英文)响应头信息(中文)描述
Date日期响应生成的日期和时间。例如:Wed, 18 Apr 2024 12:00:00 GMT
Server服务器服务器软件的名称和版本。例如:Apache/2.4.1 (Unix)
Content-Type内容类型响应体的媒体类型(MIME类型),如text/html; charset=UTF-8application/json等。
Content-Length内容长度响应体的大小,单位是字节。例如:3145
Content-Encoding内容编码响应体的压缩编码,如 gzipdeflate等。
Content-Language内容语言响应体的语言。例如:zh-CN
Content-Location内容位置响应体的 URI。例如:/index.html
Content-Range内容范围响应体的字节范围,用于分块传输。例如:bytes 0-999/8000
Cache-Control缓存控制控制响应的缓存行为, 如 no-cache 表示必须重新请求。
Connection连接管理连接的选项,如keep-aliveclose,keep-alive 表示连接不会在传输后关闭。。
Set-Cookie设置 Cookie设置客户端的 cookie。例如:sessionId=abc123; Path=/; Secure
Expires过期时间响应体的过期日期和时间。例如:Thu, 18 Apr 2024 12:00:00 GMT
Last-Modified最后修改时间资源最后被修改的日期和时间。例如:Wed, 18 Apr 2024 11:00:00 GMT
ETag实体标签资源的特定版本的标识符。例如:"33a64df551425fcc55e6"
Location位置用于重定向的 URI。例如:/newresource
Pragma实现特定的指令包含实现特定的指令,如 no-cache
WWW-Authenticate认证信息认证信息,通常用于HTTP认证。例如:Basic realm="Access to the site"
Accept-Ranges接受范围指定可接受的请求范围类型。例如:bytes
Age经过时间响应生成后经过的秒数,从原始服务器生成到代理服务器。例如:24
Allow允许方法列出资源允许的 HTTP 方法 。例如:GET, POST,HEAD等
Vary变化告诉下游代理如何使用响应头信息来确定响应是否可以从缓存中获取。例如:Accept
Strict-Transport-Security严格传输安全指示浏览器仅通过 HTTPS 与服务器通信。例如:max-age=31536000; includeSubDomains
X-Frame-Options框架选项控制页面是否允许在框架中显示,防止点击劫持攻击。例如:SAMEORIGIN
X-Content-Type-Options内容类型选项指示浏览器不要尝试猜测资源的 MIME 类型。例如:nosniff
X-XSS-ProtectionXSS保护控制浏览器的 XSS 过滤和阻断。例如:1; mode=block
Public-Key-Pins公钥固定HTTP 头信息,用于HTTP公共密钥固定(HPKP),一种安全机制,用于防止中间人攻击。例如:pin-sha256="base64+primarykey"; pin-sha256="base64+backupkey"; max-age=expireTime

这些响应头信息在实际的 HTTP 响应中可能会有所不同,具体值取决于服务器的配置和处理逻辑。

评论区

欢迎留言、补充或勘误。

xiaoba.blog