目前大多数网站都在使用的传统 HTTP 协议,即由 Web 服务器通过 HTTP 接收并响应来自客户端的消息,整个发起请求与响应的过程类似我们点外卖,由以下 2 部分构成:

  • 下订单(发起请求):用户(客户端)下了一个订单(HTTP 请求)给餐厅(服务器)。

  • 接到订单后对订单进行处理(返回对应状态码):餐厅能够做这个菜(拥有对应资源),就开始准备(服务器获取资源),并返回已接单的信息(HTTP 状态码 200 等)。如果餐厅无法制作(没有对应资源),则直接拒绝返回给用户下单失败的讯息(HTTP 状态码404 等)

在这整个过程中,餐厅都不会看到用户是谁,只需要接到订单就可以进行判断并返回信息。也就是说服务器仅需要判断 HTTP 请求,并作出响应(HTTP 相关状态码:200/403/404 等)。

上述流程中,服务器存储内容,但是这些内容更新获取必须由客户端再次请求,服务器无法将更新主动发送给指定用户,显得十分笨拙。为了改进这一项, Long Poll 以及 Ajax 轮询应运而生。可是这两种方式的成本极大,而且必须要客户端保持联系,一旦断开就需要重新发起请求。所以在这两种方式的前提下,WebSocket 诞生了。

什么是 WebSoket?

为了能够满足随时获取数据的需求,,WebSocket 协议诞生,并在 2011 年成为国际标准。 作为 HTML 5 规范的组成部分之一,WebSocket 是一种全新的协议。它将 TCP 的 Socket(套接字)应用在了 Web page 上,从而使通信双方建立起一个保持在活动状态连接通道,并且属于全双工(双方同时进行双向通信)。借助 WebSocket 我们可以在开放网络上进行多人游戏,实时聊天,多人协作等,目前大多数浏览器都支持该协议,包括 Google Chrome,Firefox,Safari,Opera,Microsoft Edge和Internet Explorer。

WebSocket 的优势

WebSocket 最大的特点就是,客户端可以主动发送消息到服务端,服务端也可以主动向客户端发送消息,实现双向通讯。

上图可以看出,相比较轮询,WebSocket 在第一次 HTTP 握手之后,就改走 WebSocket 了,对于 HTTP 的长连接(非持久连接),WebSocket 的持久连接更具实效性。

WebSocket 其优势主要包括以下几个方面:

  • 实时性,客户端和服务端可以随时互相推送消息,延迟更小,短时间内可以更多的推送消息。

  • 兼容性,与 HTTP 有着很好的兼容性,握手时采用HTTP协议,默认也是端口80,443 ,可以很大部分绕过防火墙的限制。

  • 保持连接状态,创建连接后,保持其状态,之后的通信可以省略其信息。

  • 协议标识符为 ws,如果加密为 wss

WebSocket 连接过程示例

客户端

GET /chat HTTP/1.1
Host: 127.0.0.1:4000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: aFeKKHNhbFYZSBub14oUK==
Origin: http://localhost:4000
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

服务端响应


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

重要字段说明:

  • Connection:Upgrade,表示客户端协议升级。

  • Upgrade:WebSocket,升级到 WebSocket 协议。

  • Sec-WebSocket-Key:随机字符串,对应服务端响应的 Sec-WebSocket-Accept 字段,将Sec-WebSocket-Key:指定方式计算后作为服务端响应 Sec-WebSocket-Accept 的值。通过这样,避免 HTTP 协议误以为 WebSocket 协议。

  • Sec-WebSocket-Version:表示支持的 WebSocket 版本。

WebSocket 用途和场景

社交,聊天等

聊天应用特点就是低延迟,高及时,采用的 WebSocket 协议,用户将消息发送到服务器,服务器直接将消息发送给收件人。另外,服务器还可以在通道中存储多个连接,用户能实现一次性向多人发送消息,或者查看房间内多个人的信息,实现了实时沟通交流。

多人游戏

多人游戏比较常见的模式就是,服务器用来存储状态,玩家将改变动作的状态发送到服务器,然后更新游戏状态给所有玩家,使用 HTTP 的话,每个玩家需要定期向服务器请求状态。使用 WebSocket 后,玩家的每个动作将实时的推送给所有玩家。

多人协作

需要多人在共享文档上一起工作吗?可以使用 WebSocket 实现多人共同协作,每个人的动作更新时,都会推送给所有参与者。

地图等定位相关

每当用户的 GPS 坐标更改时,更新服务器后,就会根据用户的最新坐标推送新的数据。

股票、基金报价展示

金融界数据瞬息万变,几乎是每毫秒都在变化。如果采用传统的网络架构则无法满足实时性,使用 WebSocket 可以流式更新这些数据变化而不需要等待。

目前又拍云已经全面支持 WebSocket,为采用 ws/wss 协议进行通信的客户提供优质的加速服务,能有效降低延迟,提高传输效率。产品特性及优势包括:

智能路由: 实时探测互联网线路,链路耗时跟踪分析,智能选择最优路径。

