WebSocket之简介

目录

一、简介

二、握手详解

1.标准请求头

2.标准响应头

三、插曲(推送技术)

1.Ajax轮询

2.Ajax长轮询(long polling)

3.轮询弊端

四、WebSocket优点


一、简介

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 握手请求,就可以做到源源不断的进行信息传送了

猜你喜欢

转载自blog.csdn.net/mmake1994/article/details/88368295
今日推荐