即时通讯-WebSocket
WebSocket
- WebSocket是一种在单个TCP连接上进行全双工通信的协议
- 在WebSocket API中,浏览器和服务器只需要完成一次握手(不是指建立TCP连接的那个三次握手,是指在建立TCP三次握手连接后传输一次握手数据)两者之间就直接可以创建持久性的连接,并进行双向数据传输
- 服务器到客户端的数据,头部想都较小,只有2-10字节(和数据包的长度有关),客户端到服务器时额外加上额外的4字节掩码,明显比http协议的请求消耗的资源小
- 没有同源限制,客户端可以与任意服务器通信
- 可以发送文本,也可以发送二进制数据
- Websocket使用和 HTTP 相同的 TCP 端口,都是基于TCP协议,可以绕过大多数防火墙的限制.默认情况下.Websocket协议使用80端口,运行在TLS之上时,默认使用443端口
- http建立的是短连接,,而websocket建立的是长连接
握手协议
- WebSocket 是独立的,创建在 TCP 上的协议
- Websocket 通过 HTTP/1.1 协议的101状态码进行握手
- 为了创建Websocket连接,需要通过客户端发出请求,之后服务器进行回应
# 客户端请求
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13
## 服务器响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/
参数:
- Connection必须设置Upgrade,表示客户端希望连接升级
- Upgrade字段必须设置Websocket,表示希望升级到Websocket协议
- Sec-WebSocket-Key是随机的字符串,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把“Sec-WebSocket-Key”加上一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,之后进行BASE-64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。如此操作,可以尽量避免普通HTTP请求被误认为Websocket协议。
- Sec-WebSocket-Version 表示支持的Websocket版本,RFC6455要求使用的版本是13,之前草案的版本均应当弃用。
- Origin字段是可选的,通常用来表示在浏览器中发起此Websocket连接所在的页面,类似于Referer,但是,与Referer不同的是,Origin只包含了协议和主机名称。
- 其他一些定义在HTTP协议中的字段,如Cookie等,也可以在Websocket中使用