WebSocket学习

102 阅读2分钟

WebSocket:是HTML5出的新协议,为了兼容现有浏览器的握手规范,是HTTP协议上的一种补充;

优点:相对于HTTP这种非持久的协议,其为一个持久化协议;

HTTP链接的特点:

1.一个Request对应一个Response,此时一个http1.0生命周期结束;
http1.1使用keep-alive进行改进,一个http连接可发多个Request,接收多个Response;
但HTTP中永远是这样,一个request只能有一个responseresponse是被动的,不能主动发起。
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每次需要重新签别信息;