一、什么是WebSocket
WebSocket是和HTTP类似的可以实现全双工可持久连接通信的应用层协议。WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。
持久连接通信:这里的持久通信能力指的是协议本身的能力,我们当然可以通过编程的方式实现这种功能,比如轮询的方式,但这种方式又麻烦又浪费性能。
二、为什么需要WebSocket
WebSocket主要是用来弥补HTTP协议在持久通信能力上的不足。
HTTP协议本身是无状态协议,每一个新的HTTP请求,只能通过客户端主动发起,通过 建立连接-->传输数据-->断开连接 的方式来传输数据,就是我们平时经常用到的Request和Response,传送完连接就断开了,也就是这次HTTP请求已经完全结束了,从下面的图中可以很直观的看出区别(虽然http1.1增加了keep-alive请求头可以通过一条通道请求多次,但本质上还是一样的)。并且服务器是不能主动给客户端发送数据的(因为之前的请求得到响应后连接就断开了,之后服务器根本不知道谁请求过),客户端也不会知道之前请求的任何信息。所以说,http协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,例如:即时聊天通信、多玩家游戏、在线协同编辑/编辑等等。
三、WebSocket的特点
- 建立在 TCP 协议之上,服务器端的实现比较容易。
- 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
- 数据格式比较轻量,性能开销小,通信高效。
- 可以发送文本,也可以发送二进制数据。
- 没有同源限制,客户端可以与任意服务器通信。
- 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
四、WebSocket的原理
与HTTP协议一样,WebSocket协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过HTTP协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。
接下来我们看一下WebSocket具体的请求内容:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
其中请求头中重要的字段:
1. Connection和Upgrade:告诉服务器,客户端发起的是WebSocket协议请求
2. Sec_WebSocket-Protocol:是一个用户定义的字符串,用来区分同 URL 下,不同的服务所需要的协议
3. Sec-WebSocket-Key:是一个Base64编码值,由浏览器随机生成
4. Sec-WebSocket-Version:表明客户端所使用的协议版本
而得到的响应内容中重要的字段:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
1. Connection和Upgrade字段:与请求头中的作用相同
2. Sec-WebSocket-Accept:表明服务器接受了客户端的请求
五、关于WebSocket的兼容情况
WebSocket要求IIS的版本至少是8.0及以上,所以要求操作系统必须是Windows 2012 或 Windows 8及以上,并且需要在添加IIS角色时要勾选上安装WebSocket,如下图(以下截图来自Win10操作系统):
六、实战(基于.net core)
简单的服务器应答:WebSocketDemo