前言

针对以上您提起的WebSocket的相关话题,给您做一下系统的梳理,WebSocket是和http类似的可以实现全双工可持久连接通信的应用层协议,以下深入剖析一下WebSocket的原理。

什么是WebSocket

首先,我们需要弄明白,WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。

我们知道http协议本身是无状态协议,每一个新的http请求,只能通过客户端主动发起,通过 建立连接-->传输数据-->断开连接 的方式来传输数据,传送完连接就断开了,也就是这次http请求已经完全结束了(虽然http1.1增加了keep-alive请求头可以通过一条通道请求多次,但本质上还是一样的)。

并且服务器是不能主动给客户端发送数据的(因为之前的请求得到响应后连接就断开了,之后服务器根本不知道谁请求过),客户端也不会知道之前请求的任何信息。

深入剖析WebSocket的原理_.net深入剖析WebSocket的原理_.net_02

所以说,http协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,所以WebSocket协议由此而生,于2011年被IETF定为标准RFC6455,并被RFC7936所补充规范。

并且在HTML5标准中增加了有关WebSocket协议的相关api,所以只要实现了HTML5标准的客户端,就可以与支持WebSocket协议的服务器进行全双工的持久通信了。

WebSocket协议的原理

与http协议一样,WebSocket协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。

深入剖析WebSocket的原理_.net_03

下面是WebSocket协议请求头:

深入剖析WebSocket的原理_.net_04

其中请求头中重要的字段:

Connection:Upgrade

Upgrade:websocket

Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits

Sec-WebSocket-Key:mg8LvEqrB2vLpyCNnCJV3Q==

Sec-WebSocket-Version:13

1. Connection和Upgrade字段告诉服务器,客户端发起的是WebSocket协议请求

2. Sec-WebSocket-Extensions表示客户端想要表达的协议级的扩展

3. Sec-WebSocket-Key是一个Base64编码值,由浏览器随机生成

4. Sec-WebSocket-Version表明客户端所使用的协议版本

而得到的响应头中重要的字段:

Connection:Upgrade

Upgrade:websocket

Sec-WebSocket-Accept:AYtwtwampsFjE0lu3kFQrmOCzLQ=

1. Connection和Upgrade字段与请求头中的作用相同

2. Sec-WebSocket-Accept表明服务器接受了客户端的请求

Status Code:101 Switching Protocols

并且http请求完成后响应的状态码为101,表示切换了协议,说明WebSocket协议通过http协议来建立运输层的TCP连接,之后便与http协议无关了。

WebSocket协议的优缺点

优点:

· WebSocket协议一旦建议后,互相沟通所消耗的请求头是很小的

· 服务器可以向客户端推送消息了

缺点:

· 少部分浏览器不支持,浏览器支持的程度与方式有区别

WebSocket协议的应用场景

· 即时聊天通信

· 多玩家游戏

· 在线协同编辑/编辑

· 实时数据流的拉取与推送

· 体育/游戏实况

· 实时地图位置

WebSocket浏览器支持情况

深入剖析WebSocket的原理_.net_05