背景

以前,很多网站使用轮询实现推送技术。轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器。轮询的缺点很明显,浏览器需要不断的向服务器发出请求,然而HTTP请求的header是非常长 的,而实际传输的数据可能很小,这就造成了带宽和服务器资源的浪费。

Comet使用了AJAX改进了轮询,可以实现双向通信。但是Comet依然需要发出请求,而且在Comet中,普遍采用了长链接,这也会大量消耗服务器带宽和资源。

于是,WebSocket协议应运而生。

WebSocket协议

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器通过 TCP 连接直接交换数据。WebSocket 连接本质上是一个 TCP 连接。

WebSocket在数据传输的稳定性和数据传输量的大小方面,具有很大的性能优势。Websocket.org 比较了轮询和WebSocket的性能优势:

从上图可以看出,WebSocket具有很大的性能优势,流量和负载增大的情况下,优势更加明显。

例子

浏览器请求

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

服务器回应

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-Key是随机的,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把Sec-WebSocket-Key加上一个魔幻字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11。使用 SHA-1 加密,之后进行 BASE-64编码,将结果作为 Sec-WebSocket-Accept 头的值,返回给客户端。

python代码实现

def ws_accept_key(ws_key):
"""calc the Sec-WebSocket-Accept key by Sec-WebSocket-key
come from client, the return value used for handshake :ws_key: Sec-WebSocket-Key come from client
:returns: Sec-WebSocket-Accept """
import hashlib
import base64
try:
magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
sha1 = hashlib.sha1()
sha1.update(ws_key + magic)
return base64.b64encode(sha1.digest())
except Exception as e:
return None
print ws_accept_key('sN9cRrP/n9NdMgdcy2VJFQ==')

最新文章

  1. Windows API 设置窗口下控件Enable属性
  2. myeclipse给项目改了名字,但部署tomcat的项目名还是原来的
  3. code complete part1
  4. c++大数模板
  5. UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
  6. iOS UIWebView键盘操控
  7. open live writer下载安装
  8. python requests get/post
  9. ZooKeeper数据模型
  10. 排序1,2......n的无序数组,时间复杂度为o(n),空间复杂度为o(1)
  11. Jquery----对文档操作
  12. http协议与浏览器缓存
  13. failed to launch: nice -n 0 /home/hadoop/spark-2.3.3-bin-hadoop2.7/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 spark://namenode1:7077
  14. 虚拟机VM下CentOS7部署WASND9+HTTP9
  15. 02. pt-archiver
  16. 常用Raspberry Pi周边传感器的使用教程(转)
  17. Windows App开发之应用布局与基本导航
  18. 通过xshell/securecrt连接linux上传/下载文件
  19. oracle tnsnames.ora文件用法说明
  20. ethereumjs/ethereumjs-blockchain-1-简介和API

热门文章

  1. wd mycloud nas新玩法
  2. 移动端meta 解释
  3. 把握linux内核设计思想(七):内核定时器和定时运行
  4. Extjs学习笔记--(一vs增加extjs智能感知)
  5. url重写(urlrewrite)的一些系统变量
  6. ZooKeeper(六)-- CAP和BASE理论、ZAB协议
  7. Python 流程控制:if
  8. Linux命令之乐--grep
  9. NGUI在5.3打包失败问题
  10. Android 7.1 SystemUI--任务管理--场景一:长按某个缩略图,拖动分屏的流程