这段时间在工作当中首次涉及到了websocket协议,颇为感兴趣,因此希望给大家分享一下,其与原始的http协议的区别以及websocket的优点。
首先HTMl5指的是一系列新的API,或者说新规范,新技术。WebSocket是HTML5中新协议、新API。Http协议本身只有1.0和1.1,也就是所谓的Keep-alive,把多个Http请求合并为一个。
那么为什么说http协议并不是一个持久连接的协议呢?
(1)Http的生命周期通过Request来界定,也就是Request一个Response,那么在Http1.0协议中,这次Http请求就结束了。在Http1.1中进行了改进,是的有一个Keep-alive,也就是说,在一个Http连接中,可以发送多个Request,接收多个Response。但是必须记住,在Http中一个Request只能对应有一个Response,而且这个Response是被动的,不能主动发起。
(2)WebSocket是基于Http协议的,或者说借用了Http协议来完成一部分握手,在握手阶段与Http是相同的。
客户端:
GET http://121.40.165.18:8088/ HTTP/1.1
Host:121.40.165.18:8088
Connection: Upgrade
Upgrade: websocket
Origin: http://www.blue-zero.com
Sec-WebSocket-Version:13
Sec-WebSocket-Key:4IDp1OUMMlQXNFifKUjovA==
服务端:
HTTP/1.1 101 SwitchingProtocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:bRpTHaDDnJNwuZUNb0ZAcBYRU9A=
这样,我们就可以直接使用websocket协议与服务器进行消息传输了。熟悉http协议的同学会发现它与传统的http请求不太一样,head中多了几个字段:
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Version:13
Sec-WebSocket-Key:4IDp1OUMMlQXNFifKUjovA==
前三条均是告诉服务器,我这里需要使用的websocket协议,希望将协议变化。而Sec-WebSocket-Key表示的是一个验证码,用来确定服务器提供的是websocket协议。
服务器收到request后返回的response中也包含了几条特有字段:
HTTP/1.1101 Switching Protocols
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Accept:bRpTHaDDnJNwuZUNb0ZAcBYRU9A=
返回101证明协议已经改变,变为了websocket,最后附加的Sec-WebSocket-Accept是服务器经过确认并且加密过后的Sec-WebSocket-Key,用来表示自己的真实性。
HTTP通信:
Websocket通信:
由上图可知,websocket只要建立连接,之后客户端与服务器的通讯完全是自由的,客户端可以主动发送消息,同理服务端也可以主动进行消息推送。而http请求只能一个request对应一个response,所以服务端不能做到真正意义上的主动发送消息。而且连接建立起后只需要通过数据帧来进行传输,帧的头部信息远比http当中的head小多了,会节省大量的带宽。更适合做长时间的数据传输。但其缺点就是需要一直维持连接,因此对于服务器的端口资源消耗较大。
小编在此先简单介绍一下HTTP与WebSocket协议的区别,WebSocket的数据帧介绍以及服务器的搭建方法会在接下来的文章中进行分享。