HTTP的升级以及改进

856 阅读5分钟

HTTP1.1的不足

  • 同一时间只能发起一次请求,需要等到服务器响应之后才能发送下一次请求,而浏览器对同一个域名请求的并发数是6次,所以如果按照HTTP1.1协议去请求网页应该会很慢,很多开发公司在2.0还没有出来之前也想了很多方法做改进比如域名分片(就是同一个网址里面使用到的资源请求使用不同的域名,这样浏览器的并发数就能增加)等。
  • 在文章 网络协议-应用层(HTTP/HTTPS)中我们知道,每次发送请求都需要在头信息中放入很多信息,但是其实同一个域名下通常我们要携带的头信息都是一样的,但是应为HTTP1.1特性导致每次发送请求都需要将相同的信息传输给服务器,这是一个浪费资源的过程,如果还携带cookies的情况下每次发送请求浪费的资源就更多

SPDY

针对于HTTP1.1的不足,Google处于想提高网速的目的下研发出了SPDY,SPDY应用层一样是基于TCP协议的,但是不同于HTTP1.1的是SPDY必须使用SSL/TLS,他在SSL/TLS层上面又加了一个SPDY层如下图: Image From 12_HTTP的升级改进(1).png SPDY其实就是HTTP2.0的前身

HTTP2.0

HTTP2.0特性

  • 将原来的文本传输转换成了二进制传输如下图所示: Image From 12_HTTP的升级改进(1).png 原因是:二进制格式在协议的解析和优化扩展上带来更多的优势和可能
  • 将数据分成了多个帧,每个帧都会有个帧头(会标识出当前帧所属的数据流),来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装,常见的帧类型有两种,Header帧用于传输Header内容的,Data帧用于传输正文实体,多个Data帧属于同一个数据流,如下图所示: Image From 12_HTTP的升级改进(1).png Image From 12_HTTP的升级改进(1).png 注:数据流是指已建立的连接内的双向字节流,可以承载一条或多条消息所有通信都在一个TCP连接上完成,此连接可以承载任意数量的双向数据流
  • 多路复用:客户端和服务器可以将 HTTP消息分解为互不依赖的帧,然后交错发送,最后再在另一端把它们重新组装起来(根据帧头),并行交错地发送多个请求,请求之间互不影响,他们共用这一个TCP链接如下图所示: Image From 12_HTTP的升级改进(1).png
  • 优先级:HTTP/2 标准允许每个数据流都有一个关联的权重和依赖关系,服务器可以使用此信息通过控制CPU、内存和其他资源的分配设定数据流处理的优先级,在资源数据可用之后,确保将高优先级响应以最优方式传输至客户端
  • 头部压缩:HTTP/2使用HPACK压缩请求头和响应头可以极大减少头部开销,进而提高性能
    原理: 两段维护一个索引表,每个键值对都对应着一个索引例如::method: GET就对着的索引2,所以发送消息的时候就可以直接发送2这个索引值,索引表如下:(完整的索引表大家可以自行查看 索引表image.png 索引表又分为静态索引表和动态索引表,静态索引表就维护这一些比较常用的不会变动的key-value如上图所示,动态索引表就是维护这一些客户端和服务器交互的一些特有的字段或者是cookies(value 肯定是不能固定的)需要注意的是,动态字典上下文有关,需要为每个 HTTP/2 连接维护不同的字典,每次发送一个新的动态头信息的时候一方就会告诉另一方添加一条动态索引,下一次发送消息的时候就可以使用这个动态索引值: Image From 12_HTTP的升级改进(1).png
    • 服务器推送:服务器可以对一个客户端请求发送多个响应,除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端额外明确地请求

HTTP3.0

上文说到的HTTP2.0已经在HTTP1.0的基础上升级了很多但是还是会有一些问题例如

  • 请求之前还是要先建立连接

    应为HTTP2.0传输层使用的还是TCP协议,所以没办法还是逃不过需要建立连接,随意有的一些做的不好App你会发现当你切换网络的时候会出现网络异常等一系列的问题,原因就是一旦你切换了网络TCP链接就断开了,需要重连TCP链接
  • 对头堵塞问题没办法解决

    应为TCP是顺序传输,所以一旦对头传输出现了问题后续的数据包就到等到对头重传成功之后才能继续传输

QUIC

基于上述的两个问题Google有退出了QUIC。上述问题造成的原因归根究底也很清楚就是使用了TCP协议,但是如果想要优化TCP协议那还是不太现实,TCP使用实在系统内核的层面上了如果需要升级相应的就需要升级操作系统,这很不现实,所以Google干脆不用TCP,而是使用了UDP,我们知道UDP是无连接的,他不回保证安全传输,只要给他消息他传输他就直接传输出去不管这个包能不能安全到达,那么此时问题就来了怎么保证安全传输呢,QUIC去实现具体实现访问这里就不深究了应为至今为止HTTP3.0还没开始使用。有兴趣的同学可以自己深入研究一下。这样也就解决了上述TCP带来的两个问题。

HTTP1.0 ~ HTTP3.0分层

Image From 12_HTTP的升级改进(1).png 可以发现该的基本上都是应用层,至于原因也很简单,更改应用层能更好的普及,应为基本上只需要升级一下浏览器或者配置一下服务器就能实现的不像TCP升级一样需要升级内核