【前端 · 面试 】HTTP 总结(六)—— HTTP 版本区别

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战前端

最近我在作前端面试题总结系列,感兴趣的朋友能够添加关注,欢迎指正、交流。git

争取每一个知识点可以多总结一些,至少要作到在面试时,针对每一个知识点均可以侃起来,不至于哑火。web

HTTP 版本发展

前言

HTTP 各版本之间的区别也是一个面试常见问题。面试

HTTP 发展至今,总共经历了四个版本——HTTP 0.九、HTTP 1.0、HTTP 1.一、HTTP 2.0 。接下来,咱们分别看一下,各个版本给 HTTP 带来了什么改变。编程

HTTP 0.9

HTTP 0.9 是最先发布出来的一个版本,于1991年发布。浏览器

它只接受 GET 一种请求方法,没有在通信中指定版本号,且不支持请求头。因为该版本不支持 POST 方法,所以客户端没法向服务器传递太多信息。缓存

HTTP 0.9 具备典型的无状态性,每一个事务独立进行处理,事务结束时就释放这个链接。HTTP 协议的无状态特色在其第一个版本中已经成型。服务器

HTTP 1.0

HTTP 1.0是HTTP协议的第二个版本,于1996年发布,现在仍然被普遍使用,尤为是在代理服务器中。markdown

这是第一个在通信中指定版本号的HTTP协议版本,具备如下特色:网络

  • 不只仅支持 GET 命令,还支持 POST 和 HEAD 等请求方法。

  • HTTP 的请求和回应格式也发生了变化,除了要传输的数据以外,每次通讯都包含头信息,用来描述一些信息。

  • 再也不局限于 0.9 版本的纯文本格式

    根据头信息中的 Content-Type 属性,能够支持多种数据格式,这使得互联网不只仅能够用来传输文字,还能够传输图像、音频、视频等二进制文件。

  • 开始支持cache,就是当客户端在规定时间内访问同一网站,直接访问cache便可。

  • 其余的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

1.0 版本的工做方式是每次 TCP 链接只能发送一个请求,当服务器响应后就会关闭此次链接,下一个请求须要再次创建 TCP 链接。 TCP 链接的创建成本很高,由于须要客户端和服务器三次握手,而且开始时发送速率较慢(slow start)。

HTTP 1.0 版本的性能比较差。随着网页加载的外部资源愈来愈多,这个问题就愈发突出了。为了解决这个问题,有些浏览器在请求时,即在请求头部加上 Connection 字段:

image-20210806203636408

这个字段要求服务器不要关闭TCP链接,以便其余请求复用。服务器一样回应这个字段。

一个能够复用的TCP链接就创建了,直到客户端或服务器主动关闭链接。可是,这不是一个标准字段,不一样实现的行为可能不一致,所以不是根本的解决办法。

HTTP 1.1

默认采用持续链接(Connection: keep-alive),能很好地配合代理服务器工做。

屡次链接和持续链接

还支持以管道方式在同时发送多个请求,以便下降线路负载,提升传输速度。

