HTTP的瓶颈
- 一条连接上只可发送一个请求。(chrome最大并发数为6)
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
- 发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
- 请求/响应首部未经压缩就发送。首部信息越多,延迟越大。
- 主体部分非强制压缩发送。可任意选择数据压缩格式。
为了弥补HTTP功能上的不足,基于HTTP提出了一些新的协议。
Ajax和XMLHttpRequest - 增强协议
是什么
Ajax(Asynchronous JavaScript and XML) 是一种有效利用JavaScript和DOM的操作,以达到局部Web页面替换加载的异步通信手段。
实现方式:Ajax是一种技术方案,但并不是一种新技术。它依赖的是现有的CSS/HTML/Javascript,而其中最核心的依赖是浏览器提供的XMLHttpRequest对象,是这个对象使得浏览器可以发出HTTP请求与接收HTTP响应。
所以我用一句话来总结两者的关系:我们使用XMLHttpRequest对象来发送一个Ajax请求。
你真的会使用XMLHttpRequest吗? https://segmentfault.com/a/1190000004322487
解决问题
只更新局部页面,减少了响应中传输的数据量
存在问题
- 利用Ajax实时地从服务器获取内容,有可能会导致大量请求产生。
- Ajax仍未解决HTTP协议本身存在的问题。
Comet - 增强协议
是什么
一旦服务器端有内容更新了,Comet不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能。
为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。
解决问题
服务端推送功能
存在问题
- 为了保留响应,一次连接的持续边长,为了维持连接需要消耗更多的资源
- 未解决HTTP协议本身存在的问题
SPDY- 改动协议
是什么
陆续出现的Ajax和Comet等提高易用性的技术,一定程度上使HTTP得到了改善,但HTTP协议本身仍存在诸多限制。为了进行根本性的改善,需要有一些协议层面上的改动。
SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。同时考虑到安全性问题,SPDY规定通信中使用SSL。
解决问题
使用SPDY后,HTTP协议额外获得以下功能
- 多路复用流 - 解决问题1
- 一个TCP连接,无限制多个HTTP请求。
- 效率高。
- 赋予请求优先级 - 问题1衍生
- 再发送多个请求时,解决因带宽低而导致响应变慢的问题
- 推送功能 - 解决问题2
- 服务器提示功能 - 问题2衍生
- 主动提示客户端请求所需的资源。
- 压缩HTTP首部 - 解决问题 4
WebSocket - 新协议
是什么
WebSocket,即Web浏览器与Web服务器之间的全双工通信标准。
一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。
由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端。
而一旦确立WebSocket通信连接,无论是服务器还是客户端,都可直接向对方发送报文。
解决问题
特点
- 推送功能
- 支持由服务器向客户端推送数据。
- 减少通信量
- 只要建立起WebSocket连接,就希望一直保持连接状态。
- 和HTTP相比
- 每次连接的总开销减少
- 首部信息小,通信量减少
握手
两次握手:
- 请求:需要用到HTTP的Upgrade首部字段:
Upgrade: websocket - 响应:返回状态码 101 Switching Protocols,
Upgrade: websocket
成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧
使用
const exampleSocket = new WebSocket("wss://www.example.com/socketserver", "protocolOne");exampleSocket.send("Here's some text that the server is urgently awaiting!");
