HTTP长连接和短链接

1、什么是长连接、短连接

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的 Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。数据传输完成了保持TCP连接不断开(不发RST包、不四次握手)。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来,譬如我自己写的HTTP客户端多线程去下载文件,就可以不遵循这个标准,并发的或者连续的多次GET请求,都分开在多个TCP通道中,每一条TCP通道,只有一次GET,GET完之后,立即有TCP关闭的四次握手,这样写代码更简单,这时候虽然HTTP头有Connection: Keep-alive,但不能说是长连接。正常情况下客户端浏览器、web服务端都有实现这个标准,因为它们的文件又小又多,保持长连接减少重新开TCP连接的开销很有价值

2、HTTP协议与TCP/IP协议的关系

**HTTP的长连接和短连接本质上是TCP长连接和短连接。**HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。

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

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

4.1、TCP短连接

我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server 发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server间传递一次读写操作

短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段

4.2、TCP长连接

接下来我们再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务 器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:

1.客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
2.客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
3.客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
4.客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

4.3、长连接短连接操作过程

短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接

4.4、长连接的过期时间

客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间,譬如:

这里写图片描述

上图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。

4.5、长连接的数据传输完成识别

使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。更细节的介绍可以看
http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html

5、长连接和短连接的优点和缺点

由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

6、什么时候用长连接,短连接

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。   
像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

7、容易混淆的概念——TCP的keep alive和HTTP的Keep-alive

TCP的keep alive是检查当前TCP连接是否活着
HTTP的Keep-alive是要让一个TCP连接活久点
它们是不同层次的概念。
TCP keep alive的表现:
当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。
这个“一段时间”可以设置。

<think> 首先,用户的问题是:“长连接短链接有什么区别”,这是在问长连接短链接的区别。我需要确保这是中文问题,并使用中文回答。 接下来,回顾系统提示的关键点: - 回答必须以中文进行。 - 回答完问题后,必须提出3-5个相关问题。 - 相关问题必须以“§§相关问题§§”开头,作为第一行。 - 相关问题必须输出在回答的末尾,且不可缺少。 - 禁止换行分散,相关问题必须紧凑列出。 - 相关问题的示例格式是:第一行“§§相关问题§§”,然后列出1. ··· 2. ··· 等等。 所以,我的回答结构应该是: 1. 解释问题:用中文解释长连接短链接的区别。 2. 结束回答后,添加相关问题部分。 现在,理解问题:用户提到“长连接短链接”,这可能是个打字错误。我认为用户的意思是“长连接“短连接”,因为“长连接”通常指Long Connection(如TCP长连接),“短链接”可能是个笔误,应该是“短连接”(Short Connection)。在上下文中,这通常涉及网络协议中的连接持久性。 如果是“短链接”,它可能指的是URL缩短服务(如bit.ly),但用户的问题是“短链接”,而在中文中,“短链接”常指URL缩短器,而“长连接”指网络连接。所以,我需要澄清。 查看用户输入:“长连接短链接有什么区别”。在中文中: - “长连接”:可能指Long Connection,如HTTP长连接。 - “短链接”:可能指Short URL或URL缩短服务。 在技术上下文中,更常见的是讨论“长连接“短连接”(Short Connection),但用户写了“短链接”。我应该基于常见理解来回答。 在Web开发中: - 长连接:指持久的TCP连接,如HTTP keep-alive。 - 短连接:指每次请求后关闭连接。 但“短链接”通常指Short URL服务。为了准确,我应该假设用户指的是网络连接,因为“长连接”是标准术语。 可能的解释: - 如果是网络协议:长连接 vs 短连接。 - 如果是URL:长URL vs 短URL。 用户的问题中用了“连接”“链接”,在中文中: - “连接”:connection - “链接”:link,可能指URL。 所以,可能用户想问长连接(网络)短链接(URL缩短)。我需要覆盖这个。 为了安全,我会解释两者: - 长连接(Long Connection):在计算机网络中,如TCP长连接。 - 短链接(Short Link):URL缩短服务。 然后解释区别。 现在,规划回答: - 开头解释区别。 - 用清晰的语言。 - 然后,添加相关问题。 相关问题必须基于用户的问题我的回答: - 用户问题:长连接短链接的区别。 - 我的回答:解释两者。 - 相关问题:提出3-5个相关问题,如: 1. 长连接在哪些场景下常用? 2. 短链接是如何工作的? 3. 长连接短连接的优缺点是什么?(如果涉及连接) 4. 短链接有哪些安全问题? 等。 确保相关问题数量在3到5个。 输出格式: - 回答问题后,立即添加“§§相关问题§§”作为第一行。 - 然后列出问题,用阿拉伯数字点号,如: 1. ... 2. ... 3. ... - 禁止换行分散,所以要紧凑。 完整回答示例是基于示例的:先是回答,然后代码块(如果有),然后是相关问题。 在这个问题中,不需要代码块,所以我只需文字解释。 现在,撰写回答: 1. 解释区别: - 长连接(Long Connection):在网络通信中,指保持TCP连接开放,以便多次请求,减少了连接建立的开销。常用于HTTP keep-alive、数据库连接池等。 - 短链接(Short Link):指URL缩短服务,将一个长的URL转换为短的别名,便于分享,如bit.ly。它不是关于网络连接的,而是URL管理。 区别: - 长连接是网络层的概念,涉及连接持久性。 - 短链接是应用层的概念,涉及URL重定向。 2. 相关问题: - 基于这个,提出3-5个: 1. 长连接如何提高网络性能? 2. 短链接服务是如何实现URL重定向的? 3. 使用短链接有哪些潜在风险? 4. 在HTTP协议中,长连接短连接有什么区别? 5. 短链接在社交媒体中的应用有哪些? 确保相关问题是中文。 最终输出: - 回答文本。 - 然后是“§§相关问题§§” - 然后问题列表。 </think> 长连接(Long Connection)短链接(Short Link)是两种不同的技术概念,主要区别体现在应用场景功能上: - **长连接**:指在网络通信中保持TCP连接持久开放,允许在单个连接上传输多个请求响应,减少了频繁建立断开连接的开销。常用于HTTP keep-alive、数据库连接池或实时通信(如WebSocket),以提高性能效率。 - **短链接**:指URL缩短服务,将一个冗长的原始URL转换为简洁的短别名(如bit.ly或t.cn),便于分享传播。它不是网络连接,而是应用层的重定向机制,用户访问短链接时会被重定向到原始URL。常用于社交媒体、营销推广或字符限制的场景。 主要区别: - **本质不同**:长连接是网络协议层的技术(涉及连接管理),而短链接是应用层的服务(涉及URL处理)。 - **目的不同**:长连接优化网络性能(减少延迟),短链接优化用户体验(简化URL分享)。 - **生命周期**:长连接可以是分钟级或小时级的持久连接;短链接通常是永久或可配置的,但依赖于后端服务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值