代码改变世界

websocket 协议简述

2019-12-04 02:38  陈心朔  阅读(574)  评论(0编辑  收藏  举报

WebSocket 是一种网络通信协议,RFC 6455 定义了它的通信标准,属于服务器推送技术的一种

由于 HTTP 无状态、无连接、单向通信的特性,导致 HTTP 协议无法实现服务器主动向客户端发起消息,服务端的状态变化无法即时通知到客户端

WebSocket 连接允许客户端与服务端之间进行全双工通信,只需要一次建立连接就可以一直保持状态,避免了多次 HTTP 连接造成的浪费

基于多线程或多进程的服务器无法适用于 WebSocket ,因为它旨在打开连接,尽可能快的处理请求,然后关闭连接。任何实际的 WebSockets 服务端都需要实现一个异步服务器


简述

  • WebSocket 兼容 HTTP ,默认端口也是 80 和 443,握手阶段采用 HTTP 协议

  • 协议标识符是 ws (如果加密则为 wss),服务器网址就是 URL

WebSocket 握手

Client request

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

在 HTTP 的请求 header 中增加如下字段,表示发起的是 WebSocket 协议

Upgrade: websocket
Connection: Upgrade

 
另外这几个字段分别表示

Sec-WebSocket-Key base 64 编码的随机值,用于防止代理 server cache 重新发送 WebSocket 请求
Sec-WebSocket-Protocol 用户定义的串,表示所请求的服务
Sec-WebSocket-Version 协议版本
 

Server response

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

连接建立成功,切换至 WebSocket 协议

Sec-WebSocket-Accept:经过服务器确认,加密后的 Sec-WebSocket-Key

 


参考:

Wikipedia -- WebSocket

WebSocket 详解教程

WebSocket 教程 -- 阮一峰的网络日志

WebSocket 是什么原理?为什么可以实现持久连接?-- 知乎