1. 介绍

标题中几个关键字在平常经常见到。本文小作总结。注意本文讨论的轮询均指网络通信中的“轮询”,请区别下CPU轮询。

2. 长连接

2.1 介绍

一般我们说长连接,主要描述的对象是一个TCP请求连接。当一个TCP通道一直保持着连接状态,即称这个连接为长连接。现在的HTTP1.1协议都使用的长连接,可以看到http报文5头部的connection为keep-alive,即为长连接。使用长连接和不使用长连接的效果对比下图:

优点:节约频繁创建连接的开销。可以看到多个请求可以复用一个tcp连接。

2.2 本质原理分析

本质上理解,这是一种“多路复用”技术。在通信领域,多路复用技术是为了有效地利用通信线路,希望一个信道同时传输多路信号。可见这种本质上的道理都是相同的。

同样的理解,我们可以放到http2.0上。http2.0一个重要改进,其实就是在更加细的粒度上来应用“多路复用”技术。把一次request请求看成是一个“信道”,同时承载多个请求,从而改进了性能。大家可以理解下。关于http2.0可以参考我的文章:HTTP2的优点

PS:当我们说起长连接的时候,请注意长连接描述的是TCP连接。在一个TCP连接中仍然可以发起多次请求,这个是不冲突的。提这个是防止有人认为一次请求和建立一次tcp连接是一个意思。

3. 长轮询和短轮询

3.1 轮询

长轮询和短轮询本质上都是轮询。轮询表示客户端每经过固定的时间间隔就像服务器请求数据。当我们在讨论轮询的时候,往往是在讨论“请求应答”场景下的“数据请求”的问题。从"推拉"模型来看轮询的话,轮询这种方式显然属于拉模型(基于请求响应的方式)。长轮询和短轮询最主要的区别就是作为请求的响应方在没有数据的时候,是如何响应数据请求方的。下面我们都以http为例来说明下短轮询和长轮询。但是注意,这种概念是通用的,并不是说只能用于http上。

PS: 轮询和是否为长连接之间的关系是比较独立的,最好分开来理解。我不使用长连接,其实也可以使用轮询(短轮询)。当然长轮询仍然依赖长连接。况且现在HTTP上通信基本都是长连接了。

3.2 短轮询

客户端每隔一段时间向服务端发送请求来获取数据。

这种模式一个明显的缺点就是: 客户端定时发起请求,如果服务端数据长期没有变化,会产生大量无效的请求,浪费网络资源。

3.3 comet

Comet是一种用于web的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流。

3.3.1 长轮询

长轮询是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。长轮询重点注意以下几点即可:

  1. 长轮询必须使用长连接
  2. 长轮询是一种服务器推数据的技术
  3. 长轮询实现服务器推数据的方法是hold住一个请求(当然你可以设置超时时间),直到有数据了给客户端响应

PS: 有些人说长轮询是靠hold住一个连接来达到服务端推数据的功能,这种说法是“错误”的。长轮询确实需要保证长连接,但是直接hold住的应该是一个request请求。

3.3.2 流技术

流技术基于 Iframe。Iframe 是 HTML 标记,这个标记的 src 属性会保持对指定 server 的长连接请求,server 就可以不断地向 client 返回数据。