基于HTTP的协议:
在建立 HTTP 标准规范时,制订者主要想把 HTTP 当作传输 HTML 文档的协议。随着时代的发展,Web 的用途更具多样性,比如演化成在线购物网站、SNS(Social Networking Service,社交网络服务)、企业或组织内部的各种管理工具。
而这些网站所追求的功能可通过 Web 应用和脚本程序实现。即使这些功能已经满足需求,在性能上却未必最优,这是因为 HTTP 协议上的限制以及自身性能有限。
消除 HTTP 瓶颈的 SPDY:
Google 在 2010 年发布了 SPDY(取自 SPeeDY,发音同 speedy),其开发目标旨在解决 HTTP 的性能瓶颈,缩短 Web 页面的加载时间50%)。
SPDY - The Chromium Projects http://www.chromium.org/spdy/
HTTP的瓶颈
一条连接上只可发送一个请求。
请求只能从客户端开始。客户端不可以接收除响应以外的指令。
请求 / 响应首部未经压缩就发送。首部信息越多延迟越大。
发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
可任意选择数据压缩格式。非强制压缩发送。
Ajax(Asynchronous JavaScript and XML, 异 步 JavaScript 与 XML 技术)解决方法:
一种有效利用 JavaScript 和 DOM(Document Object Model,文档对象模型)的操作,以达到局部 Web 页面替换加载的异步通信手段。和以前的同步通信相比,由于它只更新一部分页面,响应中传输的数据量会因此而减少,这一优点显而易见。
Comet(彗星)的解决方法:
一旦服务器端有内容更新了,Comet 不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能。
陆续出现的 Ajax 和 Comet 等提高易用性的技术,一定程度上使 HTTP得到了改善,但 HTTP 协议本身的限制也令人有些束手无策。为了进行根本性的改善,需要有一些协议层面上的改动。
SPDY 的设计与功能:
SPDY 没有完全改写 HTTP 协议,而是在 TCP/IP 的应用层与运输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY 规定通信中使用 SSL。
SPDY 以会话层的形式加入,控制对数据的流动,但还是采用 HTTP建立通信连接。因此,可照常使用 HTTP 的 GET 和 POST 等方 法、Cookie 以及 HTTP 报文等。
使用 SPDY 后,HTTP 协议额外获得以下功能。
多路复用流
通过单一的 TCP 连接,可以无限制处理多个 HTTP 请求。所有请求的处理都在一条 TCP 连接上完成,因此 TCP 的处理效率得到提高。
备注:这个特性没啥稀奇的,http 1.1已经有相关支持。忘了的同学翻我之前的第一节课视频~
赋予请求优先级
SPDY 不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。
压缩 HTTP 首部
压缩 HTTP 请求和响应的首部。这样一来,通信产生的数据包数量和发送的字节数就更少了。
注:HTTP本身也有压缩功能,只不过压缩的是body,不是首部。忘了的翻我的第一节课~
更详细的解释:https://www.cnblogs.com/zhaow/p/9754161.html
推送功能
支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
注:这个功能HTTP 1.1木有,直到HTTP2,原生HTTP才提供这个功能。
如果用过C#,用过ASP.NET MVC的同学还会指导,做这个事儿,还有个---SignalR。首选web socket通讯方式,如果不支持,那就蜕化为长轮询。
SignalR参考资料:
https://www.cnblogs.com/wintersun/p/4148223.html
https://www.cnblogs.com/Wddpct/p/5650015.html
SPDY并没有被广泛的使用起来~
使用浏览器进行全双工通信的WebSocket:
WebSocket 通信协议在 2011 年 12 月 11 日,被 RFC 6455 - The WebSocket Protocol 定为标准。
WebSocket 的设计与功能
WebSocket,即 Web 浏览器与 Web 服务器之间全双工通信标准。其中,WebSocket 协议由 IETF 定为标准,WebSocket API 由 W3C 定为标准。仍在开发中的 WebSocket 技术主要是为了解决 Ajax 和 Comet
里 XMLHttpRequest 附带的缺陷所引起的问题。
WebSocket 协议:
一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML 或图片等任意格式的数据。
一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML 或图片等任意格式的数据。
HTTP轮询与WebSocket通讯之间的对比:
WebSocket协议的主要特点
推送功能
支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
减少通信量
只要建立起 WebSocket 连接,就希望一直保持连接状态。和 HTTP 相比,不但每次连接时的总开销减少,而且由于 WebSocket 的首部信息很小,通信量也相应减少了。
为了实现 WebSocket 通信,在 HTTP 连接建立之后,需要完成一次“握手”(Handshaking)的步骤。
握手·请求
为了实现 WebSocket 通信,需要用到 HTTP 的 Upgrade 首部字段,告知服务器通信协议发生改变,以达到握手的目的
Sec-WebSocket-Key 字段内记录着握手过程中必不可少的键值。
Sec-WebSocket-Protocol 字段内记录使用的子协议。
忘了这个首部关键字的同学,还回去翻我的第一节课~
WebSocket API
JavaScript 可调用“The WebSocket API”(http://www.w3.org/TR/websockets/,由 W3C 标准制定)内提供的 WebSocket 程序接口,以实现 WebSocket 协议下全双工通信。
以下为调用 WebSocket API,每 50ms 发送一次数据的实例。
参考资料:
阮一峰关于WebSocket的帖子:http://www.ruanyifeng.com/blog/2017/05/websocket.html
使用js检测浏览器是否支持WebSocket:https://blog.csdn.net/jsyxiaoba/article/details/84025295
期盼已久的 HTTP/2.0:
...
参考资料:
《一文读懂HTTP/2 及 HTTP/3特性》