网络通信协议
WebSocket 是一种网络通信协议,它诞生于2008年,在2011年成为国际标准。所有浏览器都已经支持WebSocket 协议。
WebSocket 协议是随HTML5出来的新协议。WebSocket 协议实现了浏览器与服务器的全双工通信(full-duplex)。服务器可以主动推送消息给客户端。WebSocket 协议需要借助HTTP请求完成。
WebSocket 将套接字引入网络
WebSocket 规范定义了一组 API,可在网络浏览器和服务器之间建立“套接字”连接。客户端和服务器之间建立持久的连接,双方都可以随时发送数据。
HTML5与WebSocket的关系
虽然WebSocket是随着HTML5 诞生的协议,但是WebSocket和HTML5 不是隶属关系。
WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。许多语言、框架和服务器都提供了 WebSocket 支持。
HTTP 协议的缺陷
HTTP 协议有一个缺陷:通信只能由客户端发起。HTTP 协议做不到服务器向客户端推送信息。只能用时间间隔轮询服务器,轮询的效率低,非常浪费资源,因为必须不停连接,或者 HTTP 连接始终打开。
Websocket作用
HTTP协议是被动的无状态协议,一个请求对一个响应,每次Request要建立一次TCP连接,客户端每次都需要带着客户端身份信息发到服务端,造成请求报头冗余,关键是服务端无法主动推送消息给客户端。
为了解决 HTTP 协议浪费通信带宽和服务端资源的缺点,推出了WebSocket。
WebSocket一次请求持久连接的方式,解决了反复校验客户端身份的问题,客户端与服务端建立连接后,服务端还可以主动推送消息给客户端,实现了全双工通信,通信效率大大增加,节约了客户端、服务端和网络资源。
WebSocket和Socket区别
WebSocket和Socket是两个东西,Socket是传输控制层协议,WebSocket则是一个典型的应用层通信协议。
Socket一个是网编编程的标准接口,socket是基于传输层的传输控制协议。
它们都是全双工的,可以同时接收和发送。
WebSocket实现了客户端与服务器全双工通信,都能主动的向对方发送或接收数据,就像 Socket 一样,能更好的节省服务器资源和带宽,实现实时通讯。
WebSocket与Socket的关系
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
Socket不是协议,而是为了方便使用TCP或UDP而抽象出来的,位于应用层和传输控制层之间的一组接口。
Socket其实是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据以符合指定的协议。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。
特点
WebSocket是一个持久化的协议,它是伴随HTTP5而出的协议,是用来解决http不支持持久化连接问题的。
WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。
WebSocket同 HTTP 一样,建立在 TCP 之上通过 TCP 来传输数据。
WebSocket最大特点是:
服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是全双工通信,是属于服务器推送技术的一种。
诞生的目的是:实现即时通讯,替代轮询。
其他特点包括:
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易被屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),
服务器网址就是URL ws://example.com:80/some/path
原理
WebSocket同HTTP一样也是应用层的协议,但是它是建立在TCP之上的双向通信协议。
WebSocket 类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端或Server 端断开 WebSocket 连接前,不需要客户端和服务端重新发起连接请求。在海量并发和 客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。
WebSocket在建立握手时,数据是通过HTTP传输的。在建立之后,不需要HTTP协议。webSocket建立过程,WebSocket握手。
WebSocket的握手分为客户端请求和服务器端回应。
WebSocket握手
WebSocket握手:客户端发起升级协议的请求,采用标准的HTTP报文格式Get请求,在请求报文头中包含报头域:
Connection: Upgrade 表明连接需要升级
Upgrade: websocket 需要升级到 websocket协议
Sec-WebSocket-Version: 13 协议的版本为13
这是 WebSocket 的握手核心,告诉Nginx 等服务器:我发起的请求要用 WebSocket 协议,而不是 HTTP。
WebSocket数据传输:
WebSocket握手完成即升级完成,服务端将http协议切换成websocket数据协议;
WebSocket客户端的握手请求:
GET / HTTP/1.1 // 请求方式必须是GET请求,HTTP的协议必须是1.1
Connection:Upgrade // 客户端请求升级连接
Upgrade:websocket // 请求升级为websocket协议
Host: server.example.com // 请求的主机
Origin: http://example.com // 打开的socket的页面
Sec-Websocket-Key:s242sfdklf9fdsjklaghdgew== // 是一个 Base64 encode 的值,这个是浏览器随机生成的的字符串,与服务器响应的 Sec-WebSocket-Accept对应。客户端通过GUID来验证这个参数是不是一个有效请求
Sec-WebSocket-Version:13 // websocket使用的协议,RFC6455规定这个值必须是13
Sec-WebSocket-Protocol:chat, superchat // 客户端可以指定应用程序支持的协议,服务器选择其中的一个做为双方通信的协议
Sec-webSocket-Extension:xxxx //客户端指定某些扩展协议,服务器选择其中一个
服务器响应升级协议
服务器端的回应如下:
HTTP/1.1 101 Switching Protocols // 服务器端同意客户端的握手请求
Connection: Upgrade // 同意连接升级
Sec-WebSocket-Accept: fjsYeFDJKIsfds7sdf3fdssd=fs0= // 通过GUID计算出来的值
Sec-WebSocket-Version: 13 // 对应websocket的版本
Upgrade: websocket // 同意升级为websocket协议
服务端接收到升级协议的请求,如果服务端支持升级协议会做如下响应。
响应:
响应状态码 101 ,101 Switching Protocols 表示服务器支持切换协议,在发送完这个响应后,服务器将会切换到在Upgrade请求头中定义的那些协议。
如果服务器返回的响应头的状态码不是101,则客户端需要断开此连接,如果Sec-WebSocket-Protocol规定了其中的子协议则服务器必须响应其中一个,否则客户端必须断开这个连接。
升级协议完成以后,客户端和服务器就可以相互发送数据
WebSocket与HTTP的关系
WebSocket 是一个独立的基于 TCP 的协议,它与 HTTP 之间的关系就是它的握手请求可以作为一个升级请求(Upgrade request)经由 HTTP 服务器解释。
WebSocket是一个网络通讯协议, 只要理解数据帧格式和握手流程, 都可以完成基于websokect的即时通讯。
相同点:
都是一样基于TCP的,都是可靠性传输协议。都是应用层协议。
不同点:
WebSocket是需要握手进行建立连接的。
WebSocket是双向通信协议,模拟Socket协议,可以双向发送和接受信息。
HTTP是单向的。