精华内容
下载资源
问答
  • 连接mysql使用连接还是短连接的选择
    千次阅读
    2019-02-14 16:42:35

    近期在做DB审计的时候发现一个问题,决定写出来让大家参考参考。本篇文章主要是讲述开发在使用数据库的时候该如何规范的使用何种连接。

    概念解释:

    长连接:长连接是相对于短连接来说的。长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。mysql的长连接如果长期闲置,mysql会8小时后(默认时间)主动断开该连接。

    短连接:是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。

    连接的区别:

    使用长连接,短连接各有优势,也各有缺点。我们看看长短连接,系统是怎么做的?

    1、短连接:
    客户端连接--创建socket认证连接--维护连接--数据传输--关闭连接

    2、长连接

    客户端连接--创建socket认证连接--维护连接--数据传输--维护连接--数据传输.....-关闭连接

    2种连接方式都需要系统开销来维护连接,哪种连接最合适并没有准确的说法,主要还是看你客户端的行为。

    长短连接的例子

    在这里主要讲一个该使用长连接的情况下使用了短连接,本文不会从系统性能负载以及开销去分析,重点是针对mysql的连接做审计来判断。

    某业务在审计时候发现连接数一直在直线上升:

    mysql> select count(1) from db_monitor.accesslog;
    +----------+
    | count(1) |
    +----------+
    |    16117 |
    +----------+
    1 row in set (0.01 sec)

    mysql> select count(1) from db_monitor.accesslog;
    +----------+
    | count(1) |
    +----------+
    |    23768|
    +----------+
    1 row in set (0.01 sec)

    ...


    截一段连接的审计图给看看:


    查看mysql的进程却只有2-3个连接

    但是每个连接几乎不到1s钟就关闭了,很典型的频繁连接进行数据通信。这种业务就特别的消耗系统资源和mysql的资源。这种情况业务应该使用长连接来使用数据库服务。

    更改为长连接后,审计连接用户数就马上正常了,保持在一定的数值。

    个人总结:

    长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。

    但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。

    总之,长连接和短连接的选择要视情况而定。


    1、在频繁的与数据库服务通信,并且又非高并发的情况下,使用长连接更合适;
    2、太多持久连接,大部分是sleep状态的,或者系统是高并发的,使用短连接更合适。
    --------------------- 
    作者:_lynnwu 
    来源:CSDN 
    原文:https://blog.csdn.net/wlzjsj/article/details/52441813 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    更多相关内容
  • 最近开发中遇到以下:需要客户端建立一个链接,然后服务器端持有这个链接,当有时间变换(如任务的...在思考这个问题时,我就在想Http建立的TCP短连接,是什么时候断开连接的?基于这个问题,我就写了个简单的测试用...

    最近开发中遇到以下:需要客户端建立一个链接,然后服务器端持有这个链接,当有时间变换(如任务的状态改变),需要后端将事件推送给任务对应的责任人。因为博主之前也研究过WebSocket,开发了个简单的聊天室,但是这次这次应用到实际,我就在想TCP的这个长连接在不发生异常的情况下可以维持多久?在思考这个问题时,我就在想Http建立的TCP短连接,是什么时候断开连接的?基于这个问题,我就写了个简单的测试用例,通过tcpdump来抓包,对长连接和短连接进行对比分析。

    ​ 下面我们来简单的介绍下长连接和短连接的概念。

    ​ 首先是TCP,三次握手建立连接,四次挥手释放连接,示意图如下:

    TCP连接建立和释放的过程图

    ​ 短连接就如上图所示,数据传输完成后,一般由客户端发起释放连接的信号,也可以看到,短连接是进行一次请求,请求结束后断开连接,那就回到上面令博主疑惑的问题了,建立连接我们都知道,Http请求到达服务器,就会立刻建立TCP连接,那是什么时候断开的呢?是服务器return了结果后立刻结束么,还是别的情况,别急,后面我们会来给大家讲解。

    ​ 长连接,和短连接最简单最直接的区别就是,他是为了服务器和客户端间的一个频繁的交互,之前的浏览器端定时的ajax轮询会消耗大量的资源,现在已经很少有人使用了;另一个,长连接比短连接更大的一个优势就是,服务器端可以维护和客户端建立的这个TCP通信的channel,这样就可以让服务器主动的给客户端发送数据,也等同于实现了全双工通信,这个也是相比ajax轮询更大的一个优势,可以实现事件的实时通知。

    基于上面所讲的,我们来分析下长连接和短连接的优缺点:

    1. 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接;
    2. 长连接如果不主动关闭,这个连接会长久的存在,并且如果长连接滥用,或者不加任何限制,会导致连接数过多,会对服务器的产生较大的压力,因此长连接在使用时要慎用,做好评估和限制;
    3. 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

    ​ 下面,我们就开始使用tcpdump来进行抓包来分析上面让我们疑惑的两个问题,首先,我们启动服务端,长连接就是我们使用的WebSocket,短连接就是一个简单的无业务逻辑的一个接口,

    ​ 在电脑上启动tcpdump,命令如下,其中-w指定抓到的包的输入路径,如果没有-w的话,会将包输出到shell窗口:

    sudo tcpdump -i lo0 -w /tmp/tcpdump/1.pcap port 8080
    

    tcpdump命令的详解大家可以参考这篇博客:https://www.jianshu.com/p/b281964a8459

    ​ 本文为了更好的分析,将日志输出到文件,并使用wireshark软件进行分析,数据包如下:
    TCP长连接抓包分析
    ​ 从中我们可以看到,红框中的为TCP连接建立的过程,红色箭头是创建WebSocket的请求,后面我们可以看到,数据反而发送就是TCP和WebSocket协议了,后面客户端和服务端之间的数据发送就无须建立TCP连接了,这和我们预料的是一致。

    ​ 但是困扰我们的一个问题:长连接在不发生异常的情况下可以维持多久?经过博主的测试,4个小时是没有任何问题的,具体多久就没有继续测试啦。。。而且,这个连接的保持应该有客户端来进行,可以定时的检查连接的状态,如果链接断开,可以重新建立连接,这样可以保证连接的畅通,事件可以及时的有服务端推送到客户端。

    ​ 下面我们来分析短连接,大家也也在思考一下困扰我们的问题:TCP短连接是什么时候断开的?结果可能和你预期的不太一样,下面我们一起来看下:

    ​ 接口代码如下:

    @GetMapping("/create")
    public String onCreate(){
        log.info("---------1111");
        return "OK";
    }
    

    ​ 下面就是直接在浏览器上输入url,按下回车键,并请求五次,每次的时间间隔为3s左右,wireshark分析得到的数据包如下:

    HTTP请求抓包分析
    由上图我们可以看到,第一次调用接口时,创建了TCP连接,但是之后的每隔三秒的再次调用,是没有重新创建TCP连接的,而是使用了之前已经创建好的连接,最后,在经过一段时间后,TCP断开连接,因为wireshark中没有时间,我们截取原始的数据包来展示TCP断开连接的时间,
    TCP连接断开
    上图是一次Http请求的所有报文,也是一次TCP连接的建立和断开,从中我们可以看到,连接的建立和数据的发送很快就结束了,但是连接的断开时在数据发送结束差不多45s开始的,由客户端发送,ack 116,服务器端真正断开连接是在约一分钟后。

    ​ 是不是和你预料的结果不太一致呢?但是为什么会导致这个结果呢,大家看下面这张截图:
    在这里插入图片描述
    之前,在http/1.0中,一个服务器发送完http响应后,会断开TCP连接。但是这样每次请求都会重新建立和断开TCP连接,开销太大。所以虽然标准中没有设定,某些服务器对Connection:keep-alive的Header进行了支持。意思是说,完成这个HTTP请求后,不要断开HTTP请求使用的TCP连接。这样的好处是连接可以被重复使用,之后发送HTTP请求的时候就不用再重新建立TCP连接了。这也符合我们刚才截图中的结果,这样,如果我们频繁的请求,Http短连接也是可以满足需求的,可见在我们开发中,有很多问题都有人为我们考虑到了。

    ​ 我们可以做一个实验,修改请求头中的Connection,值改为close,这就需要我们在postMan中调用,结果如下图所示:
    在这里插入图片描述
    可以看到,连接的建立和断开非常的快,这也符合我们最开始的设想。

    讲到这里,大家对长连接和短连接应该都很明白了,迷惑我们的两个问题也都很清楚了,希望本文能对大家有所帮助,如果有什么疑问,欢迎评论留言交流。

    最后,原创不易,喜欢的话请点赞支持,谢谢。

    展开全文
  • Java实现Socket连接和短连接

    千次下载 热门讨论 2014-09-21 11:32:43
    Java实现Socket连接和短连接,实现原理可参见个人博客
  • :sring JMS发送消息到MQ队列,这种方式是连接还是短连接?客户端连接MQ是连接还是短连接,如何确定?
  • HTTP请求头中的连接和短连接详解

    千次阅读 2021-01-03 21:46:27
    目录顺子连接的作用连接的体现TCP连接流程TCP短连接流程连接的使用场景短连接的使用场景如何判断连接和短连接Transfer-Encoding 顺子 项目中,发现一个问题,有的文字显示不全,显示一半就结束了,然后,...

    顺子

    项目中,发现一个问题,有的文字显示不全,显示一半就结束了,然后,我看响应头,发现状态码为200的响应头有Transfer-Encoding:chunked。
    显示不全的请求中,没有这个Header,所以我怀疑是不是这个问题导致的。

    下边这个参考链接,写的非常好:

    参考链接:
    https://imququ.com/post/transfer-encoding-header-in-http.html

    因为浏览器可以通过 Content-Length 的长度信息,判断出响应实体已结束。那如果 Content-Length 和实体实际长度不一致会怎样?通常如果 Content-Length 比实际长度短,会造成内容被截断;如果比实体内容长,会造成 pending。

    针对HTTP长连接和短连接,还是要回归到它们的本质TCP连接上,因为HTTP运行在TCP连接之上。

    长连接的作用

    浏览器重用已经打开的空闲持久连接,可以避开缓慢的三次握手,还可以避免遇上TCP慢启动的拥塞适应阶段。

    长连接的体现

    当一个网页完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问服务器时,会继续使用这一条已经建立好的连接。

    TCP长连接流程

    client向server发起连接,server接受client连接,双方建立连接,client与server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

    TCP短连接流程

    client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次请求就完成了,客户端自己会断开连接。短连接一般只会在 client/server间传递一次请求操作。

    长连接的使用场景

    对于频繁请求资源的客户端适合使用长连接。撸啊撸
    例如数据库使用的就是长连接。如果使用短连接,频繁的通信有可能导致socket错误,并且频繁的创建socket对资源极大的浪费。
    再者,数据库本身就追求速度,使用短连接再慢慢的握握手,效率可想而知。

    短连接的使用场景

    web网站的http服务使用短连接,因为可能存在上亿的客户端,如果全部保持长连接,服务器可能吃不消。
    每个客户端不会频繁操作,就使用短连接,但是也不一定,如果老板有钱,全部长连接也ojk。

    我就去看看了CSDN是什么连接,发现有的是长连接,有的是短连接。然后我看到了CSDN中图片存放在阿里云上。

    在这里插入图片描述

    在这里插入图片描述

    如何判断长连接和短连接

    HTTP/1.0
    	通过Connection:Keep-alive来实现长连接。
    HTTP/1.1
    	为了尽可能的提高HTTP性能,1.1规定所有连接必须是持久的,已经不需要在头部加上Connection:Keep-alive了。
    	想要短连接可以,Connection:close但一般没人会主动去使用。仔细观察一下你的请求,有时候你可以在响应头上看到这个参数。
    

    Transfer-Encoding

    Content-Encoding(内容编码)
    	对实体内容进行压缩编码,优化传输。例如用zip压缩文件,减小内容体积。
    	内容编码通常是选择性的,例如jpg/png这类文件一般不开启,因为图片格式已经是高度压缩过的,再压一遍没什么效果,还吃资源。
    		
    Transfer-Encoding(传输编码)
    	改变报文格式,不但不会减少实体内容传输大小,甚至还会使传输变大。
    	更深处说,就很细了,身为开发,就不深究了。
    	注意:Content-Encoding和Transfer-Encoding二者是相辅相成的,对于一个HTTP报文,有可能同时进行了内容编码和传输编码。
    
    展开全文
  • 最近,公司在做Redis替换memcached的项目,那mc可以设置是连接,那组件中的Redis到底用的是连接还是短连接呢? 大牛军哥只给我一个命令:netstat -anp | grep "redis" 查看是否有类似下边的 上图中的代表的...

    最近,公司在做Redis替换memcached的项目,那mc可以设置是长连接,那组件中的Redis到底用的是长连接还是短连接呢?

    大牛军哥只给我一个命令:netstat -anp | grep "redis" 查看是否有类似下边的

    上图中的代表的就是长连接,很疑惑,我就仔细研究了下,发现很有学问。

    一、netstat简介

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 2 210.34.6.89:telnet 210.34.6.96:2873 ESTABLISHED
    tcp 296 0 210.34.6.89:1165 210.34.6.84:netbios-ssn ESTABLISHED
    tcp 0 0 localhost.localdom:9001 localhost.localdom:1162 ESTABLISHED
    tcp 0 0 localhost.localdom:1162 localhost.localdom:9001 ESTABLISHED
    tcp 0 80 210.34.6.89:1161 210.34.6.10:netbios-ssn CLOSE
    
    Active UNIX domain sockets (w/o servers)
    Proto RefCnt Flags Type State I-Node Path
    unix 1 [ ] STREAM CONNECTED 16178 @000000dd
    unix 1 [ ] STREAM CONNECTED 16176 @000000dc
    unix 9 [ ] DGRAM 5292 /dev/log
    unix 1 [ ] STREAM CONNECTED 16182 @000000df

    从整体上看,netstat的输出结果可以分为两个部分:

    一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

    另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
    Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

    1.1 常见参数

    -a (all)显示所有选项,默认不显示LISTEN相关
    -t (tcp)仅显示tcp相关选项
    -u (udp)仅显示udp相关选项
    -n 拒绝显示别名,能显示数字的全部转化成数字。
    -l 仅列出有在 Listen (监听) 的服務状态

    -p 显示建立相关链接的程序名
    -r 显示路由信息,路由表
    -e 显示扩展信息,例如uid等
    -s 按各个协议进行统计
    -c 每隔一个固定时间,执行该netstat命令。

    提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到。

    二、netstat中11种网络连接状态

    通常情况下,一个正常的TCP连接,都会有三个阶段:

    1、TCP三次握手。

    2、数据传送。

    3、TCP四次挥手。


    SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。 
    ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。 
    FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。 

    (1) LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 */ 

    (2) SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 */ 

    (3) SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV /* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 */ 

    (4)ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。/* The socket has an established connection. 代表一个打开的连接,数据可以传送给用户 */ 

    (5) FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认 */ 

    (6) CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT. /* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 */ 
      
    (7) FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 */ 

    (8) LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 */ 

    (9) TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 */

    (10) CLOSING: 比较少见./* Both sockets are shut down but we still don't have all our data sent. 等待远程TCP对连接中断的确认 */ 

    (11) CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束./* The socket is not being used. 没有任何连接状态 */ 

    TIME_WAIT状态的形成只发生在主动关闭连接的一方。 

        主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。 
      

    当然上述很多TCP状态在系统里都有对应的解释或设置,可见man tcp 

    三、netstat使用

    3.1 找出程序运行的端口

    # netstat -ap | grep ssh

    3.2 IP和TCP分析

     1、查看连接某服务端口最多的的IP地址

    # netstat -nat | grep "192.168.1.15:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20

      2、TCP各种状态列表并统计排序

     # netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

      3、分析access.log获得访问前10位的ip地址

      #  awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

      4、显示所有80端口的网络连接并排序。这里的80端口是http端口,所以可以用来监控web服务。如果看到同一个IP有大量连接的话就可以判定单点流量攻击了。

       # netstat -an | grep :80 | sort

     5、这个命令可以查找出当前服务器有多少个活动的 SYNC_REC 连接。正常来说这个值很小,最好小于5。 当有Dos攻击或者邮件炸弹的时候,这个值相当的高。尽管如此,这个值和系统有很大关系,有的服务器值就很高,也是正常现象。

    netstat -np | grep SYN_REC | wc -l

    6、列出所有连接过的IP地址。

    netstat -n -p | grep SYN_REC | sort -u

    7、列出所有发送SYN_REC连接节点的IP地址。

    netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'

    8、使用netstat命令计算每个主机连接到本机的连接数。

    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

    9、列出所有连接到本机的UDP或者TCP连接的IP数量。

    netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

    10、检查 ESTABLISHED 连接并且列出每个IP地址的连接数量。

    netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

    netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
     

    四、关于长连接和短连接

    先带你来认识一下它俩的区别。

    长连接意味着进行一次数据传输后,不关闭连接,长期保持连通状态。如果两个应用程序之间有新的数据需要传输,则直接复用这个连接,无需再建立一个新的连接。就像下图这样。

    它的优势是在多次通信中可以省去连接建立和关闭连接的开销,并且从总体上来看,进行多次数据传输的总耗时更少。缺点是需要花费额外的精力来保持这个连接一直是可用的,因为网络抖动、服务器故障等都会导致这个连接不可用,甚至是由于防火墙的原因。所以,一般我们会通过下面这几种方式来做“保活”工作,确保连接在被使用的时候是可用状态:

    1. 利用 TCP 自身的保活(Keepalive)机制来实现,保活机制会定时发送探测报文来识别对方是否可达。一般的默认定时间隔是 2 小时,你可以根据自己的需要在操作系统层面去调整这个间隔,不管是 Linux 还是 Windows 系统。
    2. 上层应用主动的定时发送一个小数据包作为“心跳”,探测是否能成功送达到另外一端。 保活功能大多数情况下用于服务端探测客户端的场景,一旦识别客户端不可达,则断开连接,缓解服务端压力。

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

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

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

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

    我猜你在项目中大多数情况使用的是短连接的方式,因为这对我们编程来说可以少考虑很多问题,潜在的这些缺点可能是你没有遇到或者意识到而已。存在必有其价值,接下去我们根据实际的案例让你清楚知道如何来选择它们。

    五、长连接和短连接的选择

    我想你肯定见过一些监控或者实时报价类系统,比如股票软件,它需要在几秒之内刷新最新的价格。像这种场景中同时包含了需要运用长连接的三个主要因素:高频、服务端主动推送和有状态。

    • 高频的原因我想你根据前面的内容也明白了,因为频次越高的话,使用短连接带来的建立连接和关闭连接的总开销越大。
    • 而服务端主动推送也需要长连接的原因是,由于服务端往往是“中心化”的,一般都是 1 个服务端为多个客户端提供服务。所以,如果使用短连接的方式,那么在客户端未主动连接到服务端的情况下,服务端并不知道需要往哪些客户端去推送数据,这是原因之一。所以此时,长连接成为了一个很好的选择。另外一个原因是,哪怕客户端通过定时的短连接轮询方式进行主动连接,除了增加了额外的建立连接和关闭连接的开销外,还可能遇到通信完成后结果数据并未发生变化,做了无用功。
    • 成熟股票软件的服务端,为了支撑更多的用户以及做高可用,必然部署了多台。但是这个业务场景,用户无法容忍由于多个服务端之间数据同步的误差导致他在客户端看到的价格刷新产生“回退”现象。所以,只能尽量保持一直连接在同一台服务器上,才能避免这个情况。这种场景被称之为“有状态”,也可以理解为是“串行”的,因为多次请求的前后需要保持“连续性”。

    短连接则更适用于诸如阅读类软件的场景中,例如,很多时候用户点开一篇文章后需要花一些时间进行阅读,这个时间有长有短,并且直到用户下一次操作之前都没有数据传输发生。这个场景中包含了运用短连接的两个主要因素:低频、无状态。

    • 因为低频,所以更能容忍建立连接和关闭连接的开销。
    • 用户的下一次点击往往跳转到了其它文章,并且新打开的与当前文章并不需要具有“连续性”,所以这种场景我们称之为“无状态”的。另外,理论上同一时刻打开几篇文章也不会存在什么不妥。

    通过这两个案例我们可以总结出一个决定何时运用长连接和短连接的最佳实践。

    长连接适用于:两个进程之间需要高频通信并且具备服务端主动推送或者有状态(需串行)两者之一的场景,否则并不是必选项。

    短连接适用于:两个进程之间通信频率较低,或者属于无状态(可并行)的场景,否则并不是必选项。

    其它情况就根据所需的侧重点来,比如侧重性能就长连接,侧重编码的便捷性就选择短连接。

    ———————————————

    参考文档:

    1、https://blog.csdn.net/alibo2008/article/details/21523809

    2、如何使用netstat命令验证DDOS入侵

    3、https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html

    4、https://blog.csdn.net/Listen2You/article/details/82950763

    5、https://cloud.tencent.com/developer/article/1470024

    展开全文
  • http的连接和短连接(史上最通俗!)

    万次阅读 多人点赞 2019-02-15 10:36:08
    1.以前的误解 很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。...而之前,也长连接相关的内容,但一直都是云里雾里的。这次之所以能在这么...
  • WEB服务器-连接与短连接

    千次阅读 多人点赞 2019-04-24 23:51:29
    什么是连接、短连接? 在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源...
  • 数据库的长连接链接

    千次阅读 2020-02-06 17:53:30
    短连接 是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。 注意 建立连接的过程通常是比较复杂的,所以建议在使用中要尽量减少建立连接的动作, 也就是尽量使用连接。 但是全部使用...
  • 什么是连接 | 短连接

    千次阅读 2018-04-09 00:29:08
    某些朋友对短连接的概念存在误解,下面我们尝试厘清这2个概念。1)一般情况下,Client成功连接到Server后,会发送1个或几个请求,收到Server端1个或几个应答;然后!就会非常识趣地马上调用close()关闭连接了。...
  • 什么是连接和短连接 1.官方解释 连接(long connnection),指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。 短连接(short connnection),是相对于连接...
  • 连接和短连接的选择 1 连接:高频、服务端主动推送和有状态 2 短连接使用场景:低频、无状态 五 参考博客 前言 两个进程之间如果要通信,很显然必须要建立一个连接,通过它来相互传输数据。在网络通...
  • HTTP 的连接和短连接

    千次阅读 2022-04-10 21:15:38
    HTTP 的连接和短连接
  • HTTP协议的连接和短连接,实质就是TCP协议的连接和短连接; TCP协议建立连接需要3次握手,断开连接需要4次握手,这个过程会消耗网络资源和时间; 定义: 连接:在一个TCP连接上可以发送多个数据包,但是...
  • 根据需求,需要使用nginx返回连接和短连接响应。 配置思路 连接: http { --------------------------- keepalive_requests 100000; //这里实际只需要大于1就可以 -------------------- } 短连接: http {...
  • 长连接链接的区别

    千次阅读 2019-07-28 13:27:31
    短连接是每次通信结束后,连接中断,下次通信时重新建立连接。 连接多应用于保持通信的场景,例如:消息推送、链路复用等。 短连接应用于HTTP技术,HTTP在向服务器交互信息时在一段时间内也会保...
  • 说到连接,短连接,不得不提到三次握手。 举个例子,如下场景:   http://blog.csdn.net/sinat_21455985/article/details/53508115 三次握手(连接)和four次挥手(断开)的总结: 1tcp协议是pc机器与pc...
  • TCP/IP,http,RPC、SOA、长连接短连接

    千次阅读 2018-03-16 17:48:28
    TCP/IP建立TCP需要三次握手才能建立(客户端发起SYN,服务端SYN+ACK,客户端ACK),断开连接则需要四次握手(客户端和服务端都可以发起,FIN-ACK-FIN-ACK)。为什么连接的时候是三次握手,关闭的时候却是四次握手?答...
  • 什么是连接和短连接

    千次阅读 2018-11-06 18:18:35
    在日常项目中,大多的时候我们用的是短连接,一个请求过来,一个线程处理完该请求,线程被线程池回收,这个请求就关闭了.虽然这能满足很大部分的需求,但是也有些问题,比如说:如果客户端发的请求比较多,比较频繁,服务端就...
  • TCP的连接和短连接

    千次阅读 2019-03-08 11:01:01
    https://www.cnblogs.com/gotodsp/p/6366163.html https://www.cnblogs.com/onlysun/p/4520553.html ...HTTP的连接和短连接本质上是TCP连接和短连接。 当网络通信时采用TCP协议时,在真正的读写操作之前,serv...
  • 连接与短连接(转)

    千次阅读 2018-01-25 09:53:07
    Client/Server 通信方式建立后,下一步就需要考虑通信连接的方式,主要有两种方式的连接,即连接通信与短连接通信。通信连接方式涉及到的 APIs 主要是 connect() 和 accept()。要实现某种 Client/Server 方式,就...
  • 断开连接则需要四次握手(客户端和服务端都可以发起,FIN-ACK-FIN-ACK)。 1、为什么连接的时候是三次握手,关闭的时候却是四次握手? 答:       因为当...
  • 连接与短连接的区别以及使用场景

    万次阅读 多人点赞 2019-06-02 21:33:34
    短连接 连接->传输数据->关闭连接 比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系...
  • 微信连接转短连接

    千次阅读 2017-12-05 12:00:30
    /// /// 微信链接转链接 /// /// public string GetShortUrl() { //参数 是否必须 说明 //access_token 是 调用接
  • 数据库连接 短连接 连接 连接池 连接池 jdbc dbcp c0p3 hikari
  • java连接转短连接

    千次阅读 2017-11-14 20:18:26
    我们经常看到短信和微博中用到链接,链接的主要职责就是把原始链接很的地址压缩成只有6 个字母的链接地址, 当点击这6 个字母的链接后,又可以跳转到原始链接地址。 转换原理: 并不是采用压缩算法...
  • Mina长连接短连接实例

    热门讨论 2012-12-14 16:51:04
    Mina长连接短连接实例包含Minaclient工程和MinaHost工程,另外还有几个文档,相信对理解这两个工程有很大的帮助
  • nginx设置响应连接是长连接或者短连接 https://blog.csdn.net/qq_21127151/article/details/106880632 nginx反向代理时保持连接 https://www.cnblogs.com/liuxia912/p/11075630.html 用nginx做grpc反向...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 485,138
精华内容 194,055
关键字:

如何看是长连接还是短连接