WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:

  • WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;
  • WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。

Websocket是一种在单个TCP连接上进行全双工通讯的协议,在Websocket协议中,客户端和服务端只需要做一个握手的动作,就能形成一条通道,两者之间可以进行数据互相传送。

所以WebSocket协议分为两部分:

  1. 握手
  2. 数据传输

握手

客户端发送一个请求

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

可以看到,客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。

服务端收到报文后返回的数据格式类似:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/

收到这一段响应后,客户端需要比对Sec-WebSocket-Accept值,这个值表示服务器同意握手建立连接,是客户端传输过来的Sec-WebSocket-Key跟“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”拼接后,用SHA-1加密,并进行BASE-64编码得来的。

客户端收到Sec-WebSocket-Accept后,将本地的Sec-WebSocket-Key进行同样的编码,然后比对。

只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况。

在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。
但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
HTTP协议的另外一个特点,被动性。
何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)
--------------------
至于怎么在不支持Websocket的客户端上使用Websocket。。答案是:不能
但是可以通过上面说的 long poll 和 ajax 轮询来 模拟出类似的效果
-----

最新文章

  1. 学习笔记--C#深复制和浅复制
  2. (三)Bootstrap.jar
  3. os模块之popen
  4. [CareerCup] 2.4 Partition List 划分链表
  5. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点
  6. zoj 2095 Divisor Summation
  7. 数据访问层DAL(数据库访问抽象类DataProvider)
  8. 1038: [ZJOI2008]瞭望塔 - BZOJ
  9. Big Event in HDU(01背包)
  10. Python学习笔记五,函数及其参数
  11. MVC5+EF6 入门完整教程 总目录
  12. Linux系统(三)系统基础扫盲大全
  13. 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 Bug修复
  14. 使用正则移除尖括号<>中的指定子字符串
  15. Execption:the database returned no natively generated identity value
  16. Discuz 5.x 6.x 7.x 前台SQL注入漏洞
  17. Redis持久化介绍
  18. sehll 小脚本的编写{基础}
  19. yarn 常用命令
  20. Address already in use : connect 的解决办法

热门文章

  1. Docker启动Elasticsearch报错java.nio.file.AccessDeniedException
  2. Javascript--HTML DOM基础知识
  3. ES6 Proise 简单理解
  4. php获取客户机mac地址
  5. S2-048
  6. 11 Windows编程——定时器
  7. c信号量操作demo
  8. PHP返回JSON数据及中文编码问题的解决方案
  9. C# 调用 python3
  10. golang 2 ways to delete an element from a slice