WebSocket 相关总结
- 
什么是WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的网络层协议。
画外音:
全双工:通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。
半双工:通信一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两辆车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。
单工:通信只允许甲方向乙方传送信息,而乙方不能向甲方传送 。(比喻汽车的单行道。)
 - 
为什么有了Http还需要WebSocket?(Http和WebSocket的区别)
Http单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。
 - 
不使用WebSocket能用别的实现替换吗?
- 短轮询:其实就是普通的轮询。指在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。
 - 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
 - Server-sent Events:是WebSocket 的一种轻量代替方案,使用 HTTP 协议。SSE 是单向通道,只能服务器向客户端发送消息,如果客户端需要向服务器发送消息,则需要一个新的 HTTP 请求。 这对比 WebSocket 的双工通道来说,会有更大的开销。这么一来的话就会存在一个「什么时候才需要关心这个差异?」的问题,如果平均每秒会向服务器发送一次消息的话,那应该选择 WebSocket。如果一分钟仅 5 - 6 次的话,其实这个差异并不大。
 
 - 
WebSocket的结构

主要关注:
Opcode: 4 bit , 操作码,如果收到一个未知的操作码,接收终端必须断开WebSocket连接。
0 表示一个持续帧
1 表示一个文本帧
2 表示一个二进制帧
3-7 预留给以后的非控制帧
8 表示一个连接关闭包
9 表示一个ping包
A 表示一个pong包
B-F 预留给以后的控制帧
 - 
WebSocket通信的三个过程
- 
握手阶段
WebSocket利用了Http进行握手,相比于Http有如下的区别:
WebSocket 的请求和响应格式:
客户端握手请求:
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13服务端握手响应:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat- Upgrade:
表示HTTP协议升级为webSocket - connection:Upgrade 请求升级。
 - Sec-WebSocket-Key:
用于服务端进行标识认证,生成全局唯一id,GUID。WebSocket 中 Sec-WebSocket-Key 的生成算法是拼接服务端和客户端生成的字符串,进行SHA1哈希算法,再用base64编码 - Sec-WebSocket-Version:WebSocket协议版本
 - Sec-WebSocket-Protocol: 请求服务端使用指定的子协议。
如果指定了这个字段,服务器需要包含相同的字段,并且从子协议的之中选择一个值作为建立连接的响应。 - Sec-WebSocket-Extensions: WebSocket的扩展。
 - Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 生成的全局唯一id,GUID。
 
 - Upgrade:
 - 
数据交换阶段
 - 
关闭阶段
 
 - 
 - 
WebSocket的心跳机制
为什么需要心跳机制呢?如果没有心跳机制维护WebSocket连接,服务端到时候就会维护着一堆烂连接,占用资源,所以这里如果是面向外部开放的必须要维护。
websocket协议本身有没有心跳机制,需要自己去定时检测。
 
                    
                
                
            
        
浙公网安备 33010602011771号