你了解HTTP长连接吗?

简介: 你了解HTTP长连接吗?

长连接出现的前夜

在了解长连接之前,我们先看看与之对应的短连接是什么?在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。

早前的通信情况来看,因为都是些容量很小的文本传输,所以没有太大的问题,但是随着HTTP传输文档中包含大量的富文本,比如使用浏览器浏览一个包含多张图片的HTML页面的时候,在发送请求访问HTML页面资源的同时,也会请求该HTML页面包含的其他资源,因此,每次的请求都会造成无谓的TCP连接的建立和断开,增大了开销。

keep-alive字段

为了解决上面的问题,有些浏览器在请求的时候,使用了一个非标准的Connection字段。

Connection: keep-alive
复制代码

上面的字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。

Connection: keep-alive
复制代码

这样一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接,但是这不是标准的字段,不同实现的行为可能不一致,因此不是根本的解决办法。

长连接出现了

1997年1月,HTTP/1.1版本发布了,它进一步完善了HTTP协议,直到现在还是最流行的版本。

HTTP/1.1版的最大变化就是引入了持久连接(HTTP Persistent Connections),即TCP默认连接不关闭,可以被多个请求复用,不用声明keep-alive字段。

持久连接的好处

  • 减少了TCP连接的重复建立和断开造成的额外开销,减轻了服务器端的负载。
  • 使得HTTP请求和响应能够更早的结束,这样web页面的显示速度也就对应的提高了。

客户端和服务器端发现对方一段时间内没有活动,就可以主动关闭连接。不过规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。

Connection: close
复制代码

目前,对同一个域名,大多数浏览器允许同时建立6个持久连接。

管道机制

注意:管道机制是基于持久连接的

HTTP/1.1版还引入了管道机制,即在同一个TCP连接里面,客户端可以同时发送多个请求,这样就进一步改进了HTTP协议的效率,以前发送请求后需要等待并接收响应,才能发送下一个请求。管线化技术出现后,不用等待响应即可直接发送下一个请求,这样就能够做到同时并行发送多个请求,而不需要一个接一个的等待响应了,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接要快的多,请求数越多,时间差就越明显。

案例

假如一个客户端需要请求两个资源,以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出相应,收到后再发出B请求,管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求再回应B请求。

Content-Length字段

一个TCP连接可以传回多个响应,势必就要有一种机制,区分数据包是属于哪一个响应的,这就是Content-Length字段的作用,声明本次回应的数据长度。

Content-Length: 3495
复制代码

上面的代码告诉浏览器,本次响应的长度是3495个字节,后面的字节就属于下一个回应了。在1.0版本中,Content-Length字段不是必须的,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了。

分块传输编码

使用Content-Length字段的前提条件是,服务器发送响应之前,必须知道响应的数据长度,对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成,才能发送数据,这样的效率不行,更好的处理方法是,产生一块数据,就发送一块,采用流模式代替缓存模式。

因此,1.1版本规定可以不使用Content-Length字段,而是使用分块传输编码,只要请求或响应的头信息中有Transfer-Encoding字段,就表明回应将由数量未定的数据块组成。

Transfer-Encoding: chunked
复制代码

每个非空的数据块之前,会有一个16进制的数值,表示这个块的长度,最后是一个大小为0的块,就表示本次回应的数据发送完了。

长连接带来的问题

虽然HTTP1.1版本允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按照次序进行的,所以服务器只有处理完一个响应,才会进行下一个响应,如果前面的响应特别慢,后面就会有许多请求排队等待着,这就称之为队头阻塞。

如何避免?

  1. 减少请求数。
  2. 同时多开持久连接。
相关文章
|
3月前
|
安全 应用服务中间件 Apache
面试题:HTTP长连接在什么时候会超时?
面试题:HTTP长连接在什么时候会超时?
44 0
|
11月前
|
存储 网络协议 关系型数据库
字节一面:HTTP 长连接和 TCP 长连接有区别?
字节一面:HTTP 长连接和 TCP 长连接有区别?
|
监控 前端开发 网络协议
HTTP - 长连接 & 短连接 & 长轮询 & 短轮询 & 心跳机制
HTTP - 长连接 & 短连接 & 长轮询 & 短轮询 & 心跳机制
1297 0
HTTP - 长连接 & 短连接 & 长轮询 & 短轮询 & 心跳机制
|
存储 设计模式 网络协议
HTTP长连接
好久没有写网络相关的文章了。正好这两天和同事聊长连接,所以把这方面的内容进行梳理。
|
网络协议 算法 安全
HTTP的短连接、长连接管理
HTTP的短连接、长连接管理
238 0
HTTP的短连接、长连接管理
|
网络协议
HTTP长连接和短连接
一直听别人说 HTTP 长连接,只知道长连接比短连接更节省资源、更快捷,但是并不真的知道原因。知其然不知其所以然,对于技术来说,这种状态是比较危险的。所以,还是要挖一下原理,即使挖的比较浅,也要迈出这一步。
197 0
HTTP长连接和短连接
|
缓存 网络协议
你了解HTTP长连接吗?
在了解长连接之前,我们先看看与之对应的短连接是什么?在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
202 0
你了解HTTP长连接吗?
|
Web App开发 JavaScript 前端开发
Comet技术详解:基于HTTP长连接的Web端实时通信技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent Events)。
1340 0
|
Web App开发 JavaScript 前端开发
Comet:基于 HTTP 长连接的“服务器推”技术
很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接、无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式;基于 iframe 及 htmlfile 的流方式。
1122 0