(题图:中国香港, 2018)
HTTP 协议是互联网的基础协议,协议相关内容也是前端开发的必备知识。互联网发展至今,HTTP 协议先后经历了 HTTP0.9、HTTP1.0、HTTP1.1、HTTP2.0 等多个版本,以下简称 0.9、1.0、1.1 和 2.0。
不同版本之间的区别
0.9 极其简单,只支持 GET 命令。而且客户端请求后,服务端只能返回 HTML 格式的字符串。服务器发送完毕,本次 Tcp 链接断开。
1.0 中实现了完整的请求报文和响应报文格式,1.1 中又加入了新的头部字段,主要区别在:
缓存实现
在 HTTP1.0 中的缓存实现
请求头 和响应头 配合实现协商缓。
请求头 和响应头 实现强缓存,使用的服务端时间,有效且内使用缓存,超过则请求。 1.0 中的两种缓存方式只能精确到1秒。
在 HTTP1.1 引入了新的请求/响应头实现缓存。
请求头 和响应头 实现协商缓存, 是资源实体标签的当前值,如果匹配到改变请求,否则使用缓存,这是十分精确的方式。
请求头 和响应头 实现强缓存,表示客户端的资源应该缓存多久,使用客户端时间。
带宽优化
HTTP1.1 在请求头引入了range头域,允许只请求资源的某个部分,即返回码是206(Partial Content)。1.0 中却要返回整个资源。
错误通知的管理
HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
Host 头部
客户端请求的头信息新增了Host字段,用来指定服务器的域名。解决一台物理服务器上可以存在多个虚拟主机的问题。
长连接
在 HTTP1.1 中默认开启 Connection:keep-alive 支持长连接。在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。弥补了 HTTP1.0 每次请求都要创建连接的缺点。keep-alive不会永远保持,它有一个持续时间,一般在服务器中配置(如apache),另外长连接需要客户端和服务器都支持时才有效。
HTTP2.0 主要特性
多路复用,即一个tcp/ip连接可以请求多个资源相当于并行。区别于 1.1 中长连接的方式,相当于并行。
首部压缩,http头部压缩,减少体积。
二进制分帧,在应用层跟传送层之间增加了一个二进制分帧层,改进传输性能,实现低延迟和高吞吐量。
服务器端推送,服务端可以对客户端的一个请求发出多个响应,可以主动通知客户端。
请求优先级,如果流被赋予了优先级,它就会基于这个优先级来处理,由服务器决定需要多少资源来处理该请求。
报文结构
报文包含三部分:通用头部,请求/响应头部,请求/响应体。
通用头部
Request Url: 请求的web服务器地址Request Method: 请求方式有 Get、POST、OPTIONS、PUT、HEAD、DELETE、CONNECT、TRACStatus Code: 请求的返回状态码Remote Address: 请求的远程服务器地址Referrer Policy: referrer 的设置策略
请求/响应头部
常见的请求头
Accept: 浏览器支持的MIME类型,对应响应头的 Content-TypeAccept-Encoding:浏览器支持的压缩类型,对应响应头的 Content-Encoding 如gzip等,超出类型不能接收Content-Type:客户端发送出去实体内容的类型Content-Length: 3495 表示本次回应的长度是3495个字节,后面的字节就属于下一个回应。Transfer-Encoding: chunked 表示回应将由数量未定的数据块组成,采用"流模式"(stream)取代Content-Length 的"缓存模式"(buffer)。Cache-Control: 指定请求和响应遵循的缓存机制,如no-cache 或 max-age=xxxxxIf-Modified-Since:对应服务端的Last-Modified,用来匹配看文件是否变动,只能精确到1s之内,http1.0中Expires:缓存控制,在这个时间内不会请求,直接使用缓存,而且是服务端时间,http1.0中Max-age:代表资源在本地缓存多少秒,有效时间内不会请求,而是使用缓存,http1.1中If-None-Match:对应服务端的ETag,用来匹配文件内容是否改变(非常精确),http1.1中Cookie: 有cookie并且同域访问时会自动带上Connection: 当浏览器与服务器通信时对于长连接如何进行处理,如keep-aliveHost:请求的服务器域名URLOrigin:最初的请求是从哪里发起,只会精确到端口。Origin比Referer更尊重隐私Referer:请求发起的URL 或 该页面的来源URL,精确到详细页面地址,csrf拦截常用到这个字段User-Agent:用户客户端的一些必要信息,如UA头部等
常见的响应头
Access-Control-Allow-Headers 服务端允许的请求端 HeadersAccess-Control-Allow-Methods 服务端允许的请求端方法Access-Control-Allow-Origin 服务端允许的请求 Origin Content-Type 服务端实体的类型Content-Encoding 服务端实体的压缩方法Date 数据从服务器发送的时间Cache-Control 告诉浏览器或客户,什么环境可以安全的缓存文档Last-Modified 该资源最后的修改时间Expires: 资源过期时间Max-age: 客户端的本地资源应该缓存多少秒,开启 Cache-Control 后有效 Etag: 资源实体标签的当前值Set-Cookie:设置 cookieKeep-Alive: 如果客户端有 keep-alive,服务端也会有响应 如timeout=38
请求/响应实体
请求实体一般是 query 参数表单对象。响应实体一般是 JSON 格式的数据,或者直接 HTML 字符串。
请求头和实体消息之间有一个CRLF分隔,响应头部和响应实体之间用一个CRLF分隔。CRLF(Carriage-Return Line-Feed),即回车换行,作为分隔符存在。
参考文档
https://juejin.im/entry/5981c5df518825359a2b9476http://www.ruanyifeng.com/blog/2016/08/http.htmlhttps://segmentfault.com/a/1190000013662126
领取专属 10元无门槛券
私享最新 技术干货