HTTP长链接和ajax轮询以及websocket原理理解

HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。

在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是每个request只能对应它的response。而且这个response也是被动的(request主动发起),服务器端不能主动发起响应。

1.ajax轮询

ajax轮询的原理是让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息,也就是隔几秒就有一对request和 response

2.http长链接

http长链接原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(电话一直播通,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始,HTTP1.1的keep-alive就是采用的这种方式

3.websocket

WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)

首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。

首先我们来看个典型的 Websocket 握手

GET /chat HTTP/1.1



Host: server.example.com



Upgrade: websocket



Connection: Upgrade



Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==



Sec-WebSocket-Protocol: chat, superchat



Sec-WebSocket-Version: 13



Origin: http://example.com

这段类似HTTP协议的握手请求中,多了几个东西

Upgrade: websocket



Connection: Upgrade

这个就是Websocket的核心了,告诉 ApacheNginx 等服务器:我发起的是Websocket协议,服务器收到后切换至Websocket协议并返回

Upgrade: websocket



Connection: Upgrade

通过ajax轮询和http轮询可以看出,我们可以看出这两种方式都需要很多资源。

一种需要更快的速度,一种需要更多的’电话’。这两种都会导致资源的需求越来越高。另外,HTTP还是一个非状态协议。服务器因为每天要接待太多请求,链接断开,就会链接的信息全忘光,第二次还得重新告诉服务器一遍。

在这种情况下,Websocket出现了。他解决了HTTP的这几个难题。首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端,客户端也可以尽情地发送数据给服务器,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我每次跑来问你 )同时维持这个链接的开销远远小于前两种,并且还解决了服务器上消耗资源的问题。

其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler来处理。简单地说,我们有一个非常快速的 接线员(Nginx) ,他负责把问题转交给相应的 客服(Handler)

本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢,导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。

同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输 identity info (鉴别信息),来告诉服务端你是谁。

虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。

但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。

同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值