HTTP长连接和短连接的比较

连接分类

tcp协议层支持建立连接,判断连接对方是否存活,断开连接的功能

HTTP连接分为两种方式:俗称“短连接”和“长连接”(“长连接”又称“持久连接”,洋文叫做“Keep-Alive”或“Persistent Connection”)

HTTP协议的长连接和短连接,实质上是基于tcp连接的断开连接功能,加上了连接保持时间和连接处理请求数量的开关,从而决定断开时机的逻辑。

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

HTTP的长连接 Keep-alive是要让一个TCP连接活久点。

tcp 连接是双向的,所以客户端和服务端都可以主动断开连接

但是短连接情况下,一般是客户端发送完主动断开连接,服务器处理完再断开连接,确认后最终断开。

而长连接情况下,一般是服务器端根据keepalivetime 或者maxrequst  来决定是否断开连接。

 

短连接的操作步骤是:

建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

长连接的操作步骤是:

建立连接——数据传输...(保持连接)...数据传输——关闭连接

 

为什么出现长连接?

假设有一个网页,里面包含好多图片,还包含好多【外部的】CSS 文件和 JS 文件。

在“短连接”的模式下,浏览器会先发起一个 TCP 连接,拿到该网页的 HTML 源代码(拿到 HTML 之后,这个 TCP 连接就关闭了)。然后,浏览器开始分析这个网页的源码,知道这个页面包含很多外部资源(图片、CSS、JS)。然后针对【每一个】外部资源,再分别发起一个个 TCP 连接,把这些文件获取到本地(同样的,每抓取一个外部资源后,相应的 TCP 就断开)

相反,如果是“长连接”的方式,浏览器也会先发起一个 TCP 连接去抓取页面。但是抓取页面之后,该 TCP 连接并不会立即关闭,而是暂时先保持着(所谓的“Keep-Alive”)。然后浏览器分析 HTML 源码之后,发现有很多外部资源,就用刚才那个 TCP 连接去抓取此页面的外部资源。

 

长连接特点

  • 1 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。
  • 2 Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
  • 3 实现长连接要客户端和服务端都要支持长连接。
  • 在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,而是依靠服务端的keepalivetime和maxkeepaliveRequest来控制连接的。另外当client与server之间的连接一直不关闭,随着客户端连接越来越多,server会保持过多连接。这时候server端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务
  • 并发少,操作频繁适合长连接 。例如数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。 

短连接特点:

  • 管理较为简单,不需要额外的控制手段
  • 如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
  • 服务器的连接不会被固定用户占用
  • 并发多,操作不频繁适合短连接,例如APP应用的后台接口。

 

总结:

不管是短连接还是长连接 都是客服端请求,服务端响应。没有服务端推送 的逻辑,长连接只是 减少了和服务器多次交互的时候 多次建立连接的逻辑。

 

 

长连接单次数据请求传输完成怎么识别?

短连接情况下,因为客户端只会发一次请求,所以服务端很容器确定请求体。

长连接情况下,可能有多次请求,单次数据请求传输完成怎么识别?

使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束

 

 

在HTTP/1.0中,默认使用的是短连接,如果想用长连接需要添加头conncetion:keep-alive

HTTP/1.1起,默认使用长连接如果想用长连接需要添加头conncetion:close

 

如何理解HTTP协议是无状态的

  HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

 

连接到底是什么?

连接是确保客户端到服务端的请求可以正常到达,并且正常处理并返回的一个保证。并不是一个通道,所有的请求到服务器都必须经过IP寻址的过程,服务器的响应到客户端 的逻辑也是一样,没有所谓的通道,连接只是确保互相之前发的消息对方是可以通过路由寻址 找到对方,并且对方能处理的 一个保证而已。

 

对于内网访问外网服务器情况,服务器是如何找到内网客户端的呢?

不管是tcp 还是udp 请求,客户端请求服务器,路由器(网络层)会记录tcp 连接对应的nat 的端口号和内网IP的映射关系。服务器响应之后,映射关系删除,对于长连接来说,客户端多次请求服务端,第一次需要进行tcp连接,后续多次请求不需要tcp 连接,但是 每次请求 都需要重新建立端口映射,响应之后再删除。


对于websocket 的持久连接,也是一样,需要路由器维护这个映射关系,不一样的是,服务器响应之后,这个映射关系不能删除,这样才能保证服务器推送消息的时候可以找到客户端。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值