HTTP/2和WebSocket及HTML5资料整理--HTTP2篇

来源:互联网 发布:流量攻击软件 编辑:程序博客网 时间:2024/05/07 20:39
        发现HTTP/2、WebSocket、HTML5这些东西很多人都听过,但具体到各有哪些特点?有什么区别?

各自要解决什么问题? 其实很多人并不是那么清楚的。所以我之前在公司内部做了个这方面的分享。

当然,我也是现抄现卖,其中大部分内容来自维基百科及网上各大神的分享。

分享其实有时能收获更多,而在分享时确实有些东西又让我对一些东西更了解了。
  首先说下HTTP/2。
          HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个更新,主要基于SPDY协议。
  于2014年12月将HTTP/2标准提议递交至IESG进行讨论,最后在2015年5月以RFC 7540正式发表。
    这里HTTP/2协议翻译: 
    http://yuedu.baidu.com/ebook/478d1a62376baf1ffc4fad99
    https://github.com/fex-team/http2-spec/blob/master/HTTP2%E4%B8%AD%E8%8B%B1%E5%AF%B9%E7%85%A7%E7%89%88(06-29).md

  它常被提起的特性有:
       多路复用
       HEAD 压缩
       服务器推送
      优先级请求
它底层以二进制传输(而不是以前\r\n分隔的明文),HTTP数据帧(Frame)为最小的传递数据单位。帧的报头字段定义着类型及其它属性。
          所谓多路复用,先要讲一下HTTP1的连接方式。在七层协议中,HTTP属于应用层协议,它的数据传输层还是
TCP/IP.在HTTP1时,浏览器展示页面时,是为每一个文件(js,图片...)都单独建立一个Socket短连接来传输数据。
即一个页面可能有多条Socket连接,然后传输完马上断开。这看上去没什么问题,但其实HTTP的性能瓶颈就在这。
至于具体原因,可以看看这篇文章<<HTTP请求的TCP瓶颈分析>>我无法说得比他还好。
        知道了问题所在,在使用HTTP1协义时,人们采取了很多优化的手段. 比如,把多张小图片合在一张大图片上。
前端用CSS来切片,以便减少连接数。在WebApp上,为了解决上述方法造成的流量浪费,采用将小图片用Base64方式。

直接放在页面中,再通过Js方式还原展示.jQuery的移动版和WeUI中都有采用这些方式。比如有时网页文件实在太多,

而连接数其实是有限制的,以致需开多个机器来分散等等。

  以上种种问题,就是HTTP/2的多路复用要解决的。多个HTTP请求可以放在同一个连接中进行。且自有数据流能并行传输。
  至于怎么区分得开,就要归功于帧的设计(有个StreamID)了.所以以后不需要那么折腾了。特别是小图合成大图的方式,
  在HTTP/2下是完全没必要的了. 
  HEAD 压缩
        HTTP1中每次HTTP请求,都是必须要带上HTTP头的.而HTTP/2则在建立连接后,把头字段作为键值对,在两边维护一份
字典,相同的就不用再传了,如有新增或变更,则再在传输时带上。减少HTTP头的传输,交互密集时,其实能省不少流量。
 服务器推送
        就是服务端能主动推东西过去,以前只能是被动的。在我的印象中,很多年前“Comet"这门技术曾经在淘宝大放光彩过。
即当客户端发一个请求过来时,服务端能依据这个请求,推断出你后续还要什么,主动给推过去。大大减少了请求数,加
快了反应时间。嗯,现在HTTP/2已经原生支持了.
 优先级请求
        这个很好理解,你急,你先上啊。关键是这个支持了,有时确实用得上。 

         不过从HTTP/2协议上看,有个问题是它维持的这个TCP连接,虽然效率和玩法多了,但对Web服务端而言,单个连接 内存占用

之类要比以前要多了,要注意资源耗尽问题。不过相对它的好处。这到无所谓了。另外以前就有个Keep-Alive,是HTTP1的持久连接方案,

我没深入研究过。但它要解决的问题感觉HTTP/2已经搞定了.

     HTTP/2兼容HTTP1,它通过HTTP/1.1 Upgrade header字段来询问服务端是否支持HTTP/2,并且通过h2/h2c来标明自己是tls的
HTTP/2还是明文的HTTP/2. 在HTTP/2的协议规范中有一个详细的说明. 

从上面看下来,HTTP/2要解决什么问题?
    它能让网页加载速度更快,流量更小。把单向变成了双向交互.

这里有个网页,可以直观的感受下HTTP1与HTTP/2两者间的速度差别:
 https://http2.akamai.com/demo
Go也有个HTTP/2的实现(明年1.6版就要并入标准库了)。其也提供了一个对比页:
 A grid of 180 tiled images is below. Compare:
 https://http2.golang.org/gophertiles?latency=200

再好的协议也要有人用才有意义,尤其在HTTP1还横行世界的情况下.
让我们看看HTTP/2在Web服务器这块目前支持情况怎么样?
   其实主流基本都支持了。 比如Nginx早就把SPDY协议支持移掉,改为支持HTTP/2了.
   服务器支持列表:
   https://github.com/http2/http2-spec/wiki/Implementations

如果不是做网页,在移动app开发中,怎么用上HTTP/2呢?
        亲,看看gRPC吧,我这Blog中,之前有过一篇相关介绍。
        话说做网页,兼容性负担蛮重的,反而推进不快。其实在WebApi这块可以大胆用起来。
         

        忽然发现已经太长,WebSocket和HTML5还没说,只能分篇了。 

        目前对HTTP/2的了解目前还流于表面。也没精力去看Go HTTP2的源码实现(HTTP2实现比WebSocket的实现复杂多了)。

上面都是收集的资料整理及个人理解。希望没啥错误。


BLOG: http://blog.csdn.net/xcl168


0 0
原创粉丝点击