websocket 基础概念
websocket是什么
WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
通过上述对websocket的定义,我们知道如下几个关于websocket特点:
- websocket 是一种网络传输协议
- websocket 是基于tcp 协议的
- websocket 是全双工的 (客户端和服务端都可以主动通信)
- websocket 是持久性连接
补充关于websocket 的特点 :
- 大部分编程语言都能实现websocket服务端和客户端
- websocket 协议得到了当前绝大部分浏览器的支持(web浏览器作为websocket的客户端)
- 与http协议兼容,默认的工作端口是
80(http)
和443(https)
websocket 是一个应用层协议 , 但是websocket必须依赖HTTP协议进行第一次握手 , 握手成功之后数据直接从TCP通道传输 , 此时就和HTTP无关了
websocket 连接示例
如下展示的数据是通过浏览上的调试模式获取 (websocket客户端 连接 websocket服务端)
General
Request URL: ws://127.0.0.1/echo
Request Method: GET
Status Code: 101 Switching Protocols
Response Headers
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: c/LP8JsVmZWV/EB3lgGDVmVQWVA=
Request Headers
GET ws://127.0.0.1/echo HTTP/1.1
Host: 127.0.0.1
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Upgrade: websocket
Origin: http://127.0.0.1:5500
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Sec-WebSocket-Key: rRXp2i/XCuCsKqs5MN12Ag==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
解释 :
101 Switching Protocols
: 101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求
Connection: Upgrade
的值必须是upgrade
表示请求升级
Upgrade: websocket
的值必须设置成websocket
表示升级为websocket
协议
Sec-WebSocket-Version: 13
表示支持的websocket的版本
Sec-WebSocket-Key
发给服务端的随机字符串
Sec-WebSocket-Accept
响应给客户端的值
websocket使用场景
websocket 的使用场景和其特点紧密相关的
websocket
可以使用的场景如社交聊天 , 弹幕 , 多人游戏 ,文字直播 等等,其实之本质是 高实时性 的数据传输
websocket和http的区别
websocket.png相同点 :
- 都是基于
TCP
协议- 都有加密传输
ws
和wss
,http
和https
- 都是应用层协议
不同点 :
websocket
是双工通信协议 ,http
但是单向协议某种意义上来说websocket 补上了http的一些不足
参考资料
- [1] websocket 百度百科
- [2] websocket 教程
- [3] websocket维基百科