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-Line
请求行由三个部分组成:
请求行由三个部分组成,分别是:
- Method: 指明了客户端希望对资源执行的操作,如
GET
,POST
,PUT
,DELETE
,HEAD
,OPTIONS
等。 - Request-Target: 该字段指示了请求的具体目标资源,可以是绝对路径或相对路径,也可以是完整的 URI。
- HTTP-Version: 指明了客户端使用的 HTTP 协议版本,例如
HTTP/1.1
或HTTP/2
。
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).
Status-Line
状态行由以下部分组成:
- HTTP 版本 (HTTP-Version)
- 状态码 (Status Code): 如
200
,404
,500
. - 状态消息 (Reason Phrase): 对状态码的描述。
示例:
Response Header
响应头提供了关于响应的附加信息
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 的可靠性,同时提供了更快的连接建立时间和更好的拥塞控制算法
Ref
Http Protocol