区别web
'http'浏览器
HTTP1.1默认使用持久链接(persistent connection),在一个TCP链接上也能够传输多个Request/Response消息对,可是HTTP的基本模型仍是一个Request对应一个Response安全
连接方式:主要有几种bash
若是你使用Socket来创建TCP的长链接(2)服务器
那么,这个长链接(2)跟咱们这里要讨论的WebSocket是同样的,实际上TCP长链接就是WebSocket的基础,可是若是是HTTP的长链接,本质上仍是Request/Response消息对,仍然会形成资源的浪费、实时性不强等问题。 websocket
![]()
websocket的协议基础基于http 握手+传输网络
而真正在WS的握手过程当中起到做用的是下面几个header域。
1 Upgrade:upgrade是HTTP1.1中用于定义转换协议的header域。它表示,若是服务器支持的话,客户端但愿使用现有的「网络层」已经创建好的这个「链接(此处是TCP链接)」,切换到另一个「应用层」(此处是WebSocket)协议。
2 Connection:HTTP1.1中规定Upgrade只能应用在「直接链接」中,因此带有Upgrade头的HTTP1.1消息必须含有Connection头,由于Connection头的意义就是,任何接收到此消息的人(每每是代理服务器)都要在转发此消息以前处理掉Connection中指定的域(不转发Upgrade域)。
若是客户端和服务器之间是经过代理链接的,那么在发送这个握手消息以前首先要发送CONNECT消息来创建直接链接。
3 Sec-WebSocket-*:第7行标识了客户端支持的子协议的列表(关于子协议会在下面介绍),第8行标识了客户端支持的WS协议的版本列表,第5行用来发送给服务器使用(服务器会使用此字段组装成另外一个key值放在握手返回信息里发送客户端)。
4 Origin:做安全使用,防止跨站攻击,浏览器通常会使用这个来标识原始域。
复制代码
1 若是上一步中的TCP链接创建失败,则此WebSocket链接失败。
2 若是协议是wss,则在上一步创建的TCP链接之上,使用TSL发送握手信息。若是失败,则此WebSocket链接失败;若是成功,则之后的全部数据都要经过此TSL通道进行发送。
复制代码
服务端 若是请求是HTTPS,则首先要使用TLS进行握手,若是失败,则关闭链接,若是成功,则以后的数据都经过此通道进行发送socket
以后服务端能够进行一些客户端验证步骤编码
若是一切都成功,则返回成功的Response握手消息。spa
Upgrade头域,内容为websocket
Connection头域,内容为Upgrade
Sec-WebSocket-Accept头域,其内容的生成步骤:
首先将Sec-WebSocket-Key的内容加上字符串
258EAFA5-E914-47DA-95CA-C5AB0DC85B11
(一个UUID)。将#1中生成的字符串进行SHA1编码。
将#2中生成的字符串进行Base64编码。
与HTTP比较
一样做为应用层的协议,WebSocket在现代的软件开发中被愈来愈多的实践,和HTTP有不少类似的地方,这里将它们简单的作一个纯我的、非权威的比较:
相同点:
都是基于TCP的应用层协议。
都使用Request/Response模型进行链接的创建。
在链接的创建过程当中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码。
均可以在网络中传输数据。
不一样点:
WS使用HTTP来创建链接,可是定义了一系列新的header域,这些域在HTTP中并不会使用。
WS的链接不能经过中间人来转发,它必须是一个直接链接。
WS链接创建以后,通讯双方均可以在任什么时候刻向另外一方发送数据。
WS链接创建以后,数据的传输使用帧来传递,再也不须要Request消息。
WS的数据帧有序。
```复制代码