Skip to content

HTTP协议

Posted on:March 15, 2020 at 18:18:19 GMT+8

简介

HTTP (Hypertext Transfer Protocol 超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 协议定义了客户端如何从服务器请求 Web 页面,以及服务器如何把 Web 页面返回给客户端。HTTP 是万维网数据通信的基础。

历史

HTTP 1.0 和 HTTP 1.1 的区别

缓存处理:HTTP 1.0 中主要使用 header 里的 If-Modified-Since,Expires 来作为缓存标准。HTTP 1.1 引入更多缓存控制策略,如 Entity tag,If-Unmodified-Since,If-Match,If-None-Match 等更多缓存头。

带宽优化及网络连接的使用:HTTP 1.1 请求头引入了 range,允许只请求资源的部分,返回码是 206 (Partial Content)。

错误通知的管理:新增了 24 个错误状态响应码。

Host 头处理

长连接:HTTP 1.1 支持长连接且默认开启 Connection : keep-alive,支持请求的流水线处理。

HTTP/2

HTTP/2 基于 Google 的 SPDY/3 草案。

多路复用,并行请求。一个 request 对应一个 id,一个连接上可以有多个 request ,每个连接的 request 可以随机混杂在一起,接收方可以根据 request 的 id 将 request 再归属带各自不同的服务端请求中。

HTTP/2 将一个 TCP 连接分为若干个流,每个流中可以传输若干消息,每个消息由若干个二进制帧组成。

使用 HPACK 算法对 HTTP 头部进行压缩。

服务器推送:服务器向客户端发送比客户端请求的更多的数据,省去了再进行一轮请求的时间。

特点

简单快速

灵活

无连接

无状态

URL

HTTP 资源在网络上用 URL 被标识和定位:

            userinfo          host        port
        ┌───────┴───────┐ ┌────┴────────┐ ┌┴┐
 http://john.doe:password@www.example.com:123/forum/questions/?tag=networking&order=newest#top
 └─┬─┘ └───────────┬────────────────────────┘└─┬─────────────┘└────────┬──────────────────┘└┬─┘
 scheme         authority                      path                  query             fragment

请求 Request

请求信息由以下部分组成:

请求方法

GET

请求一个特定的资源。

POST

请求服务器接收携带的实体,将其作为被 URI 标识的新的子项。

PUT

请求把携带的实体储存在提供的 URI 上。

DELETE

请求删除指定的资源。

TRACE

OPTTIONS

CONNECT

响应 Response

响应信息由以下部分组成:

状态码

1xx:信息

2xx:成功

200 OK

204 No Content

206 Partial Content

210 Created

3xx:重定向

301 Moved Permanently

302 Found

303 See Other

303 明确客户端应当采用 GET 方法获取资源。

304 Not Modified

307 Temporary Redirect

307 不会从 POST 变成 GET。

4xx:客户端错误

400 Bad Request

401 Unauthorized

403 Forbidden

404 Not Found

5xx:服务端错误

500 Internal Server Error

503 Service Unavailable

完整列表

示例

客户端请求

GET / HTTP/1.1
Host: www.example.com

服务端响应

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close

<html>
  <head>
    <title>An Example Page</title>
  </head>
  <body>
    <p>Hello World, this is a very simple HTML document.</p>
  </body>
</html>

工作流程

客户端向服务器发送一个请求报文,服务器则返回一个响应报文。

具体步骤:

客户端连接到服务器

客户端,通常是浏览器,与 Web 服务器的 HTTP 端口(默认80)建立一个 TCP 套接字连接。

客户端发送 HTTP 请求

通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文(HTTP 2是二进制协议而不再是文本协议)。

服务器接受请求并返回 HTTP 请求

Web 服务器解析请求,定位请求资源。服务器将资源副本写到 TCP 套接字,由客户端读取。

释放 TCP 连接

客户端服务器解析 HTML 内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

如:在浏览器地址栏键入 URL,按下回车后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 HTML 文本发送给浏览器;
  5. 释放 TCP 连接;
  6. 浏览器将该 HTML 文本并显示内容;

HTTP 首部

参考

Hypertext Transfer Protocol

关于HTTP协议,一篇就够了

HTTP

HTTP1.0、HTTP1.1 和 HTTP2.0 的区别

第 117 题:介绍下 http1.0、1.1、2.0 协议的区别? · Issue #232 · Advanced-Frontend/Daily-Interview-Question

中文 - http2 explained

简体中文 - HTTP/3 explained

2020-3-15 21:12:00