1. 什么是HTTP协议?
- HTTP,英文为 HyperText Transfer Protocol, 中文译为超文本传输协议(HTTP)。HTTP 是互联网上使用最广的一种应用层协议。其最设计的目的是用于传输超媒体文档(例如 HTML 文件、图片文件、 音视频文件等)。 进一步,HTTP是 Web 浏览器客户端与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端-服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP
2. HTTP 的发展历史?
- 简单来说HTTP 先后存在0.9、1.0、1.1三个版本,我们目前上网使用最广泛的是http/1.1协议,发布于1997年,距今已经20多年了,至今仍然是访问网站的主流协议。
2.1 HTTP 0.9
2.2 HTTP 1.0
- HTTP 1.0 ---- RFC1945 https://tools.ietf.org/html/rfc1945
- 1996 年发布,主要更新功能如下:
①任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。这为互联网的大发展奠定了基础;
② 除了GET命令,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段;
③ HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
④ 其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
2.3 HTTP 1.1
- HTTP 1.1 ----- RFC2616 https://tools.ietf.org/html/rfc2616
- 1997年发布,在 1.0 基础上进行更新,增加了如长久连接 keep-alive 与 chunked 等功能。
2.4 HTTP 2.0
- HTTP 2.0 ------ RFC7540 https://tools.ietf.org/html/rfc7540
- HTTP 2.0 首个草案已于 2012 年 11 月发布,2013年正式发布。它保证了与 HTTP 1.1 的完全语义兼容,最初考虑的是 Google SPDY 协议、微软的 SM 协议和 Network-Friendly HTTP 更新。最终各方推荐了 SPDY 协议,并在此基础上进行了相应更新。
- HTTP 2.0 新特性参见 https://maskwang520.github.io/2018/03/19/HTTP-2-%E6%96%B0%E7%89%B9%E6%80%A7%E6%80%BB%E7%BB%93/
3. HTTP 的报文格式?
- https://segmentfault.com/a/1190000012789390
3.1 请求报文
3.1.1 请求报文格式介绍
- 请求报文包含四个部分:请求行、请求头、空行、请求体
- 请求报文的响应行主要三个部分组成:① HTTP协议版本号;② HTTP状态码;③ 状态描述。
3.1.2 请求方法
- 根据HTTP标准,HTTP请求可以使用多种请求方法。HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
3.2 响应报文
3.2.1 响应报文格式介绍
- 响应报文同样包含四个部分:响应行、响应头、空行、响应体
- 响应报文的响应行主要三个部分组成:① HTTP协议版本号;② HTTP状态码;③ 状态描述。
3.2.2 响应状态码
- HTTP 状态代码由三位数字组成,第一个数字定义了响应的类别,共分五种类别:
响应类别 |
描述 |
1xx |
指示信息–表示请求已接收,继续处理 |
2xx |
成功–表示请求已被成功接收、理解、接受 |
3xx |
重定向–要完成请求必须进行更进一步的操作 |
4xx |
客户端错误–请求有语法错误或请求无法实现 |
5xx |
服务器端错误–服务器未能实现合法的请求 |
状态码 |
状态码英文名称 |
中文描述 |
100 |
Continue |
继续。客户端应继续其请求 |
101 |
Switching Protocols |
切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 |
OK |
请求成功。一般用于GET与POST请求 |
201 |
Created |
已创建。成功请求并创建了新的资源 |
202 |
Accepted |
已接受。已经接受请求,但未处理完成 |
203 |
Non-Authoritative Information |
非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 |
No Content |
无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 |
Reset Content |
重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 |
Partial Content |
部分内容。服务器成功处理了部分GET请求 |
300 |
Multiple Choices |
多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 |
Moved Permanently |
永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 |
Found |
临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 |
See Other |
查看其它地址。与301类似。使用GET和POST请求查看 |
304 |
Not Modified |
未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 |
Use Proxy |
使用代理。所请求的资源必须通过代理访问 |
306 |
Unused |
已经被废弃的HTTP状态码 |
307 |
Temporary Redirect |
临时重定向。与302类似。使用GET请求重定向 |
400 |
Bad Request |
客户端请求的语法错误,服务器无法理解 |
401 |
Unauthorized |
请求要求用户的身份认证 |
402 |
Payment Required |
保留,将来使用 |
403 |
Forbidden |
服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 |
Not Found |
服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 |
Method Not Allowed |
客户端请求中的方法被禁止 |
406 |
Not Acceptable |
服务器无法根据客户端请求的内容特性完成请求 |
407 |
Proxy Authentication Required |
请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 |
Request Time-out |
服务器等待客户端发送的请求时间过长,超时 |
409 |
Conflict |
服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突 |
410 |
Gone |
客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 |
Length Required |
服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 |
Precondition Failed |
客户端请求信息的先决条件错误 |
413 |
Request Entity Too Large |
由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 |
Request-URI Too Large |
请求的URI过长(URI通常为网址),服务器无法处理 |
415 |
Unsupported Media Type |
服务器无法处理请求附带的媒体格式 |
416 |
Requested range not satisfiable |
客户端请求的范围无效 |
417 |
Expectation Failed |
服务器无法满足Expect的请求头信息 |
500 |
Internal Server Error |
服务器内部错误,无法完成请求 |
501 |
Not Implemented |
服务器不支持请求的功能,无法完成请求 |
502 |
Bad Gateway |
充当网关或代理的服务器,从远端服务器接收到了一个无效的请求 |
503 |
Service Unavailable |
由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 |
Gateway Time-out |
充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 |
HTTP Version not supported |
服务器不支持请求的HTTP协议的版本,无法完成处理 |
4. HTTP 持久连接与非持久连接
4.1 非持久连接
- HTTP非持久连接是指每个TCP连接上只传送一个资源对象,HTTP/1.0使用非持久HTTP连接。
4.2 持久连接
- HTTP持久连接是指一个TCP连接上可以传送多个资源对象,HTTP/1.1默认使用持久HTTP连接。
(1) 不带流水线的持久HTTP连接: 客户先前响应消息收到,才发出新的请求消息,每个引用对象经历1个RTT。
(2) 带流水线的持久HTTP连接: HTTP/1.1默认使用, 客户遇到1个引用对象就发送请求消息,所有引用对象只经历1个RTT。
5. HTTP 头部字段
- HTTP首部字段根据实际用途被分为以下4种类型(参考链接:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
-
通用首部字段: 请求报文和响应报文两方都会使用的首部;
-
请求首部字段: 从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
-
响应首部字段: 从服务器端向客户端返回报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
-
实体首部字段: 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
5.1 通用首部字段(9个)
首部字段名 |
说明 |
Cache-Control |
控制缓存的行为 |
Connection |
逐跳首部、连接的管理 |
Date |
创建报文的日期时间 |
Program |
报文指令 |
Trailer |
报文末端的首部一览 |
Transfer-Encoding |
指定报文主体的传输编码方式 |
Upgrade |
升级为其他协议 |
Via |
代理服务器的相关信息 |
Warning |
错误通知 |
5.2 请求首部字段(19个)
首部字段名 |
说明 |
Accept |
用户代理可处理的媒体类型 |
Accept-Charset |
优先的字符集 |
Accept-Encoding |
优先的内容编码 |
Accept-Language |
优先的语言(自然语言) |
Authorization |
Web认证信息 |
Expect |
期待服务器的特定行为 |
From |
用户的电子邮箱地址 |
Host |
请求资源所在的服务器 |
If-Match |
比较实体标记(ETag) |
If-Modified-Since |
比较资源的更新时间 |
If-None-Match |
比较实体标记(与If-Match相反) |
If-Range |
资源未更新时发送实体Byte的范围请求 |
If-Unmodified-Since |
比较资源的更新时间(与If-Modified-Since相反) |
Max-Forwards |
最大传输逐跳数 |
Proxy-Authorization |
代理服务器要求客户端的认证信息 |
Range |
实体的字节范围请求 |
Referer |
对请求中的URI的原始获取方 |
TE |
传输编码的优先级 |
User-Agent |
HTTP客户端程序的信息 |
5.3 响应首部字段(9个)
首部字段名 |
说明 |
Accept-Ranges- |
是否接受字节范围请求 |
Age- |
推算资源创建经过时间 |
Content-Disposition- |
可以控制返回的资源是下载还是预览(图片) |
ETag- |
资源的匹配信息 |
Location- |
令客户端重定向至指定URI |
Proxy-Authenticate- |
代理服务器对客户端的认证信息 |
Retry-After- |
对再次发起请求的时机要求 |
Server- |
HTTP服务器的安装信息 |
Vary- |
代理服务器缓存的管理信息 |
WWW-Authenticate |
服务器对客户端的认证信息 |
5.4 实体首部字段(10个)
首部字段名 |
说明 |
Allow |
资源可支持的HTTP方法 |
Content-Encoding |
实体主体试用的编码方式 |
Content-Language |
实体主体的自然语言 |
Content-Length |
实体主体的大小(单位:字节) |
Content-Location |
替换对应资源的URI |
Content-MD5 |
实体主体的报文摘要 |
Content-Range |
实体主体的位置范围 |
Content-Type |
实体主体的媒体类型 |
Expires |
实体主体过期的日期时间 |
Last-Modified |
资源的最后修改日期时间 |