简介
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 /images/logo.png HTTP/1.1
-
请求头
Accept-Language: en
-
空行
-
请求体(可选)
请求方法
GET
请求一个特定的资源。
HEAD
POST
请求服务器接收携带的实体,将其作为被 URI 标识的新的子项。
PUT
请求把携带的实体储存在提供的 URI 上。
DELETE
请求删除指定的资源。
TRACE
OPTTIONS
CONNECT
响应 Response
响应信息由以下部分组成:
-
状态行
HTTP/1.1 200 OK
-
响应头
Content-Type: text/html
-
空行
-
响应体(可选)
状态码
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,按下回车后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 HTML 文本发送给浏览器;
- 释放 TCP 连接;
- 浏览器将该 HTML 文本并显示内容;
HTTP 首部
参考
第 117 题:介绍下 http1.0、1.1、2.0 协议的区别? · Issue #232 · Advanced-Frontend/Daily-Interview-Question
待
2020-3-15 21:12:00