目录
一、简介
WebSocket 是 HTML5 开始提供的一种在单个TCP 连接上进行全双工通讯协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要完成一次握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,两者之间就直接可以数据互相传送。
Websocket 其实是一个新协议,跟 HTTP 协议基本没有关系,只是为了兼容现有浏览器,所以在握手阶段使用了 HTTP
二、握手详解
1.标准请求头
--- request header ---
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Origin: http://127.0.0.1:8001
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
熟悉http的小伙伴可以明显看出这里多出了一些信息
(1)通知服务器升级到websocket协议
用于告诉服务器此连接需要升级到websocket,而不再使用Http协议
Upgrade: websocket
Connection: Upgrade
(2)与服务器进行验证
Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,验证服务器是不是使用WebSocket协议去接收,能不能与服务器握手
Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同 URL 下,不同的服务所需要的协议
Sec-WebSocket-Version 是告诉服务器所使用的 WebSocket Draft (协议版本)
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
2.标准响应头
接收到客户端请求后,服务器会进行sha1计算并且拼上一个GUID得到到一个字符串,然后进行Base64 encode返回给客户端,客户端拿到后与自己的Sec-WebSocket-Key进行匹对,如果一致,握手成功。服务器会返回下列东西,表示已经接受到请求, 成功建立 WebSocket 啦!
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
下面开始就是 HTTP 最后负责的区域了,告诉客户端,我已经成功切换协议啦!
Upgrade: websocket
Connection: Upgrade
三、插曲(推送技术)
1.Ajax轮询
轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
2.Ajax长轮询(long polling)
Ajax发送第一次请求,若第一次很快返回了结果,然后不间断的立即发送第二次请求,但是第二次请求没有获得数据,所以请求迟迟没有返回(被挂在服务器了,但只要有数据就会再次返回),如果第二次的请求返回数据后,第三次请求会立刻发出,这种技术就称为Ajax 长轮询
long polling 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起请求后,如果没消息,就一直不返回 Response 给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
长轮询的精髓就在于Ajax的回调函数,继续再次调用Ajax请求(不间断的原理就在这里,成功返回后立即再次调用)
3.轮询弊端
(1)从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。
何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。
(2)Ajax轮询,需要服务器有很快的处理速度和资源。Ajax长轮询需要有很高的并发,也就是说同时接待客户的能力。否则可能出现以下问题
客户端:请问服务端,你那里有新信息么?
服务端:不好意思,客户端,我正忙,请稍后再试(503 Server Unavailable)
客户端:好吧,请问服务端,现在你那里有新信息么?
服务端:不好意思,客户端,正忙,请稍后再试(503 Server Unavailable)
四、WebSocket优点
由于Websocket是一个双全工通信协议,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端,而且只需要经过一次 HTTP 握手请求,就可以做到源源不断的进行信息传送了