WebSocket解析

2018-08-09  本文已影响0人  刺客的幻影
image.png

1. WebSocket是什么?

WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

简单的说,WebSocket和HTTP一样也是基于TCP/IP的应用层协议,与HTTP最大的区别是其为双向的,可以由服务端向客户端主动推送消息

2. 为什么会有WebSocket协议?

因为HTTP虽然可以通过keep-alive和服务端保持长连接,但是只能通过客户端单向地向服务端发起请求,如果想实时获取服务端最新数据,一般都会轮询。可是轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开,而HTTP请求的头部数据是很多的)。而使用websocket就不会存在这样的问题。

3. 与HTTP的区别

传统HTTP与服务端的交互模式如下:

image.png
WebSocket与服务端的交互模式如下:
image.png

上图对比可以看出,相对于传统HTTP每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

相比HTTP,WebSocket有以下优点:

4. WebSocket握手报文分析

GET /chat  HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13

Sec-WebSocket-Key字段内记录这握手过程中必不可少的键值。Sec-WebSocket-Protocol字段内记录使用的子协议。子协议按WebSocket协议标准在连接分开使用时,定义那些连接的名称 。

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

Sec-WebSocket-Accept的字段值是由握手请求中的Sec-WebSocket-Key的字段值生成的。成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。

参考文档:
https://cloud.tencent.com/document/product/214/4150
http://www.ruanyifeng.com/blog/2017/05/websocket.html

上一篇 下一篇

猜你喜欢

热点阅读