WebSocket :WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。
简单的说,WebSocket协议之前,双工通信是通过多个http链接来实现,这导致了效率低下。
Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。
HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么在HTTP1.0中,这次HTTP请求就结束了。
在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。
但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。
WebSocket 解决了 HTTP 的几个难题:
3.1)难题1(http协议的被动性):采用 WebSocket 协议后,服务器可以主动推送消息给客户端;而不需要客户端以(长/短)轮询的方式发起http请求到server以获取数据更新反馈;这样一来,客户端只需要经过一次HTTP请求,就可以做到源源不断的信息传送了(在程序设计中,这种设计叫做回调,即:server 端有信息了再来通知client 端,而不是 client 端 每次都傻乎乎地跑去轮询server端 是否有消息更新);
3.2)难题2(http协议的无状态性/健忘性):短轮询是每次http请求前都要建立连接,而长轮询是相邻几次请求前都要建立连接;http请求响应完成后,服务器就会断开连接,且把连接的信息全都忘记了;所以每次建立连接都要重新传输连接上下文(下面有补充),将 client 端的连接上下文来告诉server 端;而 WebSockct只需要一次HTTP 握手,整个通讯过程是建立在一次连接(状态)中的,server 端会一直推送消息更新反馈到客户端,直到客户端关闭请求,这样就无需 客户端为发送消息而建立不必要的 tcp 连接 和 为了建立tcp连接而发送不必要的冗余的连接上下文消息;
【补充】http 长连接(tcp 连接可复用)
1)介绍:http协议 目前有两个版本:1.1 和 1.0;区别是 1.1支持 长连接(普遍使用http1.1版本),长连接也叫做持久连接(keep-alive);而1.0不支持长连接,在1.0版本下,每个http请求响应后都会关闭tcp连接,下一次http请求会重新建立http连接;
2)http 长连接:多个http 请求共用同一个 tcp 连接,这样可以减少相邻多次 http请求导致的 tcp连接建立和关闭的资源消耗;http1.1 在请求头和响应头中用 connection 字段标识 该http连接是否是 长连接,即connection: keep-alive 表示长连接;而 connection: closed 表明服务器关闭tcp 连接;
3)keep-alive:与 connection 相对应的是 keep-alive,其属性有 timeout=30 和 max=5 分别是 两次 http 请求 保持的时间,max表示这个tcp 连接最多被几个 http 请求重用;