Http Protocol

Http Protocol

HTTP Introduction

HTTP(Hypertext Transfer Protocol)即超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上应用最广泛的一种网络协议,主要用于从万维网服务器传输超文本到本地浏览器的传输协议。HTTP 允许传输任意类型的数据对象,但主要设计目的是向用户提供一种发布和接收 HTML 文档的能力。

HTTP 协议的特点

  • 无状态(Stateless): HTTP 协议是无状态的,这意味着协议对于事务处理没有记忆能力。服务器完成对客户端的请求处理后,不会保留任何关于此次请求的数据。这意味着每个请求都是独立的,与之前的请求没有关联,简化了服务器的设计,提高了服务器的性能。
  • 无连接(Connectionless): HTTP 协议本质上是无连接的,即每个请求都是独立的,服务器处理完请求后就会断开连接。然而,从 HTTP/1.1 开始,引入了持久连接(Persistent Connection)的概念,允许客户端和服务器在一次连接中发送多个请求和响应,从而减少了建立和断开连接的开销,提高了效率。
  • 支持客户/服务器模式: HTTP 协议基于客户/服务器模型,客户端(如 Web 浏览器)向服务器发送请求,服务器响应请求并返回数据。
  • 基于请求/响应模型: 所有的通信都是基于客户端发起的请求,服务器对请求进行响应。请求可以携带数据(如表单提交),响应则包含状态码和可能的数据。
  • 标准端口: HTTP 协议默认使用 TCP 端口 80 进行通信,HTTPS(安全的 HTTP)使用端口 443。

HTTP 请求与响应

  • 请求:HTTP 请求由客户端发起,包含请求行、请求头部和可能的消息体。请求行包括请求方法(GET、POST、PUT、DELETE 等)、资源 URI 和使用的 HTTP 版本。
  • 响应:服务器对请求作出响应,响应包括状态行、响应头部和可能的消息体。状态行包含 HTTP 版本、状态码和状态消息,状态码用于表示请求的结果。

HTTP Message

HTTP Request Message

HTTP 请求报文主要由三部分组成:请求行 (Request-Line), 请求头 (Request Headers), 以及可选的请求正文 (Request Body).

Request Message

Request-Line

请求行由三个部分组成:

请求行由三个部分组成,分别是:

  • Method: 指明了客户端希望对资源执行的操作,如 GET, POST, PUT, DELETE, HEAD, OPTIONS 等。
  • Request-Target: 该字段指示了请求的具体目标资源,可以是绝对路径或相对路径,也可以是完整的 URI。
  • HTTP-Version: 指明了客户端使用的 HTTP 协议版本,例如 HTTP/1.1HTTP/2
1
GET /index.html HTTP/1.1

Request Headers

请求头包含了客户端和请求的附加信息,这些信息可以帮助服务器更好地处理请求。请求头由一个或多个字段组成,每个字段都包含一个名称和一个值,两者之间由 :分隔。常见的请求头包括:

Many different headers can appear in requests. They can be divided in several groups:

  • General headers, like Via, apply to the message as a whole.
  • Request headers, like User-Agent or Accept, modify the request by specifying it further (like Accept-Language), by giving context (like Referer), or by conditionally restricting it (like If-None-Match).
  • Representation headers like Content-Type that describe the original format of the message data and any encoding applied (only present if the message has a body).

Request Body

请求正文中包含实际要发送的数据,常用于 POST, PUT, 或 PATCH 方法。

HTTP Response Message

HTTP 响应报文同样分为三个部分:状态行 (Status-Line), 响应头 (Response Headers), 和可选的响应正文 (Response Body).

Response Message

Status-Line

状态行由以下部分组成:

  • HTTP 版本 (HTTP-Version)
  • 状态码 (Status Code): 如 200, 404, 500.
  • 状态消息 (Reason Phrase): 对状态码的描述。

示例:

1
HTTP/1.1 200 OK

HTTP Status Code

1xx (信息性状态码):表示服务器已经接收到请求,正在处理。

  • 100 Continue: 服务器已收到请求的初始部分,客户端应继续发送其余部分。
  • 101 Switching Protocols: 服务器已经理解客户端的请求,并将切换到更适合的协议进行通信。

2xx (成功状态码):表示请求已成功处理。

  • 200 OK: 请求成功,返回所请求的内容。
  • 201 Created: 请求成功,并在服务器上创建了一个新的资源。
  • 202 Accepted: 请求已被接受,但尚未处理完成。
  • 204 No Content: 请求成功,但服务器没有返回任何内容。

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

  • 301 Moved Permanently: 被请求的资源已永久移动到新位置,并且将来的请求应使用新的 URL。
  • 302 Found: 被请求的资源暂时移动到了新位置。
  • 304 Not Modified: 资源未被修改,可以直接使用缓存的版本。

