Skip to content

HTTP Semantics

1. Introduction

1.1. Purpose

HTTP(超文本传输协议)是一种无状态的应用层协议,主要用于分布式、协作式的超文本信息系统。HTTP 通过提供一个通用接口,使得客户端和服务器之间的交互变得灵活且独立于资源的类型和实现方式。

1.2. History and Evolution

HTTP 自 1990 年引入以来,一直是万维网的主要信息传输协议。HTTP/1.1 在 1997 年成为标准,并在 1999 年和 2014 年进行了修订。HTTP/2 和 HTTP/3 分别引入了多路复用和基于 QUIC 协议的传输,以提高效率和独立性。

1.3. Core Semantics

HTTP 提供了一个统一的接口,通过发送消息来操作或传输资源的表示。每条消息要么是请求,要么是响应。请求消息包含客户端的意图,响应消息包含服务器对请求的处理结果。

2. Conformance

2.1. Syntax Notation

使用扩展的 ABNF(Augmented Backus-Naur Form)语法表示 HTTP 消息的语法规则,定义了大小写敏感性和列表扩展等。

2.2. Requirements Notation

使用关键字“MUST”、“SHOULD”、“MAY”等来描述规范的强制性要求。发送者必须生成符合语法规则的协议元素,接收者必须防御性地解析接收到的协议元素。

2.3. Length Requirements

HTTP 没有对协议元素的长度设置具体限制,但接收者必须能够解析和处理至少与其生成的协议元素同等长度的值。

2.4. Error Handling

接收者必须按照规范解释接收到的协议元素,但可以尝试从无效结构中恢复可用的协议元素。

2.5. Protocol Version

HTTP 的版本号由两个十进制数字组成,分别表示协议的主版本和次版本。每个主要版本的 HTTP 都依赖于本文档中定义的语义。

3. Terminology and Core Concepts

3.1. Resources

HTTP 请求的目标称为“资源”,通常通过 URI(统一资源标识符)来标识。

3.2. Representations

表示是反映资源状态的信息,包括表示元数据和表示数据。

3.3. Connections, Clients, and Servers

HTTP 是一个基于可靠传输层或会话层连接的客户端/服务器协议。

3.4. Messages

HTTP 消息由请求和响应组成,包含方法、目标、状态码、头字段、内容等。

3.5. User Agents

用户代理是发起请求的客户端程序,包括浏览器、爬虫、命令行工具等。

3.6. Origin Server

源服务器是可以为特定资源生成权威响应的程序。

3.7. Intermediaries

HTTP 支持使用中介来通过一系列连接满足请求,包括代理、网关和隧道。

3.8. Caches

缓存是存储先前响应消息的本地存储,目的是减少响应时间和网络带宽消耗。

3.9. Example Message Exchange

示例展示了一个典型的 HTTP/1.1 消息交换过程,包括 GET 请求和 200 OK 响应。

4. Identifiers in HTTP

4.1. URI References

URI 引用用于目标请求、重定向和定义关系。

HTTP 和 HTTPS 是 HTTP 服务器固有的 URI 方案,分别用于未加密和加密的 HTTP 通信。

4.3. Authoritative Access

权威访问指的是在客户端认为是权威的方式下解引用给定标识符。

5. Fields

5.1. Field Names

字段名标识相应字段值的语义,字段名是不区分大小写的。

5.2. Field Lines and Combined Field Value

字段部分由任意数量的“字段行”组成,每个字段行都有一个字段名和字段行值。

5.3. Field Order

接收者可以组合具有相同字段名的多个字段行,字段行的接收顺序对字段值的解释很重要。

5.4. Field Limits

HTTP 对字段行、字段值或整个头部或尾部部分的长度没有预定义限制。

5.5. Field Values

字段值由一系列字符组成,通常使用 ABNF 定义其语法。

5.6. Common Rules for Defining Field Values

定义字段值的通用规则包括列表、令牌、空白、引号字符串、注释和参数。

6. Message Abstraction

6.1. Framing and Completeness

消息框架指示每个消息的开始和结束,使得每个消息可以与同一连接上的其他消息或噪音区分开来。

6.2. Control Data

消息以描述其主要目的的控制数据开始,包括请求方法、请求目标、协议版本、状态码等。

6.3. Header Fields

在内容之前发送或接收的字段称为“头字段”。

6.4. Content

HTTP 消息通常传输一个完整或部分表示作为消息内容。

6.5. Trailer Fields

位于“尾部部分”的字段称为“尾部字段”,用于传输消息完整性检查、数字签名等。

6.6. Message Metadata

描述消息本身的字段,如生成时间和方式,可以出现在请求和响应中。

7. Routing HTTP Messages