HTTP 1.1 具备如下特色:

  • 引入了持久链接(persistent connection)

    即 TCP 链接默认不关闭,能够被多个请求复用,不用声明 Connection: keep-alive。客户端和服务器发现对方一段时间没有活动,就能够主动关闭链接。不过,规范的作法是,客户端在最后一个请求时,发送 Connection: close,明确要求服务器关闭 TCP 链接。

  • 加入了管道机制

    在同一个 TCP 链接里,容许多个请求同时发送,增长了并发性,进一步改善了 HTTP 协议的效率。

    举例来讲,客户端须要请求两个资源。之前的作法是,在同一个 TCP 链接里面,先发送 A 请求,而后等待服务器作出回应,收到后再发出 B 请求。

    管道机制则是容许浏览器同时发出 A 请求和 B 请求,可是服务器仍是按照顺序,先回应 A 请求,完成后再回应 B 请求。

    一个 TCP 链接如今能够传送多个回应,势必就要有一种机制,区分数据包是属于哪个回应的。这就是 Content-length 字段的做用,声明本次回应的数据长度。

  • 分块传输编码

    使用 Content-Length 字段的前提条件是,服务器发送回应以前,必须知道回应的数据长度。对于一些很耗时的动态操做来讲,这意味着,服务器要等到全部操做完成,才能发送数据,显然这样的效率不高。

    更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。

    所以,HTTP 1.1 版本规定能够不使用 Content-Length 字段,而使用"分块传输编码"(chunked transfer encoding)。只要请求或回应的头信息有 Transfer-Encoding 字段,就代表回应将由数量未定的数据块组成。

  • 新增了请求方式 PUT、PATCH、OPTIONS、DELETE 等。

  • 客户端请求的头信息新增了 Host 字段,用来指定服务器的域名。

  • HTTP 1.1 支持文件断点续传,RANGE:bytes,HTTP 1.0 每次传送文件都是从文件头开始,即 0 字节处开始。RANGE:bytes=XXXX 表示要求服务器从文件 XXXX 字节处开始传送,断点续传。即返回码是 206(Partial Content)

HTTP/2.0

这也是最新的 HTTP 版本,于 2015 年 5 月做为互联网标准正式发布。

它具备如下特色:

  • 二进制协议

    HTTP 1.1 版的头信息确定是文本(ASCII 编码),数据体能够是文本,也能够是二进制。

    HTTP 2.0 则是一个完全的二进制协议,头信息和数据体都是二进制,而且统称为"帧"(frame):头信息帧和数据帧。

  • 多工

    HTTP 2.0 复用 TCP 链接,在一个链接里,客户端和浏览器均可以同时发送多个请求或回应,并且不用按照顺序一一对应,这样就避免了"队头堵塞"(HTTP 2.0 使用了多路复用的技术,作到同一个链接并发处理多个请求,并且并发请求的数量比 HTTP 1.1大了好几个数量级)。

    举例来讲,在一个 TCP 链接里面,服务器同时收到了 A 请求和 B 请求,因而先回应 A 请求,结果发现处理过程很是耗时,因而就发送 A 请求已经处理好的部分, 接着回应 B 请求,完成后,再发送 A 请求剩下的部分。

  • 头信息压缩

    HTTP 协议不带有状态,每次请求都必须附上全部信息。因此,请求的不少字段都是重复的,好比 CookieUser Agent,如出一辙的内容,每次请求都必须附带,这会浪费不少带宽,也影响速度。

    HTTP 2.0 对这一点作了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用 gzip 或c ompress 压缩后再发送;另外一方面,客户端和服务器同时维护一张头信息表,全部字段都会存入这个表,生成一个索引号,之后就不发送一样字段了,只发送索引号,这样就提升速度了。

  • 服务器推送

    HTTP 2.0 容许服务器未经请求,主动向客户端发送资源,这叫作服务器推送(server push)。意思是说,当咱们对支持 HTTP 2.0 的 web server 请求数据的时候,服务器会顺便把一些客户端须要的资源一块儿推送到客户端,省得客户端再次建立链接发送请求到服务器端获取。这种方式很是合适加载静态资源。 服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就能够了,不用走网络,速度天然是快不少的。

总结

HTTP/0.9:功能捡漏,只支持GET方法,只能发送HTML格式字符串。

HTTP/1.0:支持多种数据格式,增长POST、HEAD等方法,增长头信息,每次只能发送一个请求(无持久链接)

HTTP/1.1:默认持久链接、请求管道化、增长缓存处理、增长Host字段、支持断点传输分块传输等。

HTTP/2.0:二进制分帧、多路复用、头部压缩、服务器推送

~

~本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

你们好,我是〖编程三昧〗的做者 隐逸王,个人公众号是『编程三昧』,欢迎关注,但愿你们多多指教!

你来,怀揣指望,我有墨香相迎! 你归,不管得失,惟以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

相关文章
相关标签/搜索