websocket是什么?
答: 它是一种网络通信协议,是 HTML5
开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
为什么需要websocket? 疑问? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答:是因为 HTTP 协议有一个缺陷,通信只能由客户端发起,然后服务器再做出响应,服务器不能主动向客户端推送消息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。WebSocket协议的最大特点是服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送消息,是真正的双向平等对话,属于服务器推送技术的一种。
其他特点包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws
(如果加密,则为wss
),服务器网址就是 URL。 ws://example.com:80/some/path
WebSocket目前支持两种统一资源标志符ws
和wss
,类似于HTTP和HTTPS。
实现原理
浏览器发出webSocket的连线请求,服务器发出响应,这个过程称为握手
,握手的过程只需要一次,就可以实现持久连接。
握手与连接
浏览器发出连线请求,此时的request如下:
通过get
可以表明此次连接的建立是以HTTP协议为基础的,返回101状态码。
如果不是101状态码,表示握手升级的过程失败了
101是Switching Protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送这个响应后的空档,将http升级到webSocket。
WebSocket 的握手是一个标准的 HTTP GET 请求,但要带上两个协议升级的专用头字段:
“Connection: Upgrade”,表示要求协议“升级”;
“Upgrade: websocket”,表示要“升级”成 WebSocket 协议。
另外,为了防止普通的 HTTP 消息被“意外”识别成 WebSocket,握手消息还增加了两个额外的认证用头字段(所谓的“挑战”,Challenge):
Sec-WebSocket-Key:一个 Base64 编码的 16 字节随机数,作为简单的认证密钥;
Sec-WebSocket-Version:协议的版本号,当前必须是 13。
服务器接到浏览器的连线请求返回结果如下:
Upgrade和Connection来告诉浏览器,服务已经是基于webSocket协议的了,让浏览器也遵循这个协议
Sec-WebSocket-Accept是服务端确认后并加密后的Sec-WebSocket-Accept
至此,webSocket连接成功,接下来就是webSocket的协议了。