协议优化: 通过增大 TCP 窗口初始大小,调节慢启动阀值等等,解决传统协议存在的缺陷,提高传输效率。

支持WSS: 用户可自主申请、绑定 SSL 证书,一键开启 WSS 加速。同时又拍云提供多种品牌的免费、付费证书申购,为用户提供一站式 WSS 安全加速解决方案。

数据统计: 支持实时带宽、流量查询,全平台自助化查询,日志分析及下载支持,时刻掌控业务全局。

WebSocket 依赖 HTTP 协议而存在,但是同时 HTTP 和 WebSocket 都是基于 TCP 协议的不同协议,两者没有冲突。

WebSoket 的广泛应用相关推荐

  1. 使用Easyswoole 搭建简单的Websoket服务

    步骤1   修改配置文件MAIN_SERVER.SERVER_TYPE为EASYSWOOLE_WEB_SOCKET_SERVER   如dev.php <?php use EasySwoole\ ...

  2. Stomp、websoket播、点对点发消息demo

    首先Spring官方有个demo,但这里只有广播消息,在这个的基础上加点对点. https://spring.io/guides/gs/messaging-stomp-websocket/ 参考htt ...

  3. spring 整合websoket(整理)

    2019独角兽企业重金招聘Python工程师标准>>> 定义: sockjs.js:  浏览器JavaScript库,它提供了一个类似于网络的对象.SockJS提供了一个连贯的.跨浏 ...

  4. python chrome headless_[技巧] chrome headless 爬虫抓取websoket 数据

    目录 源起 分析 实践 总结 源起 周末答应了一个朋友帮他看一下一个网站应该怎么爬,费话不说直接先上网站 https://datacenter.jin10.com/price 数据一直在不停的闪,直觉 ...

  5. 《图解Http》8: 用户身份认证Cookie管理session; 9:HTTP的追加协议(websoket, webDAV)...

    基本认证,(安全等级低,多数网站不使用) Digest认证:(也不怎么用) SSL客户端认证:(凭借客户端证书认证,如网银登陆) 表单认证:用户名/密码.(常用) SSL客户端认证采用two-fact ...

  6. node websoket 实现 聊天室demo

    聊天室demo 服务端 var ws = require("nodejs-websocket"); console.log("开始建立连接...") var u ...

  7. 【HTTP基础】HTTPS原理及WebSocket原理

    由于HTTP没有加密机制,其传输的内容很容易泄漏,并且HTTP协议没法确认通信方,也无法保证接收到的报文在传输过程中是否被篡改,因此HTTPS是在HTTP协议的基础上提供了加密.认证和完整性保护的功能 ...

  8. vue+webpack热替换

    项目地址:http://pan.baidu.com/s/1i5KCXBf 今天上午和同事完成了在mac上面调试了我的框架,最后发现问题出在window系统和mac系统在表示路径的时候出现问题,在解决这 ...

  9. springboot整合websocket实现一对一消息推送和广播消息推送

    springboot基础环境,请参考springboot文档 maven依赖 <dependency><groupId>org.springframework.boot< ...

最新文章

  1. P2P太假了,光有网站平台,连人都找不着了,更不用说网站大漏洞没人管,呵呵...
  2. 数据中台实战(六):交易分析
  3. 醉了,RPC 超时设置也能引起线上事故!
  4. Ubuntu文本编辑(vi和nano)命令
  5. 浅谈C++对象内存布局
  6. AREngine概述AREngine开发教程
  7. 服务器上的此文件夹中具有更多项目,清理或删除“可恢复的项目”文件夹中的项目...
  8. C++多重继承时调用相应的父类函数
  9. 吴恩达机器学习学习笔记第二章:单变量线性回归
  10. android九宫格忘了,九宫格密码忘了怎么办?九宫格锁屏忘记密码解决方法
  11. 自动控制原理4.4---系统性能分析
  12. Matlab从入门到精通(六)--矩阵基本运算
  13. 网易云短信接口(验证码类短信||通知类短信)
  14. java版spring cloud电商源码+spring boot+redis多租户社交电子商务平台
  15. NDT算法的匹配流程
  16. 移动拼图游戏(八数码问题)A*版
  17. 保姆级-天翼网关TEWA-700G、TEWA-1000E/G等系列光猫获取超级密码
  18. ASP.NET c# 实验日记(1)
  19. 2021软件评测师真题
  20. JVM之Metaspace解密

热门文章

  1. 适配器模式coding
  2. mac上配置php开发环境,Mac配置PHP开发环境
  3. 针对不同创业阶段的创业者适合参加哪些创业赛事活动呢?创业是一场异常艰辛的马拉松,坚持是唯一的捷径,借...
  4. 2018 美团、腾讯、头条、蔚来 社招面试随谈
  5. cordova项目适配iPhoneX
  6. python高阶函数和匿名函数
  7. 关于javascript中私有作用域的预解释
  8. ffmpeg 怎么用
  9. [原创]windows server 2012 AD架构 试验 系列 – 11AD域和站点部署(2)
  10. C++虚函数与虚函数表