【tcp】网络连接中的长连接和短连接是什么意思?

TCP连接分为长连接和短连接,长连接在一次交互后保持连接状态,常用于需要频繁交互的场景,如即时通讯,而短连接每次通信后即关闭,适用于低频交互如Web浏览。长连接通过心跳机制维持,但可能消耗更多资源,适合用户量较小的系统。短连接避免资源占用,但握手挥手过程增加延迟,可能导致端口耗尽。选择连接类型需考虑交互频率和系统承载能力。

1 什么是长连接和短连接

 


三次握手和四次挥手

TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程。

三次握手为连接的建立过程,握手失败则连接建立失败。

四次挥手为连接的完整释放过程,也会发生某个消息丢失或者超时的情况,有一方主动发送FIN消息即表示连接即将释放。

注:SYN、ACK、FIN消息具有哪些含义,以及连接的状态,请参考《TCP/IP详解 卷1》第18章。

 

长连接

长连接,也叫持久连接,在TCP层握手成功后,不立即断开连接,并在此连接的基础上进行多次消息(包括心跳)交互,直至连接的任意一方(客户端OR服务端)主动断开连接,此过程称为一次完整的长连接。HTTP 1.1相对于1.0最重要的新特性就是引入了长连接。

 

短连接

短连接,顾名思义,与长连接的区别就是,客户端收到服务端的响应后,立刻发送FIN消息,主动释放连接。也有服务端主动断连的情况,凡是在一次消息交互(发请求-收响应)之后立刻断开连接的情况都称为短连接。

注:短连接是建立在TCP协议上的,有完整的握手挥手流程,区别于UDP协议。

 

2 如何快速区分当前连接使用的是长连接还是短连接

1、凡是在一次完整的消息交互(发请求-收响应)之后,立刻断开连接(有一方发送FIN消息)的情况都称为短连接

2、长连接的一个明显特征是会有心跳消息(也有没有心跳的情况),且一般心跳间隔都在30S或者1MIN左右,用wireshark抓包可以看到有规律的心跳消息交互(可能会存在毫秒级别的误差)。

 

长连接意味着进行一次数据传输后,不关闭连接,长期保持连通状态。

如果两个应用程序之间有新的数据需要传输,则直接复用这个连接,无需再建立一个新的连接。

 


它的优势是在多次通信中可以省去连接建立和关闭连接的开销,并且从总体上来看,进行多次数据传输的总耗时更少。

缺点是需要花费额外的精力来保持这个连接一直是可用的,因为网络抖动、服务器故障等都会导致这个连接不可用,甚至是由于防火墙的原因。

所以,一般我们会通过下面这几种方式来做“保活”工作,确保连接在被使用的时候是可用状态:

利用 TCP 自身的保活(Keepalive)机制来实现,保活机制会定时发送探测报文来识别对方是否可达。一般的默认定时间隔是 2 小时,你可以根据自己的需要在操作系统层面去调整这个间隔,不管是 linux 还是 windows 系统。

上层应用主动的定时发送一个小数据包作为“心跳”,探测是否能成功送达到另外一端。 保活功能大多数情况下用于服务端探测客户端的场景,一旦识别客户端不可达,则断开连接,缓解服务端压力。

如果在做了高可用的分布式系统场景中运用长连接会更麻烦一些。因为高可用必然包含自动故障转移、故障隔离等机制。这恰恰导致了一旦发生故障,客户端需要及时发现哪些连接已处于不可用状态,并进行相应的重连,包括重新做负载均衡等工作。

 

解完了长连接,那么短连接就很容易理解了。

短连接意味着每一次的数据传输都需要建立一个新的连接,用完再马上关闭它,下次再用的时候重新建立一个新的连接,如此反复。

 

 

它的优势是由于每次使用的连接都是新建的,所以基本上只要能够建立连接,数据就大概率能送达到对方,并且哪怕这次传输出现异常也不用担心影响后续新的数据传输,因为届时又是一个新的连接。缺点是每个连接都需要经过三次握手和四次握手的过程,耗时大大增加。

另外,短连接还有一个致命的缺点,我们回到前面提到的维基百科对 socket 的定义,其中说到socket 包含通信协议、目标地址、状态等。

实际当你在基于 socket 进行开发的时候,这些包含的具体资源主要就是这 5 个:源 IP、源端口、目的 IP、目的端口、协议,有个专业的叫法称之为“五元组”。

在一台计算机上只要这五元组的值不重复,那么连接就可以被建立。然而一台计算机最多只能开启 65535 个端口,如果现在两个进程之间需要通信,作为服务端的 IP 和端口必然是固定的,因此单个客户端理论上最多只能与服务端同时建立 65535 个 socket 连接。如果除去操作系统和其它进程所占用的端口,实际还会更少。所以,一旦使用不当,在很短的时间内建立了大量连接,端口很容易被占用完。这不但会导致自身无法正常工作,还会影响到同一台计算机上的其它进程。

 

 

3 什么时候用长连接,短连接?

1、需要频繁交互的场景使用长连接,如即时通信工具(微信/QQ,QQ也有UDP),相反则使用短连接,比如普通的web网站,只有当浏览器发起请求时才会建立连接,服务器返回相应后,连接立即断开。

2、维持长连接会有一定的系统开销,用户量少不容易看出系统瓶颈,一旦用户量上去了,就很有可能把服务器资源(内存/CPU/网卡)耗尽,所以使用需谨慎。

 

参考

 

网络连接中的长连接和短链接是什么意思?

https://www.zhihu.com/question/22677800

 

跨进程通信,到底用长连接还是短连接

https://www.pianshen.com/article/4900105171

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值