4xx (客户端错误状态码):表示客户端发送了错误的请求。

  • 400 Bad Request: 客户端发送的请求语法错误。
  • 401 Unauthorized: 请求需要身份验证。
  • 403 Forbidden: 服务器拒绝了请求,客户端没有权限访问请求的资源。
  • 404 Not Found: 请求的资源在服务器上未找到。

5xx (服务器错误状态码):表示服务器在处理请求时发生了错误。

  • 500 Internal Server Error: 服务器在执行请求时遇到了未知的错误。
  • 502 Bad Gateway: 作为代理或网关的服务器收到无效的响应。
  • 503 Service Unavailable: 服务器暂时无法处理请求,通常是由于过载或维护。

Response Headers

响应头提供了关于响应的附加信息

These can be divided into several groups:

  • General headers, like Via, apply to the whole message.
  • Response headers, like Vary and Accept-Ranges, give additional information about the server which doesn’t fit in the status line.
  • Representation headers like Content-Type that describe the original format of the message data and any encoding applied (only present if the message has a body).

响应正文 (Response Body)

响应正文中包含了服务器响应的数据。

Version Comparison

  • HTTP/1.0:
    • 不支持持久连接 (Persistent Connection).
    • 每个请求都需要单独建立和关闭连接.
  • HTTP/1.1:
    • 默认启用持久连接.
    • 引入了管道化机制 (Pipelining), 允许在同一个连接上连续发送多个请求
    • 不支持多路复用,没有头部压缩.
  • HTTP/2:
    • 使用二进制格式,比文本格式更高效.
    • 支持多路复用 (Multiplexing), 在单个连接上可以同时处理多个请求和响应.
    • HTTP/2 中的头部压缩是一个关键特性,它使用了一种名为 HPACK 的算法来减少头部信息的大小,从而降低网络传输的开销,提高传输效率。在 HTTP/1.x 中,头部是以纯文本形式发送的,即使是重复的头部信息也会在每个请求中完整地传输,这会导致不必要的带宽消耗。
  • HTTP/3
    • 基于 QUIC(Quick UDP Internet Connections)协议,旨在解决 HTTP/2 的一些局限性,特别是提高网络性能和减少延迟。
    • QUIC 协议在 UDP 之上实现了类似于 TCP 的可靠性,同时提供了更快的连接建立时间和更好的拥塞控制算法

HPACK

HTTP/2 中的头部压缩是一个关键特性,它使用了一种名为 HPACK 的算法来减少头部信息的大小,从而降低网络传输的开销,提高传输效率。在 HTTP/1.x 中,头部是以纯文本形式发送的,即使是重复的头部信息也会在每个请求中完整地传输,这会导致不必要的带宽消耗。


HPACK 算法的工作原理

HPACK 是一种高效的头部压缩算法,它利用了两个主要概念:动态表和静态表。

  • 静态表 (Static Table): 这是一个预定义的、不可修改的表,包含了最常见的头部字段和它们的典型值。例如,User-Agent 字段经常会包含一些常见的浏览器标识,这些都被预先存储在静态表中。
  • 动态表 (Dynamic Table): 这是一个可变的表,用于存储最近遇到的头部字段及其值。每当一个头部字段被压缩并发送后,它会被添加到动态表中,以便后续的请求可以引用它。

压缩过程

  1. 编码:
    当发送方(客户端或服务器)准备压缩头部时,它会查看头部字段是否存在于静态表或动态表中。
    如果存在,它会使用一个索引值来代替完整的头部信息。
    如果不存在,发送方会将完整的头部信息编码,并将其添加到动态表中。
  2. 传输:
    压缩后的头部信息(索引或编码后的值)被发送给接收方。
    传输数据量显著减少,尤其是在头部信息重复的情况下。
  3. 解码:
    接收方收到压缩的头部信息后,会使用它自己的静态表和动态表来查找完整的头部信息。
    解码过程是基于索引查找的逆过程,将索引转换回原始的头部字段和值。

优势

  • 减少带宽使用: 重复的头部信息不再需要每次都完整传输,降低了数据传输量。
  • 提高传输效率: 减少了网络延迟,尤其是在高延迟的网络环境中,如移动网络。

Ref

[[Ch6-1ApplicationLayer#The Web and HTTP]]
HTTP Messages
RFC7541

Author

Efterklang

Posted on

2024-07-22

Updated on

2024-09-18

Licensed under

Comments