Websocket是Html5出来的一个新协议,但它还是依附于Http协议。在传统的Http协议中,请求都是由客户端发起的,而且一个请求对应一个服务器的回应,对于客户端来说发出的请求=收到的回应
。Websocket允许服务器主动向客户端推送消息。
Websocket的握手
在客户端发出的Websocket请求中,有一些字段是不同于传统的Http协议字段的,这些字段就告诉服务器,我要发起Websocket连接了。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket (Websocket)
Connection: Upgrade (Websocket)
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== (Websocket)
Sec-WebSocket-Protocol: chat, superchat (Websocket)
Sec-WebSocket-Version: 13 (Websocket)
Origin: http://example.com
然后服务器会发送回应,状态码变成101,表示协议从Http切换到Websocket。
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Websocket解决了之前的哪些问题
在Websocket出现之前,客户端要保持与服务器的消息同步有两种方式:轮询和长轮询。
在轮询方式中,客户端发起ajax请求,服务器接收到请求,立马开始回应,不管有没有产生客户端想要的数据。这种方式比较浪费宽带、服务器资源。
在长轮询方式中,客户端发起ajax请求,服务器接收到请求,不急着回应,而是看看有没有客户端想要的数据,若有,就回应;若没有,连接就保持着直到有数据。这种方式需要服务器有一定的并发能力。
(从形状上看,轮询倒一下就很像长轮询)
【Reference】