首页 > 其他分享 >TCP长连接的连接池、容量控制与心跳保活

TCP长连接的连接池、容量控制与心跳保活

时间:2023-04-19 23:34:17浏览次数:32  
标签:请求 保活 线程 TCP 连接 服务端 连接池

一、长连接与短连接


TCP 本身并没有长短连接的区别,长短与否,完全取决于我们怎么用它。

短连接:每次通信时,创建 Socket;一次通信结束,调用 socket.close()。这就是一般意义上的短连接,短连接的好处是管理起来比较简单,存在的连接都是可用的连接,不需要额外的控制手段。
长连接:每次通信完毕后,不会关闭连接,这样就可以做到连接的复用。长连接的好处便是省去了创建连接的耗时。
想要简单,不追求高性能,使用短连接合适,这样我们就不需要操心连接状态的管理;想要追求性能,使用长连接,我们就需要担心各种问题:比如端对端连接的维护,连接的保活。

长连接还常常被用来做数据的推送,我们大多数时候对通信的认知还是 request/response 模型,但 TCP 双工通信的性质决定了它还可以被用来做双向通信,在长连接之下,可以很方便的实现 push 模型。

 

1、系统瓶颈


(1) 长连接服务主要功能是收发数据,保持在线,使用的系统资源主要包括:CPU,内存,网卡;

(2) 当连接活跃时,大量数据接收与发送,会用到更多的CPU和网卡,大量用户在线的时候,需要维持这些连接,保持会话,需要用到大量内存;

 

2、设计难点


(1) 设计单台物理连接数100W的处理能力;

(2) CPU资源充分利用,线程的分配;

(3) 内存合理分配,数据结构选择;

(4) 异步化,剥离业务逻辑和网络IO之间的相互依赖

 

三、重点解决


1、连接池


长连接意味着连接是复用的,每次请求完连接不关闭,下次请求继续使用该连接。

如果请求是串行的,那完全没有问题。但在并发场景下,所有请求都需要使用该连接,为了保证连接的状态正确,加锁不可避免,如果连接只有一个,就意味着所有请求都需要排队等待。

因此长连接通常意味着连接池的存在:连接池中将保留一定数量的连接不关闭,有请求时从池中取出可用的连接,请求结束将连接返回池中。

连接池经常遇到的一个问题就是池大小的控制:

过大的连接池会带来资源的浪费,同时对服务端也会带来连接压力;
过小的连接池在高并发场景下会限制并发性能。
通常的解决办法是延迟创建和设置空闲时间,延迟创建是指连接只在请求到来时才创建,空闲时间是指连接在一定时间内未被使用则将被主动关闭。

这样日常情况下连接池控制在较小的尺度,当并发请求量较大时会为新的请求创建新的连接,这些连接在请求完毕后返还连接池,其中的大部分会在闲置一定时间后被主动关闭,这样就做到了并发性能和IO资源之间较好的平衡。

1、线程管理
为了充分利用CPU,需要合理的进行线程规划。整个长连接服务使用事件驱动,包括:定时器事件和IO事件(listen fd,socket fd, pipe fd), 所以线程规划就是合理给这些事件分配线程。

(1) 大量连接socket需要平均分配到各个线程;

(2) 新的连接请求量比较大,listen线程压力大,需要考虑多线程处理;

 

 

主要涉及到3种fd的线程分配:

(1) 监听fd,包括监听逻辑层的连接请求和监听客户端的连接请求,并且支持启动多个监听端口,每个端口多个线程同时工作,整体会按顺序分配到线程;

(2) 连接fd,包括逻辑层的连接和客户端的连接,采用fd取余线程数,保证平均分配到所有线程;

(3) pipe fd,负责本线程管道中数据的读取,每个线程一个;

这个样是的每个线程的CPU使用率相当。

2、长连接保活
长连接的第二个问题就是连接保活的问题。虽然TCP协议并没有限制一个连接可以保持多久,理论上只要不关闭连接,连接就一直存在。

但事实上由于NAT等网络设备的存在,一个连接即使没有主动关闭,它也不会一直存活。

长连接保活由于TCP自身的断开确认机制,如果一条TCP连接中间网络断开,此时客户端和服务端物理网络断开导致客户端和服务端都没有办法通知对方连接断开,这样服务端和客户端就会存在死连接,造成假在线,占用的资源得不到有效的回收,长连接保活主要有下面两种方式:

(1) TCP keepalive,通过设置Keepalive参数,TCP协议栈会在超过一定时间没有数据交互的时候,发送Keepalive探测包,如果连接几次都没有收到回包,则断开连接,优点是TCP协议栈提供的功能,稳定占用带宽较少;

(2) 采用应用层心跳包的方式,客户端定时向服务端发送心跳包,服务端收到心跳包后立即进行回包,客户端如果没有检测到回包,则断开连接;服务端检测超时还没有收到心跳包,则断开连接,优点主要是应用层有感知,可控并且可以带些业务数据,比如时间戳;

