WebSocket:是HTML5出的新协议,为了兼容现有浏览器的握手规范,是HTTP协议上的一种补充;
优点:相对于HTTP这种非持久的协议,其为一个持久化协议;
HTTP链接的特点:
1.一个Request对应一个Response,此时一个http1.0生命周期结束;
http1.1使用keep-alive进行改进,一个http连接可发多个Request,接收多个Response;
但HTTP中永远是这样,一个request只能有一个response,response是被动的,不能主动发起。
2.HTTP是个无状态协议:每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁;
3.以TCP连接来传输数据;
WebSocket作用:持续请求获取服务端信息:
long poll:
原理跟ajax轮询差不多,都是采用轮询的方式,不过采取的是阻塞模型;
直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
ajax轮询:
浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
以上两种缺陷:
1.非常消耗资源;
2.ajax轮询 需要服务器有很快的处理速度和资源。(速度);
3.需要有很高的并发,也就是说同时接待客户的能力。(场地大小);
4.服务器只能被动返回消息;
5.信息延迟;
原因:HTTP的无状态协议特性;
WebSocket原理及特性:
1.一次HTTP握手,持续保持连接,避免HTTP无状态性,服务端一直知道你的信息,直到关闭请求,解决了接线员要反复解析HTTP协议,及查看identity info的信息;
2.由客户主动询问,转换为服务器(推送)有信息的时候就发送;
3.是一种双向通信协议:服务器端和客户端都能主动向对方发送或接收数据;
4.需要像TCP一样,先建立连接,连接成功后才能相互通信。
客户端和服务端交互的报文对比:
客户端请求报文:
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket // 表明这是WebSocket类型请求
Connection: Upgrade
// 客户端发送base64编码密文,服务端须返回对应加密的Sec-WebSocket-Accept应答,否则客户端抛错,关闭连接。
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13
服务端响应报文:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
// 服务端采用与客户端一致的密钥计算出来后返回客户端的
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
总结:
场景:WebSocket一般用于需要获取实时数据的场景,比如聊天/股票/直播等;
核心:基于http上建立一次连接之后,与服务端通过Sec-WebSocket-Key/Sec-WebSocket-Accept密钥进行双向通信协议,避免http每次需要重新签别信息;