项目中之前已经使用过 websocket 进行一些和服务器的实时数据通信,但是对于协议本身并不十分了解,也是借此机会学习一下并分享出来。

OSI 位置?

应用层,和 Http 协议是同级关系

为什么需要 WebSocket ?

既然同 Http 协议是同层,为什么还需要另一个协议?它有什么好处?

答案很简单,因为 HTTP 协议的设计之初就是:通信只能由客户端发起。 举例来说,我们想了解当前的股票价格,只能是客户端向服务器发出请求,服务器返回查询结果。要想实时刷新股票的价格,这个 HTTP 协议搞起来就有点费劲了,因为 HTTP 协议做不到服务器主动向客户端推送信息。

技术背景

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。有没有什么办法可以解决双向通信的问题呢?

轮询

轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的 头部 ,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

Comet

Comet is a web application model in which a long-held HTTPS request allows a web server to push data to a browser, without the browser explicitly requesting it.

Comet is an umbrella term, encompassing multiple techniques for achieving this interaction. All these methods rely on features included by default in browsers, such as JavaScript, rather than on non-default plugins.

The term Comet is not an acronym, but was coined by Alex Russell in his 2006 blog post Comet: Low Latency Data for the Browser.

Long-Polling

阻塞模型:客户端发送一个超时时间很长的 Request,服务器 hold 住这个连接,在有新数据到达时返回Response,相比频繁轮询,占用的网络带宽少了。

上述的 问题 在于对于网络带宽的占用及服务器的资源的开销。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开) 长轮询需要服务器一直 hold 住链接直到有数据返回,其实是服务端的一种 hack 方案。

于是,WebSocket 就这样出现来解决上述问题的。

WebSocket 出场

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。可以在这里查看各个浏览器的支持情况。

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议。

其他特点包括:

  • 建立在 TCP 协议之上,服务器端的实现比较容易。
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 数据格式比较轻量,性能开销小,通信高效。
  • 可以发送文本,也可以发送二进制数据。
  • 没有同源限制,客户端可以与任意服务器通信(但通常处于安全性的考虑还是会带上 origin 头)。
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
ws://example-host.com:80/path// WebSocket + TLS
wss://example-host.com:443/path
复制代码

Events

  • open
  • message
  • error
  • ping/pong
  • close

Methods

  • send
  • text
  • binary
  • close

WebSocket Close Code

协议

WebSocket Http Headers

The WebSocket connection must be an HTTP/1.1 GET request, and include the following headers:

Host

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key

Sec-WebSocket-Version

If any of these are not included in the HTTP headers, the server should respond with an HTTP error code 400 Bad Request.

GET ws://localhost:8181/ HTTP/1.1
Origin: http://localhost:8181
Host: localhost:8181
Sec-WebSocket-Key: zy6Dy9mSAIM7GJZNf9rI1A==
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
复制代码

Upon receiving a valid upgrade request with all required fields, the server will decide on the accepted protocol, and any extensions, and send back an HTTP response with status code 101 along with the Sec-WebSocket-Accept handshake acknowledgment.

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Sec-WebSocket-Accept: EDJa7WCAQQzMCYNJM42Syuo9SqQ=
Upgrade: websocket
WebSocket Frame
复制代码

更多详情请参阅 RFC 6445

参考资料

RFC 6445

《WebSocket: Lightweight Client-Server Communications》 www.ruanyifeng.com/blog/2017/0… baike.baidu.com/item/WebSoc… www.ibm.com/developerwo…

转载于:https://juejin.im/post/5cfdbf466fb9a07ef443fadb

WebSocket 学习相关推荐

  1. websocket学习笔记

    文章目录 websocket学习笔记 实现的方式 websocket学习笔记 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供 ...

  2. websocket学习和群聊实现

    WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询.在此协议的基础上,可以实现前后端数据.多端数据,真正的实时响应.在学习WebSocket的过程中,实现了一个简化版群聊,过程和 ...

  3. WebSocket学习与使用

    1.WebSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议,其目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,使得服务器可以主动发送消息给浏览器.在HTML ...

  4. WebSocket学习

    其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理.        简单地说,我们有一个非常快速的接线员(Nginx) ...

  5. python websocket模块_python websocket学习使用

    前言 今天看了一些资料,记录一下心得. websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类 ...

  6. websocket 学习--简单使用,nodejs搭建websocket服务器,到模拟股票,到实现聊天室

    websocket简介: WebSocket协议是 HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议.它允许服务器主动发送信息给客户端. 和http协议的不同?? HTTP 协议 ...

  7. websocket学习总结记录

    Websocket 1.基本概念 WebSocket是一种网络通信协议. websocket和http 的区别,http的缺陷,只能从客户端发起请求(单项请求)不能从服务器发起请求.如果服务器有连续性 ...

  8. socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室

    前言 什么是Websocket呢? 我们都知道在Http协议中,客户端与服务器端的通信是靠客户端发起请求,然后服务器端收到请求再进行回应,这个过程中,客户端是主动的,服务器端是被动的.Websocke ...

  9. 【WebSocket】WebSocket学习笔记

    目录 什么是WebSocket? 为什么需要WebSocket WebSocket与HTTP的区别 WebSocket协议的原理 WebSocket的优缺点 WebSocket应用场景 WebSock ...

最新文章

  1. BCH领头,主流币全数突破压力线
  2. 【python】-- try except (异常捕获)、断言
  3. 【网址收藏】WIN10进入超级管理员账号(Administrator)
  4. OSI七层与TCP/IP四/五层网络架构
  5. CST normalize S-parameter to given impedance
  6. 360扫地机原理大揭秘,竟还有无人驾驶技术?——浅析家用机器人SLAM方案
  7. magic winmail邮件服务器,使用magic winmail server轻松架设邮件服务器(三)_邮件服务器...
  8. 经典算法题每日演练——第二十四题 梳排序
  9. OpenStack Orchestration service (编排服务Heat)
  10. 求N!二进制中末尾1的位置(类似于求N!中有多少个5的问题)
  11. html打砖块小游戏源代码,javascript实现打砖块小游戏(附完整源码).pdf
  12. MRI T1加权结构
  13. Python数据分析U3-matplotlib可视化基础
  14. 从excel表格读取日期利用python简单实现农历转阳历功能(1901-2099年之间)
  15. html 发言样式,HTML样式
  16. ElasticSearch英文基本查询
  17. HM2022ssm-mp4.2【DML增删改编程控制(2)】
  18. 屏蔽ip段访问 html,php屏蔽ip、ip段、省份地区的访客
  19. Linux下python的卸载与安装
  20. Xshell安装rz/sz命令

热门文章

  1. SpringMVC中的 --- 异常处理
  2. Centos6部署lamp: httpd2.4+module模式
  3. 每日英语:China's New Anti-Graft Website: A Tale of Tigers, Flies and Bath Tubs
  4. 功能最强大的代码生成器——EasyCode
  5. Tomcat三种模式及配置APR模式
  6. Python之父重回决策层,社区未来如何发展?
  7. 一文看懂自动驾驶中应用的机器学习算法
  8. WSO2 ESB(1)
  9. GMap.net 离线地图问题
  10. MemberShip使用大全