websocket原理、为什么能实现持久链接?

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

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

Websocket是一种在单个TCP链接上进行全双工通信的协议,在Websocket协议中,客户端和服务端只须要作一个握手的动做,就能造成一条通道,二者之间能够进行数据互相传送。ajax

因此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”错误,并关闭链接。websocket

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

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编码得来的。ide

客户端收到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 轮询来 模拟出相似的效果 -----
相关文章
相关标签/搜索