最近要做一个类似网络实时聊天系统的测试, 问了开发基本是基于websocket实现的, 于是周末花了点时间来了解下websocket协议的相关介绍, 在这里做一个简单的整理与总结.
什么是websocket
在实时通信的场景中(例如实时刷新股票或者聊天室等情况), 如若使用http协议, 在每次更新数据时都需要客户端主动向服务端发起请求, 想想一下这里会有什么缺点?
- http请求会带上head信息,head信息头占空间比较大, 传输时占带宽资源;
- 服务端无法主动同步数据到客户端;
- 客户端必须轮询get服务端数据, 浪费性能, 要么轮询是服务端数据并没有更新,获取不到新数据, 要么服务端数据更新太快, 客户端请求跟不上, 无法做到实时更新;
于是就有了websocket协议, 它就是为了这一类场景而设计的全双工通信协议(客户端与服务端), 只有最一开始的握手需要通过http请求建立tcp通信同道, 而后直接通过websocket协议进行数据传输, 节省了带宽资源以及服务器资源.
其他:
websocket
是HTML5一种新的协议.websocket
是应用层协议, 位于传输层tcp
协议之上.websocket
和http
使用相同的tcp端口,ws
开头默认端口为80,wss
(SSL加密)默认端口为443.
websocket通信过程
协议分为2个部分, 握手阶段
和数据通信阶段
.
1. 客户端与服务端使用tcp3次握手建立连接, 完成tcp握手阶段
2. 连接成功后, 客户端会通过HTTP/1.1 协议的101状态码与服务器进行握手, 请求如下
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13
主要是告诉服务端需要使用webscoket协议通信,并告知websocket的版本号, 其中Upgrade与Connection字段必须设置要设置, 服务器接受到请求回应如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/
以上即表示websocket握手完成.
3. 进行数据通信.
http和websocket的关系
相同点:
- 都是基于TCP的应用层协议
不同点
- http协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据
- websocket是持久化的全双工通信协议, 支持双向发送或接收消息.
- websocket需要通过http握手建立.
1张图理解http和websocket交互方式, 如下:
socket与websocket的关系
实际上, socket并不是协议, 是应用层与tcp/ip协议族通信的中间软件抽象层, 只是tcp/ip协议的封装, 位于应用层和传输控制层之间的一组接口. 通常2台主机通信时, 必须调用socket进行连接, 其底层其实就是tcp/ip协议. 如下图