3、容量控制
在TCP连接建立到通信的流程中,为了防止一些恶意连接与攻击,长连接服务做了容量控制,体现在下面几个方面:

(1) 客户端建立TCP连接到TLS握手,再到发出登录请求返回登录结果,整个过程是连贯的,如果客户端停在中间的某一步骤而不往下进行,就会一直占用服务端资源,针对这种情况,服务端增加了定时控制,在TCP 连接之后30s,如果没有收到登录请求,服务端会主动断开连接;

(2) 服务统计了正在进行TLS握手,正在进行登录校验的连接数量,分别设置上限,防止同时出现大量请求的时候,对后端服务的冲击;

(3) 增加了会话通信过程中Buffer内存使用量的上限,防止对端不接收数据,导致服务端数据积压;

(4) 增加了IP统计服务,建立连接后,会将新连接的IP等信息发送到IP统计服务,对整个服务的客户端IP 情况作统计监控,增加IP黑名单功能;

标签:请求,保活,线程,TCP,连接,服务端,连接池
From: https://www.cnblogs.com/binyue/p/17335079.html

相关文章

  • tcpreplay常用命令
    tcpdump-ianyport1280-s0-wtest.pcap//抓包知道端口的流量--将包分离成客户端服务器回放的命令tcpprep-aclient-itest.pcap-otest.cache//对报文的通信流量的两方(服务器/客户端)进行分离tcprewrite-e192.168.2.100:192.168.3.101--enet_dmac=28:51:32:0b:......
  • 基于TCP协议的Socket通信
    上节中我们给大家接触了Socket的一些基本概念以及使用方法,相信大家对Socket已经有了初步的掌握。本节我们学习使用Socket来实现大文件的断点续传!在这里我们以他人的案例进行讲解,这是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用就好!1.运行效果图1.......
  • tcp报文
    TCP报文详解_测试开发-海励的博客-CSDN博客_tcp报文1、介绍tcp,transmissioncontrolprotocol传输控制协议是一种传输层协议,向上为http/https等服务,向下由ip协议支持。2、数据格式(1)源端口,2字节(2)目的端口,2字节(3)序列号,4字节,表示本报文数据部分第一个字节的编号。在tcp连接中,......
  • 抓包显示”TCP Port number reused“端口重复使用
    访问linux指定端口失败在一次调试中,在windows平台下使用软件,访问linux系统的8554端口失败,于是使用windows系统抓包查看;看到linux系统8554端口回复给windows系统14676端口的内容:win=0滑动窗口大小为0、Len=0长度为0;并且windows系统访问linux系统时“TCPPortnumberreused:重......
  • Spring Boot - Spring Boot 数据库连接池 Hikari 介绍
    SpringBoot数据库连接池Hikari介绍介绍TheHikariCPdesignaestheticisMinimalism.Inkeepingwiththesimpleisbetterorlessismoredesignphilosophy,someconfigurationaxisareintentionallyleftout.HikariCP奉行极简主义的设计美学。为了保持“越......
  • 从1写TCPIP协议栈8:网页结构与设计简介
    概述  在完成传输层的开发后,我们进入应用层HTTP超文本传输协议的开发,这部分对于使用者来说就是网页浏览器。网页浏览器实际上是对HTML内容解析的结果。HTML简介  HTML超文本传输协议本质上是描述文本与文本之间的关联关系,您可以随机打开一个网页按下Ctrk+U就能查看Web网页......
  • flask蓝图、g对象、数据库连接池
    昨日回顾#1cbv使用写一个类继承MethodView,写get,post...类属性decorators=[auth,]可以加装饰器#2cbv执行流程1跟django流程一样2entpint作用路径别名,add_url_rule(view_func=Index.as_view('index'))3为什么entpint不传,是被路由装饰器装饰的函数......
  • Linux系统知识(十一)-Ubuntu使用TCP/UDP并限制最大连接数
    一、Ubuntu使用TCP1、使用TCP的命令:  /dev/[tcp|upd]/host/port;例如::cat</dev/tcp/127.0.0.1/222、查看当前监听的端口  -bash:connect:拒绝连接  -bash:/dev/[tcp|upd]/host/port:拒绝连接  例:-bash:connect:Connectionrefused-bash:/dev/tcp/127.......
  • TCP三次握手和四次挥手
    文章目录TCP三次握手TCP四次挥手TCP三次握手序列号:建立连接时计算机随机生成的随机数作为初始值,通过SYN包传给接收端主机,每发送一次数据就累加一次该数据字节数的大小。用来解决网络包乱序问题。确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答以后认为在这个序......
  • TCP为什么可靠,采用了什么方法
    首先对比IP层,IP层不可靠,不保证网络包的交付,不保证网络包的按序交付,也不保证网络包的数据完整性。而TCP在传输层进行可靠的数据传输服务,接受到的网络包无损坏,无间隔,非冗余按序。TCP无论网络链路出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端。通过TCP连接保证可......