码迷,mamicode.com
首页 > Web开发 > 详细

WebSocket

时间:2019-09-28 01:12:52      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:传统   升级   管线   即时通讯   如何   不能   协议   http协议   打开   

# WebSocket

1.概述

1.1 WebSocket 是什么?

WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

2.原理

HTTP

首先从HTTP说起,HTTP1.0是无连接的。每次都得重新发起TCP连接;
HTTP1.1实现了长连接;
这一功能实质是复用了TCP连接,HTTP协议中的connection:keep-alive 是指在一次TCP连接中完成多个HTTP请求,但是对每个请求仍然要单独发 header;

AJAX

在此基础之上出现了AJAX,就是客户端周期性的请求服务器数据并在刷新页面中的部分数据;
每个request对应一个response,由于HTTP/1.1的持久连接(建立一次TCP连接,发送多个请求)和管线化技术(异步发送请求),使得HTTP请求可以在建立一次TCP连接之后发起多个异步请求。
AJAX有两个不足或者说可以优化的地方:

  1. 连接的开销;每一次请求仍是一次HTTP请求;
  2. 服务器不能主动推送,只能由客户端polling;
comet

而比较新的技术向服务器轮询获取数据的实现是Comet,即服务端推送。简单的说,服务端推送就是在客户端发起HTTP请求之后,服务器可以主动的向客户端推送数据。实现Comet的方式有两种:Ajax长轮询和HTTP流。

  • Ajax长轮询(Ajax Long-polling)
    Ajax长轮询本身不是一个真正的推送。长轮询是短轮询的一种变体。在客户端向服务器发起HTTP请求之后,服务器并不是每次都立即响应:当服务器得到最新数据时,会向客户端传输数据;当数据没有更新时,服务器会保持这个连接,等待更新数据之后,才向客户端传输数据。当然,如果服务端数据长时间没有更新,一段时间后,请求就会超时。客户端收到超时信息后,会重新发送一个HTTP请求给服务器。
    也就是说,只有在服务器获取更新后的数据,才会向客户端传输数据。这种方式也存在弊端。虽然服务端可以主动的向客户端传输数据,但是依然需要反复发出请求(HTTP请求数量比短轮询少很多)。
    短轮询和长轮询的相同点在于客户端都需要向服务器发起HTTP请求,不同点在于服务器如何响应:短轮询是服务器立即响应,不管数据是否有效;长轮询是等待数据更新后响应。

  • HTTP流
    HTTP流不同于轮询技术,HTTP流只建立一次TCP连接,在3次握手之后进行HTTP通信,此时客户端向服务器发起一个HTTP请求,而服务器保持连接打开,周期性的向客户端传输数据。双方在没有明确提出断开连接时,服务器就会持续向客户端传输数据。也就是说,假如服务器数据没有更新,服务器不会返回响应,而是保持连接;如果数据更新了,会立即将数据传输给客户端。此时会发起下一个HTTP请求,过程周而复始。

对(长、短)轮询和HTTP流做一个小小的总结:

传统轮询技术(Ajax短轮询)是客户端向服务器发起HTTP请求,无论数据是否更新,服务器都会传输数据。一个request对应一个response。

服务器推送技术(Ajax长轮询)是短轮询的变种,是客户端向服务器发起HTTP请求,只有等待数据更新后才会传输数据,否则服务器保持连接状态。接着发起下一次HTTP请求,一个request对应一个response。

服务器推送技术(HTTP流),在客户端只发起一次HTTP请求,服务器保持连接状态,在数据更新之后,服务器会传输数据,否则保持连接状态。此时一个requset对应多个response。

无论是短轮询、长轮询,还是HTTP流,相同点在于都需要客户端先发起HTTP请求。

websocket

上面的HTTP1.1 和AJAX模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。它们建立的“长连接”都是伪长连接,只不过好处是不需要对现有的HTTP server和浏览器架构做修改就能实现。

WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket是一个独立的基于TCP的协议,是与HTTP同一级的协议;
它与HTTP之间的唯一关系就是它的握手请求可以作为一个升级请求(Upgrade request)经由HTTP服务器解释(HTTP/1.1 协议的101状态码)。
WebSocket是一个网络通讯协议, 只要理解它的数据帧格式和握手流程, 都可以完成基于websokect的即时通讯。

2.1 其它概念

  • TCP的keep alive:检查当前TCP连接是否活着;
  • HTTP的Keep-alive:要让一个TCP连接活久点。

它们是不同层次的概念。

TCP keep alive的表现:
当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。
这个“一段时间”可以设置。

WebSocket

标签:传统   升级   管线   即时通讯   如何   不能   协议   http协议   打开   

原文地址:https://www.cnblogs.com/wodeboke-y/p/11600874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!