开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
一、HTTP的发展过程
1.1 HTTP定义
- 定义:超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议。
- 作用:规定WWW服务器与浏览器之间信息传递规范,是二者共同遵守的协议
1.2 发展
- HTTP0.9(1991年)
- 0.9协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。
- 只能是GET请求
- 服务端返回的格式只能是html
- 服务端响应数据之后自动断开连接
- HTTP1.0 (1996 年 5 月)
- 图像、视频、文字等富文本信息都允许传输,数据传输不再局限
- 除了GET请求之后,POST,HEAD等请求
- 新增了http header,状态码,缓存等基本功能
- 每次请求完毕之后依旧会自动断开连接
- HTTP1.1 (1997 年 1 月)
- 解决了连接问题,新增了(Connection:keep-alive)长连接的功能,请求结束之后,客户端会向服务端发送一个Connection: close的参数,要求服务端关闭链接。
- 解决的问题:一段时间内,同一个域名多次请求数据,只建立依次HTTP请求,其他的请求可服用每一次建立的连接通道,以达到提高请求效率的问题
- 新增了请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 、CONNECT
- 引入了管道机制:允许客户端一次性发送多个请求,然后服务端依次处理请求内容
- 缓存方面:引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等
- 资源请求方面:请求头中引入了 range 字段,支持断点续传。允许响应数据分块(chunked),利于传输大文件
- 解决了连接问题,新增了(Connection:keep-alive)长连接的功能,请求结束之后,客户端会向服务端发送一个Connection: close的参数,要求服务端关闭链接。
- **HTTP2.0 **(2015年)
- 二进制传输协议:原先HTTP1.1的时候,头部信息使用文本来传输,body信息可以用文本或者二进制传输,但是HTTP2.0 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧
- 多路复用:废弃了 1.1 中的管道,HTTP2.02】 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵塞"的问题
- 数据流:HTTP2.0每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号
- 头信息压缩:一:头信息使用 gzip 或 compress 压缩后再发送;二:客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号。
- 服务端主动推送:允许服务器未经请求,主动向客户端发送资源
- HTTP3.0 (2022年6月发布)
- HTTP3.0基于UDP协议的“QUIC”协议
- QUIC协议解决了HTTP2.0 TCP丢包阻塞的问题
- QUIC实现了快速握手功能
1.3 总结
| 协议版本 | 解决的核心问题 | 解决方式 |
|---|---|---|
| 0.9 | HTML 文件传输 | 确立了客户端请求、服务端响应的通信流程 |
| 1.0 | 不同类型文件传输 | 设立头部字段 |
| 1.1 | 创建/断开 TCP 连接开销大 | 建立长连接进行复用 |
| 2 | 并发数有限 | 二进制分帧 |
| 3 | TCP 丢包阻塞 | 采用 UDP 协议 |
二、HTTP报文结构
HTTP 报文的三个组成部分(起始行、首部、空行和实体的主体部分)
2.1 请求报文
HTTP的请求报文由四部分组成(请求行+请求头部+空行+请求体)
POST / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
Cookie: xxxxxxxxxxxxx
name=tom&password=123
2.1.1 请求行
请求行由请求方法、URL 和 HTTP 协议版本组成,它们之间用空格分开
即上图中的GET / HTTP/1.1
请求方法有:GET、POS、TDELETE、HEAD、OPTIONS、PUT、TRACE
2.1.2 请求头
更多可以查看HTTP Headers key value的形势,允许客户端传递关于自身的信息,一些常见的请求头为:
Accept:指定客户端能够接收的内容类型,text/html,application/xhtml+xml,application/xml
Accept-Charset:浏览器可以接受的字符编码集。
Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型,gzip, deflate, sdch, br
Accept-Language:浏览器可接受的语言,zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4
Accept-Ranges:可以请求网页实体的一个或者多个子范围字段。
Authorization:授权的授权证书。
Cache-Control:指定请求和响应遵循的缓存机制。
Connection:表示是否需要持久连接。(HTTP 1.1默认进行持久连接)
close:告诉WEB服务器或代理服务器,在完成本次请求的响应后,断开连接
keep-alive:告诉WEB服务器或代理服务器。在完成本次请求的响应后,保持连接,以等待后续请求
Cookie:请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。cookie - PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255;
Content-Length:请求的内容长度。
Content-Type:请求的与实体对应的MIME信息。
Date:请求发送的日期和时间。
Expect:请求的特定的服务器行为。
From:发出请求的用户的Email。
Host:指定请求的服务器的域名和端口号。
If-Match:只有请求内容与实体相匹配才有效。
If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码。
If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变。
If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。
If-Unmodified-Since:只在实体在指定时间之后未被修改才请求成功。
Max-Forwards:限制信息通过代理和网关传送的时间。
Pragma:用来包含实现特定的指令。
Proxy-Authorization:连接到代理的授权证书。
Range:只请求实体的一部分,指定范围。
Referer:先前网页的地址,当前请求网页紧随其后,即来路。
TE:客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息。
Upgrade:向服务器指定某种传输协议以便服务器进行转换(如果支持。
User-AgentUser-Agent:的内容包含发出请求的用户信息。
Via:通知中间网关或代理服务器地址,通信协议。
Warning:关于消息实体的警告信息
2.1.3 空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头
2.1.4 请求体
请求数据不在 GET 方法中使用,而是在 POST 方法中使用。与请求数据相关的最常使用的请求头是 Content-Type和 Content-Length。
2.2 响应报文
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 30 Mar 2017 12:28:00 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Cache-Control: private
Expires: Thu, 30 Mar 2017 12:27:43 GMT
Set-Cookie: BDSVRTM=0; path=/
2.2.1 状态行
响应行一般由协议版本、状态码及其描述组成
比如 HTTP/1.1 200 OK
- HTTP-Version - HTTP 协议版本
- Status-Code - 状态码
- Reason-Phrase - 状态码描述
- CRLF - 回车/换行符
2.2.2 响应头
更多可以查看HTTP Headers
响应头由 key-value 对组成
Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求。
Age:从原始服务器到代理缓存形成的估算时间(以秒计,非负)。
Allow:对某网络资源的有效的请求行为,不允许则返回405。
Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型。
private 默认为private 响应只能够作为私有的缓存,不能再用户间共享
public 浏览器和缓存服务器都可以缓存页面信息。
must-revalidate 对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时。
no-cache 浏览器和缓存服务器都不应该缓存页面信息。
max-age=10 是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。
no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。
Content-Encoding:服务器支持的返回内容压缩编码类型。。
Content-Language:响应体的语言。
Content-Length:响应体的长度。
Content-Location:请求资源可替代的备用的另一地址。
Content-MD5:返回资源的MD5校验值。
Content-Range:在整个返回体中本部分的字节位置。
Content-Type:返回内容的MIME类型。
Date:原始服务器消息发出的时间。
ETag:请求变量的实体标签的当前值。
Expires:响应过期的日期和时间。
Last-Modified:请求资源的最后修改时间。
Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源。
Pragma:包括实现特定的指令,它可应用到响应链上的任何接收方。
Proxy-Authenticate:它指出认证方案和可应用到代理的该URL上的参数。
refresh:应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
Retry-After:如果实体暂时不可取,通知客户端在指定时间之后再次尝试。
Server:服务器软件名称。
Set-Cookie:设置Http Cookie。
Trailer:指出头域在分块传输编码的尾部存在。
Transfer-Encoding:文件传输编码。
Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的
Vary:告诉下游代理是使用缓存响应还是从原始服务器请求。
Via:告知代理客户端响应是通过哪里发送的。
Warning:警告实体可能存在的问题。
WWW-Authenticate:表明客户端请求实体应该使用的授权方案
2.2.3 空行
最后一个响应头之后是一个空行,发送回车符和换行符,通知浏览器以下不再有响应头
2.2.4 响应体
服务器返回给浏览器的响应信息,例如:
三、HTTP状态码
3.1 消息(1XX)
代表请求已被接受,需要继续处理。
-
100 Continue
- 客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请 求的剩余部分,或者如果请求已经完成,忽略这个响应
-
101 Switching Protocols
- 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的 空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。
-
102 Processing
- 代表处理将被继续执行
3.2 成功(2XX)
代表请求已成功被服务器接收、理解、并接受。
-
200 OK
- 请求已成功,请求所希望的响应头或数据体将随此响应返回
-
201 Created (已创建)
- 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回
-
202 Accepted (已接受)
- 服务器已接受请求,但尚未处理。
-
203 Non-Authoritative Information (非授权信息)
- 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。
- 当前的信息可能是原始版本的子集或者超集。
-
204 No Content (无内容)
- 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息
-
205 Reset Content(重置内容)
- 服务器成功处理了请求,且没有返回任何内容。
-
206 Partial Content(部分内容)
- 服务器已经成功处理了部分 GET 请求。
- 该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件
-
207 Multi-Status(多状态)
- 由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
3.3 重定向(3XX)
客户端采取进一步的操作才能完成请求, 通常,这些状态代码用来重定向
-
300 Multiple Choices (多种选择)
- 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
-
301 Moved Permanently(永久移动)
- 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
- 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
-
302 Move Temporarily(临时移动)
- 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
-
303 See Other(查看其他位置)
- 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
-
304 Not Modified(未修改)
- 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容
- 缓存会用到
-
305 Use Proxy(使用代理)
- 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理
-
307 Temporary Redirect(临时重定向)
- 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
3.4 请求错误(4XX)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
-
400 Bad Request(错误请求)
- 服务器不理解请求的语法。
- 请求参数有误
-
401 Unauthorized(未授权)
- 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
-
403 Forbidden(禁止)
- 服务器拒绝请求。
-
404 Not Found(未找到)
- 请求失败,请求所希望得到的资源未被在服务器上发现。
-
405 Method Not Allowed(方法禁用)
- 请求行中指定的请求方法不能被用于请求相应的资源
-
406 Not Acceptable(不接受)
- 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
-
407 Proxy Authentication Required(需要代理授权)
- 此状态代码与 401(未授权)类似,但客户端必须在代理服务器上进行身份验证。
-
408 Request Timeout(请求超时)
- 服务器等候请求时发生超时。
-
409 Conflict(冲突)
- 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
-
410 Gone(已删除)
- 如果请求的资源已永久删除,服务器就会返回此响应。
-
411 Length Required(需要有效长度)
- 服务器拒绝在没有定义 Content-Length 头的情况下接受请求。
- 在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
-
412 Precondition Failed(未满足前提条件)
- 服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。
-
413 Request Entity Too Large(请求实体过大)
- 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
-
414 (Request-URI Too Long请求的 URI 过长)
- 请求的 URI(通常为网址)过长,服务器无法处理。
-
415 Unsupported Media Type(不支持的媒体类型)
- 请求的格式不受请求页面的支持。
-
416 Requested Range Not Satisfiable(请求范围不符合要求)
- 如果页面无法提供请求的范围,则服务器会返回此状态代码。
-
417 Expectation Failed(未满足期望值)
- 服务器未满足"期望"请求标头字段的要求。
3.5 服务器错误(5XX)
服务器在尝试处理请求时发生内部错误
-
500 Internal Server Error(服务器内部错误)
- 服务器遇到错误,无法完成请求。
-
501 Not Implemented(尚未实施)
- 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
-
502 Bad Gateway(错误网关)
- 服务器作为网关或代理,从上游服务器收到无效响应。
-
503 Service Unavailable(服务不可用)
- 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
-
504 Gateway Timeout(网关超时)
- 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
-
505 HTTP Version Not Supported(HTTP 版本不受支持)
- 服务器不支持请求中所用的 HTTP 协议版本。