HTTP协议中的长短连接和长短轮询

前言

相信很多人在看HTTP协议相关的文章时,都能看到这么一句话:HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。

那怎样算是把HTTP变成长连接?是不是只要设置Connection为keep-alive就可以了?

如果是的话,都说HTTP1.1默认是长连接,而观察平时开发的Web应用的HTTP头部,Connection也确实是keep-alive,那就是说我们大部分都是用的长连接,但是长连接不是一般用于交互比较频繁的应用吗?像普通的Web应用,比如个人博客这种,长连接有什么用?

如果有用那用处到底是什么,我们又不是客户端与服务器交互频繁的那种应用(毕竟你打开网页肯定要半天才打开另外一个吧),如果没用的话,那到底应不应该把Connection为keep-alive这个header值给改掉,从而改成短连接?

长短连接

HTTP协议没有长短连接一说,HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,或者更准确的说,是本次HTTP请求就结束了,根本没有长连接这一说。那么自然也就没有短连接这一说了。

之所以说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接。

疑问解答

是不是只要设置Connection为keep-alive就算是长连接了?

当然是的,但要服务器和客户端都设置。

平时用的是不是长连接?

这个也毫无疑问是的。(现在用的基本上都是HTTP1.1协议,基本上Connection都是keep-alive。而且HTTP协议文档上也提到了,HTTP1.1默认是长连接,也就是默认Connection的值就是keep-alive)。

普通的Web应用(比如个人博客)用长连接有啥好处?需不需要关掉长连接而使用短连接?

刚才已经说了长连接是指的TCP连接,长连接的目的也是为了复用(复用TCP连接)。在长连接情况下,多个HTTP请求可以复用同一个TCP连接,这就节省了很多TCP连接建立和断开的消耗。

比如你请求博客的一个网页,这个网页里肯定还包含了CSS、JS等等一系列资源,如果是短连接(也就是每次都要重新建立TCP连接)的话,那你每打开一个网页,基本要建立几个甚至几十个TCP连接,这浪费了很多资源。

但如果是长连接的话,那么这么多次HTTP请求(这些请求包括请求网页内容,CSS文件,JS文件,图片等等),其实使用的都是一个TCP连接,很显然是可以节省很多消耗的。

最后长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。

长短轮询

长轮询

介绍

http长轮询是server端收到请求后如果有数据,立刻响应请求;

如果没有数据就会停留一段时间,这段时间内,如果 server 请求的数据到达(如查询数据库或数据的逻辑处理完成),就会立刻响应;

如果这段时间过后,还没有数据到达,则以空数据的形式响应http请求;

若浏览器收到的数据为空,会再次发送同样的http请求到server;

缺点

server 没有数据到达时,http连接会停留一段时间,这会造成服务器资源浪费。

短轮询

介绍

http 短轮询是 server 收到请求不管是否有数据到达都直接响应http请求;

如果浏览器收到的数据为空,则隔一段时间,浏览器又会发送相同的http请求到server 以获取数据响应;

缺点

消息交互的实时性较低(server端到浏览器端的数据反馈效率低)。

长短轮询的异同

相同点

当server 的数据不可达时,基于http长轮询和短轮询 的http请求,都会停留一段时间。

不同点

http长轮询是在服务器端的停留;而http 短轮询是在浏览器端的停留。

性能总结

不管是长轮询还是短轮询,都不太适用于客户端数量太多的情况,因为每个服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满。

本文标题:HTTP协议中的长短连接和长短轮询

文章作者:王洪博

发布时间:2018年11月11日 - 14:11

最后更新:2019年11月14日 - 07:11

原始链接:http://whb1990.github.io/posts/4cb9c115.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%