WebSocket协议

网络通信协议

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是单向的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值