长连接和短链接的区别

长连接意味着进行一次数据传输后,不关闭连接,长期保持连通状态。如果两个应用程序之间有新的数据需要传输,则直接复用这个连接,无需再建立一个新的连接。就像下图这样。
在这里插入图片描述
它的优势是在多次通信中可以省去连接建立和关闭连接的开销,并且从总体上来看,进行多次数据传输的总耗时更少。缺点是需要花费额外的精力来保持这个连接一直是可用的,因为网络抖动、服务器故障等都会导致这个连接不可用,甚至是由于防火墙的原因。所以,一般我们会通过下面这几种方式来做“保活”工作,确保连接在被使用的时候是可用状态:

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

2.上层应用主动的定时发送一个小数据包作为“心跳”,探测是否能成功送达到另外一端。 保活功能大多数情况下用于服务端探测客户端的场景,一旦识别客户端不可达,则断开连接,缓解服务端压力。
提前多说一句,如果在做了高可用的分布式系统场景中运用长连接会更麻烦一些。因为高可用必然包含自动故障转移、故障隔离等机制。这恰恰导致了一旦发生故障,客户端需要及时发现哪些连接已处于不可用状态,并进行相应的重连,包括重新做负载均衡等工作。

了解完了长连接,那么短连接就很容易理解了。短连接意味着每一次的数据传输都需要建立一个新的连接,用完再马上关闭它。下次再用的时候重新建立一个新的连接,如此反复。
在这里插入图片描述

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

另外,短连接还有一个致命的缺点。我们回到前面提到的维基百科对 socket 的定义,其中说到 socket 包含通信协议、目标地址、状态等。实际当你在基于 socket 进行开发的时候,这些包含的具体资源主要就是这 5 个:源 IP、源端口、目的 IP、目的端口、协议,有个专业的叫法称之为“五元组”。在一台计算机上只要这五元组的值不重复,那么连接就可以被建立。然而一台计算机最多只能开启 65535 个端口,如果现在两个进程之间需要通信,作为服务端的 IP 和端口必然是固定的,因此单个客户端理论上最多只能与服务端同时建立 65535 个 socket 连接。如果除去操作系统和其它进程所占用的端口,实际还会更少。所以,一旦使用不当,在很短的时间内建立了大量连接,端口很容易被占用完。这不但会导致自身无法正常工作,还会影响到同一台计算机上的其它进程。

### TCP 长连接短连接的区别 在网络通信中,TCP 长连接(long-lived connection)短连接(short-lived connection)有着显著的不同之处。 #### 定义差异 - **长连接**是指客户端到服务器端的连接一旦建立,在完成本次交互之后不会立即关闭,而是保持一段时间内的持续可用状态。这种方式适用于频繁的数据交换场景,可以减少重复创建连接所带来的资源消耗以及延迟时间[^2]。 - **短连接**则是指每次数据传输完毕后即刻终止会话链接;对于HTTP请求这类一次性事务处理非常适合,因为它们通常不需要维持长时间的双向通讯通道。 #### 性能考量 - 对于**长连接**而言,由于减少了重新协商参数的时间成本(如三次握手),所以在高频率的小规模消息传递过程中表现更优。然而这也意味着占用更多的内存空间来保存未释放的状态信息直到超时自动断开为止。 - 而采用**短连接**的方式能够有效降低服务端的压力并提高系统的并发能力,尤其是在面对大量瞬时访问需求的情况下更为明显。不过每一次新的连接都需要经历完整的初始化流程,这可能会引入额外的延时。 #### 应用场景适配 - 在实际应用开发当中,选择哪种类型的TCP连接取决于具体业务逻辑的要求。例如即时聊天软件倾向于使用长连接以确保实时性低延迟特性;而Web浏览则更多依赖于基于HTTP协议下的短连接模式来进行页面加载操作。 ```python import socket def create_long_connection(host='localhost', port=8080): """模拟创建一个TCP长连接""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = (host, port) try: print(f"Connecting to {server_address}") sock.connect(server_address) while True: # 模拟保持连接不关闭 message = "This is a long lived connection" print(f'Sending "{message}"') sock.sendall(message.encode()) amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: data = sock.recv(16) amount_received += len(data) print('Received:', str(data)) user_input = input("Do you want to continue? y/n ") if user_input.lower() != 'y': break finally: print("Closing connection") sock.close() if __name__ == "__main__": create_long_connection() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值