7.1. Determining the Target Resource

客户端通过解析目标 URI 的组件来确定目标资源,并在消息控制数据和 Host 头字段中发送这些组件。

7.2. Host and :authority

Host 头字段提供目标 URI 的主机和端口信息,使得源服务器能够区分多个主机名的资源。

7.3. Routing Inbound Requests

客户端决定是否需要网络请求以及请求的目标位置。

7.4. Rejecting Misdirected Requests

服务器决定是否处理请求、转发请求、重定向客户端、响应错误或关闭连接。

7.5. Response Correlation

一个连接可能用于多个请求/响应交换,相关机制取决于 HTTP 版本。

7.6. Message Forwarding

中介可以增强或干扰 HTTP 流,必须实现 Connection 头字段并排除不应转发的字段。

7.7. Message Transformations

一些中介会转换消息及其内容,例如图像格式转换或恶意软件过滤。

7.8. Upgrade

Upgrade 头字段提供了一种在同一连接上从 HTTP/1.1 过渡到其他协议的简单机制。

8. Representation Data and Metadata

8.1. Representation Data

表示数据与 HTTP 消息相关联,定义了表示元数据头字段。

8.2. Representation Metadata

表示头字段提供关于表示的数据,当消息包含内容时,这些头字段描述如何解释这些数据。

8.3. Content-Type

Content-Type 头字段指示相关表示的媒体类型,定义数据格式和处理方式。

8.4. Content-Encoding

Content-Encoding 头字段指示表示应用了哪些内容编码,主要用于压缩表示数据。

8.5. Content-Language

Content-Language 头字段描述表示的目标受众的自然语言。

8.6. Content-Length

Content-Length 头字段指示相关表示的数据长度,以十进制非负整数表示。

8.7. Content-Location

Content-Location 头字段引用一个 URI,可以用作与消息内容对应的特定资源的标识符。

8.8. Validator Fields

验证器字段是用于观察资源状态和测试前提条件的元数据,通常用于缓存验证和条件请求。

9. Methods

9.1. Overview

请求方法标记是请求语义的主要来源,指示客户端发出请求的目的以及期望的成功结果。

9.2. Common Method Properties

包括安全方法、幂等方法和缓存方法的定义。

9.3. Method Definitions

定义了 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS 和 TRACE 方法的具体语义和使用场景。

10. Message Context

10.1. Request Context Fields

请求头字段提供关于请求上下文的附加信息,包括用户、用户代理和资源的信息。

10.2. Response Context Fields

响应头字段提供关于响应的附加信息,包括服务器、目标资源或相关资源的信息。

11. HTTP Authentication

11.1. Authentication Scheme

HTTP 提供了一个通用的访问控制和认证框架,通过可扩展的挑战响应认证方案来实现。

11.2. Authentication Parameters

认证方案后跟随必要的附加信息,以实现通过该方案进行认证。

11.3. Challenge and Response

401(未授权)和 407(需要代理认证)响应消息用于挑战客户端的授权。

11.4. Credentials

Authorization 和 Proxy-Authorization 头字段包含客户端的凭证,用于请求资源的领域。

11.5. Establishing a Protection Space (Realm)

保护空间由服务器的起源和领域值共同定义,确定凭证的自动应用范围。

11.6. Authenticating Users to Origin Servers

包括 WWW-Authenticate、Authorization 和 Authentication-Info 头字段的使用。

11.7. Authenticating Clients to Proxies

包括 Proxy-Authenticate、Proxy-Authorization 和 Proxy-Authentication-Info 头字段的使用。

12. Content Negotiation

12.1. Proactive Negotiation

客户端在请求中发送内容协商偏好,以鼓励服务器选择最合适的表示。

12.2. Reactive Negotiation

用户代理在接收到初始响应后选择内容的机制。

12.3. Request Content Negotiation

服务器在响应中发送内容协商偏好,以影响后续请求的内容选择。

12.4. Content Negotiation Field Features

包括缺失、质量值和通配符值的定义和使用。

12.5. Content Negotiation Fields

定义了 Accept、Accept-Charset、Accept-Encoding、Accept-Language 和 Vary 头字段的具体语义和使用。

13. Conditional Requests

13.1. Preconditions

前提条件通常与目标资源的状态或先前获取的表示状态相关。

13.2. Evaluation of Preconditions

定义了何时评估前提条件以及多个前提条件存在时的优先级。

14. Range Requests

14.1. Range Units

表示数据可以按结构单元划分为子范围,字节范围是最常见的单位。

14.2. Range

Range 头字段在 GET 请求中请求传输表示数据的一个或多个子范围。

14.3. Accept-Ranges

