HTTP知识笔记

HTTP知识笔记

HTTP版本版本变迁:

  • HTTP/0.91991年,只能使用GET,请求不涉及数据包传输, 没有作为正式的标准;
  • HTTP/1.01996年,传输内容格式不限制,增加PUTPATCHHEADOPTIONSDELETE命令,正式作为标准;
  • HTTP/1.1 1997年,持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码,2015年前使用最广泛;
  • HTTP/22015年,多路复用、服务器推送、头信息压缩、二进制协议等,逐渐覆盖市场。

HTTP位于计算机网络模型的应用层,是基于TCP的一个应用层协议。

虽然TCP是面向连接的,但是HTTP却是无连接的。

Akamai公司的演示页面上可以看到HTTP1.1HTTP2的图片加载速度区别。

HTTP/2 is the future of the Web, and it is here!

HTTP/1.0

  • 使用If-Modified-SinceExpires头部来控制缓存;
  • 不支持部分传输,某些时候我们只需传输文件整个的一段而已,传整个过来浪费了带宽,也容易造成长时间的占用一个连接;
  • 每次传输数据都需要简历新的一个连接,当数据传输完成,连接就会关闭,无法复用已经传输完成的连接;
  • 一个服务器绑定唯一一个IP地址;
  • 队头阻塞,即下一个请求必须在上一个请求完成才能进行传输,否则处于挂起状态。

HTTP/1.1

  • 使用更多的头部来增强缓存控制策略,Entity tagIf-Unmodified-Since, If-Match, If-None-Match
  • 支持部分返回,新增206Partial Content)返回码来表示这是一个部分请求,通过Range头部来指定文件的范围;
  • 由于虚拟主机的发展,现在一台服务器可以存在多个虚拟主机,它们共享一个IP地址,所以请求和响应头域必须附带Host头域(指定主机名),不然直接返回400错误;
  • 支持长连接,现在可以复用同一条TCP连接,无需重新建立TCP连接来进行HTTP请求,在头部增加Connection: keep-alive默认开启该特性;
  • 支持请求流水线,由于支持长连接,现在可以复用同一条TCP连接,流水线,通俗点讲,就是可以在等待上一个资源还未返回结果的时候,进行新的资源请求,不过,资源的接收必须按照发送的顺利;
  • 细化错误的响应码,如409Conflict)表示请求的资源与资源的当前状态发生冲突;410Gone)表示服务器上的某个资源被永久性的删除。

HTTP/2

相关RFCRFC7540

Hypertext Transfer Protocol Version 2 (HTTP/2)

  • 二进制分帧,HTTP/2通过在应用层和传输层之间增加一个二进制分帧层,使用二进制而非HTTP/1.1的文本格式来传输数据,将请求报文或者响应报文分割成帧来传送;
  • 流标识,存在于连接中的一个虚拟通道,流可以承载双向消息,每个流都有一个唯一的整数ID,这样可以和其他流区分开;
  • 多路复用,HTTP/1.1虽然可以复用TCP连接,但是必须顺序的响应请求结果,如果想要并发多个请求,则必须使用多个TCP连接,浏览器对一个域名的TCP连接数有限制,一般为6 - 8个,超出限制的连接就会被挂起等待,等待前面的连接完成后才能进行发送,HTTP/2由于使用了二进制分帧和流标识,使得全部的数据都可以在一条TCP连接上完成,减少了创建多条TCP连接带来的延时以及减少内存消耗;
  • 服务器推送,在发送HTML页面时,服务器可以主动的HTML附带的CSSJS一并推送给用户,减少请求次数;
  • 头部压缩,随着网络的发展,HTTP的请求大小越来越大,每次需要发送的冗余请求头非常多,HTTP/2通过在客服端和服务端各自维护一个“首部表”(类似一个Map)来减少重复数据的传送,具体算法为HPACK,具体可以查看相关的RFC文档:HPACK: Header Compression for HTTP/2,这里涉及到哈夫曼编码,通过编码来减少请求头部过大带来的网络消耗。

很多大型应用已经开始转到HTTP/2了,比如:

  • 百度首页
  • 淘宝首页