Websocket概念
Websocket是HTML5出的东西(协议),是一个持久化的协议,是基于HTTP协议的,并借用HTTP协议完成一部分握手。
在HTTP中,一个request对应一个response,且是被动的,不能主动发起。
通过Update:websocket、Connection:Upgrade告诉Apache、Nginx服务器:发起的是Websocket协议,不是HTTP协议。
ajax轮询
原理:让浏览器隔几秒就发送一次请求,询问服务器是否有新信息。
long poll
原理:其实和ajax轮询差不多,都是采用轮询的方式,不过采取的是阻塞模型,也就是说,客户端发起连接后,如果没有消息,就一直不返回response给客户端。直到有消息才返回,返回之后客户端再次建立连接,周而复始。
从上面可以看出,其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的一个特点:被动性。
这两种方式都非常的耗资源,ajax轮询需要服务器有很快的处理速度和资源。(速度)long poll需要有很高的并发,也就是同时接待客户的能力。(场地大小)
HTTP是一个状态协议。通俗的说就是,服务器因为每天要接待太多客户了,是一个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得告诉服务器一遍。
Websocket解决了HTTP的这几道难题,首先,被动性,当服务器完成协议升级后,服务端就可以主动推送消息给客户端。
只需要经过一次HTTP请求,就可以做到源源不断的信息推送了。为什么他会解决服务器上消耗资源的问题呢?
其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。简单地说,我们有一个非常快速的 接线员(Nginx) ,他负责把问题转交给相应的 客服(Handler) 。
本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
这样就可以解决客服处理速度过慢的问题了。
同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输 identity info (鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了