Accept-Ranges 头字段指示上游服务器是否支持目标资源的范围请求。

14.4. Content-Range

Content-Range 头字段在 206(部分内容)响应中指示传输的表示部分的范围。

14.5. Partial PUT

一些源服务器支持在 PUT 请求中使用 Content-Range 头字段进行部分更新。

14.6. Media Type multipart/byteranges

当 206 响应包含多个范围的内容时,它们作为多部分消息体传输,使用"multipart/byteranges"媒体类型。

15. Status Codes

15.1. Overview of Status Codes

状态码描述请求的结果和响应的语义,包括请求是否成功以及包含的内容。

15.2. Informational 1xx

1xx(信息)类状态码表示临时响应,用于在完成请求操作之前传达连接状态或请求进度。

15.3. Successful 2xx

2xx(成功)类状态码表示客户端的请求已成功接收、理解并接受。

15.4. Redirection 3xx

3xx(重定向)类状态码表示需要进一步操作以完成请求。

15.5. Client Error 4xx

4xx(客户端错误)类状态码表示客户端似乎有错误。

15.6. Server Error 5xx

5xx(服务器错误)类状态码表示服务器意识到自己出错或无法执行请求的方法。

16. Extending HTTP

16.1. Method Extensibility

HTTP 方法注册表维护方法名称的命名空间。

16.2. Status Code Extensibility

HTTP 状态码注册表维护状态码的命名空间。

16.3. Field Extensibility

HTTP 字段注册表定义了 HTTP 字段名称的命名空间。

16.4. Authentication Scheme Extensibility

HTTP 认证方案注册表定义了认证方案的命名空间。

16.5. Range Unit Extensibility

HTTP 范围单位注册表定义了范围单位名称的命名空间。

16.6. Content Coding Extensibility

HTTP 内容编码注册表定义了内容编码名称的命名空间。

16.7. Upgrade Token Registry

HTTP 升级令牌注册表定义了用于在 Upgrade 头字段中标识协议的协议名称标记的命名空间。

17. Security Considerations

17.1. Establishing Authority

HTTP 依赖于“权威响应”的概念,攻击用户的网络主机表、缓存名称或名称解析库可能会影响权威响应的建立。

17.2. Risks of Intermediaries

HTTP 中介固有的路径攻击风险,中介可能会访问安全相关信息、个人信息和专有信息。

17.3. Attacks Based on File and Path Names

源服务器需要避免访问具有特殊意义的名称,以防止基于文件和路径名的攻击。

17.4. Attacks Based on Command, Code, or Query Injection

源服务器通常使用 URI 中的参数来标识系统服务、选择数据库条目或选择数据源,必须防止命令、代码或查询注入攻击。

17.5. Attacks via Protocol Element Length

HTTP 解析器容易受到基于发送非常长或非常慢的数据流的攻击,接收者必须限制处理协议元素的长度。

17.6. Attacks Using Shared-Dictionary Compression

某些攻击利用动态压缩创建的大小差异来泄露机密信息,最有效的缓解措施是禁用对敏感数据的压缩。

17.7. Disclosure of Personal Information

客户端通常掌握大量个人信息,必须防止无意泄露这些信息。

17.8. Privacy of Server Log Information

服务器日志信息是机密的,日志信息应安全存储并遵循适当的分析指南。

17.9. Disclosure of Sensitive Information in URIs

URI 通常是共享的,不是安全的,不应包含敏感、个人身份信息或风险信息。

17.10. Application Handling of Field Names

服务器通常使用非 HTTP 网关接口和框架来处理接收到的请求并生成响应,必须防止字段名映射的不完整或歧义。

17.11. Disclosure of Fragment after Redirects

尽管 URI 引用中使用的片段标识符不会在请求中发送,但在重定向后它们会对用户代理和任何扩展或脚本可见,可能会泄露一个站点的片段给另一个站点。

17.12. Disclosure of Product Information

User-Agent、Via 和 Server 头字段通常会泄露关于发送方软件系统的信息,可能会使攻击者更容易利用已知的安全漏洞。

17.13. Browser Fingerprinting

浏览器指纹识别是一组通过其独特特征识别特定用户代理的方法,可能会导致隐私问题。

17.14. Validator Retention

验证器的设计不用于确保表示的有效性、保护免受恶意更改或检测路径攻击,用户代理应确保在用户执行隐私维护操作时清除缓存。

17.15. Denial-of-Service Attacks Using Range

不受约束的多重范围请求容易受到拒绝服务攻击,服务器应忽略、合并或拒绝过多的小范围请求。

17.16. Authentication Considerations

HTTP 认证框架的安全考虑,包括凭证的机密性、空闲客户端的凭证、保护空间和附加响应字段的处理。