HTTP与WebSocket⽐较
HTTP:
1,⽆状态协议。
2,短连接。(Ajax轮询⽅式或Long poll⽅式实现“持久连接”状态)
2,被动型。 客户端请求->服务器端响应。服务端不能主动联系客户端,只能有客户端发起。
WebSocket:
它解决了HTTP的这⼏个难题。
如被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。
就变成了这样,只需要经过⼀次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,⽽不是我傻乎乎的每次跑来问你)
这样的协议解决了同步有延迟,⽽且还⾮常消耗资源的这种情况。
那么为什么他会解决服务器上消耗资源的问题呢?
其实我们所⽤的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
简单地说,我们有⼀个⾮常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。
本⾝接线员基本上速度是⾜够的,但是每次都卡在客服(Handler)了,⽼有客服处理速度太慢。,导致客服不够。
Websocket就解决了这样⼀个难题,建⽴后,可以直接跟接线员建⽴持久连接,有信息的时候客服想办法通知接线员,然后接线员在统⼀转交给客户。
这样就可以解决客服处理速度过慢的问题了。
同时,在传统的⽅式上,要不断的建⽴,关闭HTTP协议,由于HTTP是⾮状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,但是每次都要听这么⼀堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,⽽且还会在⽹路传输中消耗过多的流量/时间。
但是Websocket只需要⼀次HTTP握⼿,所以说整个通讯过程是建⽴在⼀次连接/状态中,也就避免了HT
TP的⾮状态性,服务端会⼀直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占⽤本⾝速度就慢的客服(Handler)了。
⾄于怎么在不⽀持Websocket的客户端上使⽤Websocket。。答案是:不能
但是可以通过上⾯说的 long poll 和 ajax 轮询来 模拟出类似的效果
WebSocket 机制
以下简要介绍⼀下WebSocket的原理及运⾏机制。
WebSocket是HTML5下⼀种新的协议。它实现了浏览器与服务器全双⼯通信,能更好的节省服务器资源和带宽并达到实时通讯的⽬的。它与HTTP⼀样通过已建⽴的TCP连接来传输数据,但是它和HTTP最⼤不同是:
WebSocket是⼀种双向通信协议。在建⽴连接后,WebSocket服务器端和客户端都能主动向对⽅发送或接收数据,就像Socket⼀样;
WebSocket需要像TCP⼀样,先建⽴连接,连接成功后才能相互通信。
传统HTTP客户端与服务器请求响应模式如下图所⽰:
WebSocket模式客户端与服务器请求响应模式如下图:
上图对⽐可以看出,相对于传统HTTP每次请求-应答都需要客户端与服务端建⽴连接的模式,WebSocket是类似Socket的TCP长连接通讯模式。⼀旦WebSocket连接建⽴后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量⼤的情况下,极⼤的节省了⽹络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同⼀个持久连接上发起,实时性优势明显。
相⽐HTTP长连接,WebSocket有以下特点:
是真正的全双⼯⽅式,建⽴连接后客户端与服务器端是完全平等的,可以互相主动请求。⽽HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要⼤量交换HTTP header,信息交换效率很低。
Websocket协议通过第⼀个request建⽴了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进⾏升级才能实现(主流浏览器都已⽀持HTML5)。此外还有 multiplexing、不同的URL可以复⽤同⼀个WebSocket连接等功能。这些都是HTTP长连接不能做到的。
下⾯再通过客户端和服务端交互的报⽂对⽐WebSocket通讯与传统HTTP的不同点:
在客户端,new WebSocket实例化⼀个新的WebSocket客户端对象,请求类似 ws://yourdomain:port/path 的服务端WebSocket URL,客户端WebSocket对象会⾃动解析并识别为WebSocket请求,并连接服务端端⼝,执⾏双⽅握⼿过程,客户端发送数据格式类似:
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: localhost:8080
Sec-WebSocket-Version: 13
可以看到,客户端发起的WebSocket连接报⽂类似传统HTTP报⽂,Upgrade:websocket参数值表明这是WebSocket类型请求,Sec-WebSocket-Key是WebSocket客户端发送的⼀个 base64编码的密⽂,要
求服务端必须返回⼀个对应加密的Sec-WebSocket-Accept应答,否则客户端会抛出Error during WebSocket handshake错误,并关闭连接。
服务端收到报⽂后返回的数据格式类似:
HTTP/1.1 101 Switching Protocols
websocket和socketUpgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
Sec-WebSocket-Accept的值是服务端采⽤与客户端⼀致的密钥计算出来后返回客户端的,HTTP/1.1 101 Switching Protocols表⽰服务端接受WebSocket协议的客户端连接,经过这样的请求-响应处理后,两端的WebSocket连接握⼿成功, 后续就可以进⾏TCP通讯了。⽤户可以查阅了解WebSocket客户端和服务端更详细的交互数据格式。
在开发⽅⾯,WebSocket API 也⼗分简单:只需要实例化 WebSocket,创建连接,然后服务端和客户端就可以相互发送和响应消息。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论