WebSocket协议

WebSocket协议

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket和HTTP一样是一种应用层协议,都是基于TCP传输的,WebSocket本身和Socket并没有多大关系,更不能等同。

HTML5 定义了WebSocket 协议,以及相关的编程 API ,能更好的实现双向通信且节省服务器资源和带宽。

WebSocket优点

  • 较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
  • 更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
  • 保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
  • 更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  • 可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
  • 更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

握手协议

  • WebSocket 是独立的、创建在 TCP 上的协议。
  • Websocket 通过HTTP/1.1 协议的101状态码进行握手。
  • 为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。

WebSocket协议和HTTP协议的区别

HTTP协议为单向协议,即浏览器只能向服务器请求资源,服务器才能将数据传送给浏览器,而服务器不能主动向浏览器传递数据。分为长连接和短连接,短连接是每次http请求时都需要三次握手才能发送自己的请求,每个request对应一个response;长连接是短时间内保持连接,保持TCP不断开,指的是TCP连接。

WebSocket解决客户端发起多个http请求到服务器资源浏览器必须要经过长时间的轮询问题。

WebSocket一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;

WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。

WebSocket在建立握手连接时,数据是通过WebSocket协议传输的,“GET/chat HTTP/1.1”,这里面用到的只是WebSocket协议一些简单的字段。但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。

WebSocket与HTTP协议一样都是基于TCP的,所以它们都是可靠的协议,调用的WebSocket的send函数在实现中最终都是通过TCP的系统接口进行传输的。WebSocket和Http协议一样都属于应用层的协议,WebSocket在建立握手连接时,数据是通过HTTP协议传输的,但是在建立连接之后,真正的数据传输阶段是不需要HTTP协议参与的。
在这里插入图片描述
在这里插入图片描述
WebSocket 实际上是一种协议,与 HTTP 协议是同等协议栈的一个网络协议。用网络模型结构来解释的话, WebSocket 和 HTTP协议都属于应用层协议,两者都基于传输层协议 TCP协议。

相比HTTP长连接,WebSocket有以下特点:
是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。

WebSocket与HTTP的联系
WebSocket并不是 HTTP 协议,WebSocket协议只是基于 HTTP 协议在客户端和服务器通过握手建立连接,连接建立以后就通过 TCP 协议发送和接收报文,与 HTTP 协议无关了。

WebSocket 协议和 HTTP 协议是两种不同的东西,它们的联系如下:

  • 客户端开始建立 WebSocket 连接时要发送一个 header 标记了 Upgrade 的 HTTP 请求,表示请求协议升级。
  • 服务器端做出响应的是,直接在现有的 HTTP 服务器和现有的 HTTP 端口上实现 WebSocket 协议,重用 HTTP 握手建立连接这一功能(比如解析和认证这个 HTTP 请求。如果在 TCP 协议上实现,这两个功能就要重新实现),然后再回一个状态码为 101 的 HTTP 响应完成握手,再往后发送数据时就没 HTTP 的事了。

WebSocket与HTTP轮询
以前的网站为了实现推送功能,使用的方法都是轮询。所谓的轮询就是在特定的时间间隔(例如1秒),由浏览器向服务器发出一个 Http request ,然后服务器返回最新的数据给客户端浏览器,从而给出一种服务端实时推送的假象。由于 Http Request 的 Header(请求头)很长,而传输的数据可能很短就只占一点点,每次请求消耗的带宽大部分都消耗在 Header 上。后来还有改进的轮询方法叫做 Comet ,使用 Ajax 。但这种技术虽然可达到双向通信,但依然需要发出请求,而且在 Comet 中,普遍采用了长轮询,这也会大量消耗服务器带宽和资源。

HTTP实现实时推送用到的轮询,轮询分两种:长轮询和短轮询(传统轮询)

短轮询:浏览器定时向服务器发送请求,服务器收到请求不管是否有数据到达都直接响应 请求,隔特定时间,浏览器又会发送相同的请求到服务器, 获取数据响应,如图:
在这里插入图片描述
缺点:数据交互的实时性较低,服务端到浏览器端的数据反馈效率低

长轮询:浏览器发起请求到服务器,服务器一直保持连接打开,直到有数据可发送。发送完数据之后,浏览器关闭连接,随即又发起一个到服务器的新请求。这一过程在页面打开期间一直持续不断。如图:
在这里插入图片描述
缺点:服务器没有数据到达时,http连接会停留一段时间,造成服务器资源浪费,数据交互的实时性也很低

无论是长轮询还是短轮询,浏览器都要先发起对服务器的连接,才能接收数据,并且实时交互性很低。

然而,WebSocket的出现解决了轮询实时交互性和全双工的问题。
在JavaScript中创建了WebSocket后,会有一个HTTP请求发送到服务器以发起连接。取得服务器响应后,建立的连接使用HTTP升级,从HTTP协议交换为WebSocket协议。即,使用标准的HTTP服务器无法实现WebSocket,只有支持这种协议的专门服务器才能正常工作。
WebSocket使用了自定义的协议,未加密的连接不再是http://,而是ws://,默认端口为80,加密的连接也不是https://,而是wss://,默认端口为443。

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

WebSocket与HTTP轮询对比得出的结论:
WebSocket是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。

参考文章:
https://baike.baidu.com/item/WebSocket/1953845?fr=aladdin
https://www.jianshu.com/p/1b2019b02126
https://www.cnblogs.com/ostenant/p/9694828.html
https://blog.csdn.net/fmm_sunshine/article/details/77918477

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值