精华内容
下载资源
问答
  • Java实现Socket长连接和短连接

    千次下载 热门讨论 2014-09-21 11:32:43
    Java实现Socket长连接和短连接,实现原理可参见个人博客
  • Mina长连接框架实现Android客户端与服务器端通信
  • 使用MINA实现长连接

    2016-08-13 17:16:41
    使用MINA实现长连接
  • Netty4长连接、断开重连、心跳检测、Msgpack编码解码 http://blog.csdn.net/giousa/article/details/72846303#t2
  • android 客户端 后台启动服务 保持 TCP 长连接例子。
  • Android的socket长连接(心跳检测)

    千次下载 热门讨论 2014-12-18 17:10:54
    这是Android的socket长连接(心跳包),由于本人项目中需要用到长连接,所以先做了个demo,亲测是没有问题的。
  • 用okhttp实现webSocket长连接

    热门讨论 2016-08-24 15:49:41
    用okhttp实现webSocket长连接,可以接收服务端消息,向服务端发送消息,心跳包,维护长连接
  • 基于Apache Mina实现的TCP长连接和短连接实例 详细说明,可参见blog http://blog.csdn.net/peterwanghao/article/details/6900523
  • HTTP长连接和WebSocket长连接的区别

    千次阅读 2020-11-10 16:04:42
    要理解HTTP长连接和websocket长连接的区别,首先要理解一下什么是HTTP的长连接和短连接。 一、HTTP的长连接和短连接区别 首先需要消除一个误解:HTTP协议是基于请求/响应模式的,因此客户端请求后只要服务端给了...

    要理解HTTP长连接和websocket长连接的区别,首先要理解一下什么是HTTP的长连接和短连接。

    一、HTTP的长连接和短连接区别

    首先需要消除一个误解:HTTP协议是基于请求/响应模式的,因此客户端请求后只要服务端给了响应,本次HTTP请求就结束了,没有长连接这一说。那么自然也就没有短连接这一说了。

    所谓的HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

    HTTP协议是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接。

    1、短连接

    过程:连接->传输数据->关闭连接 
    短链接就是浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 比如HTTP1.0。
    具体就是 浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报文->server handle并发送HttpResponse报文给前端,发送完毕之后立即调用socket.close方法->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。 
    也就是说,短连接是指SOCKET连接后,发送接收完数据后马上断开连接。 因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。

    2、长连接

    过程:连接->传输数据->保持连接 -> 传输数据-> ………..->一方关闭连接

    长连接指建立SOCKET连接后不管是否使用都保持TCP连接。

    HTTP1.1默认是长连接,也就是默认Connection的值就是keep-alive,本次请求响应结束后,TCP连接将仍然保持打开状态,所以浏览器可以继续通过相同的连接发送请求,节省了很多TCP连接建立和断开的消耗,还节约了带宽。

    长连接并不是永久连接的。如果一段时间内(具体的时间可以在header当中进行设置,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。这一点其实很容易理解,否则的话,TCP连接将会越来越多,直到把服务器的TCP连接数量撑爆为止。

    二、HTTP长连接和WebSocket长连接的区别

    HTTP1.1中,Connection默认为Keep-alive参数,官方的说法是可以用这个来作为长连接。那么问题来了,既然HTTP1.1支持长连接,为什么还要搞出一个WebSocket呢?

    1、HTTP1.1

    Keep-alive的确可以实现长连接,但是这个长连接是有问题的,本质上依然是客户端主动发起-服务端应答的模式,是没法做到服务端主动发送通知给客户端的。也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是一个request只能有一个response。而且这个response也是被动的,不能主动发起。开启了Keep-alive,可以看出依然是一问一答的模式,只是省略了每次的关闭和打开操作。

    2、WebSocket

    WebSocket是可以互相主动发起的。相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

    WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。
    在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。

    WebSocket的流程大概是以下几步:

    1、浏览器、服务器建立TCP连接,三次握手。这是通信的基础,传输控制层,若失败后续都不执行。
    2、TCP连接成功后,浏览器通过HTTP协议向服务器传送WebSocket支持的版本号等信息。(开始前的HTTP握手)服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据。
    3、连接成功后,双方通过TCP通道进行数据传输,不需要HTTP协议。
    也就是说WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。

    WebSocket 客户端连接报文

    GET /webfin/websocket/ HTTP/1.1
    Host: localhost
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
    Origin: 
    http://localhost
    :8080
    Sec-WebSocket-Version: 13

    客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。

    服务端收到报文后返回的数据格式类似:
    WebSocket 服务端响应报文:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

    “Sec-WebSocket-Accept”的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,“HTTP/1.1 101 Switching Protocols”表示服务端接受 WebSocket 协议的客户端连接,经过这样的请求-响应处理后,客户端服务端的 WebSocket 连接握手成功, 后续就可以进行 TCP 通讯了。

     

    参考:

    https://www.jianshu.com/p/3fc3646fad80

    https://www.cnblogs.com/zzz-knight/p/12694198.html

    https://www.jianshu.com/p/86a550a521c5

     

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

    万次阅读 多人点赞 2019-02-15 10:36:08
    ...但终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉。 今天通过一番研究,终于明白了这其中的奥秘。而之前,也看过长连接相关的内容,但一直都是云里雾里的。这次之所以能在这么...

    源: https://www.jianshu.com/p/3fc3646fad80

    1.以前的误解

    很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。但终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉。

    今天通过一番研究,终于明白了这其中的奥秘。而之前,也看过长连接相关的内容,但一直都是云里雾里的。这次之所以能在这么短的时间里搞清楚,和自己技术的沉淀密不可分。因此,这里借着这个机会,再次强调一下,千万不要试图去研究你研究了很久都整不明白的东西,或许是你的层次不到,也或许是你从未在实际的应用场景接触过,这种情况下你去研究,只会事倍功半,徒劳一番罢了。

    回到正题,既然说是误解,那么的误解到底是什么?

    那就是一直认为,HTTP连接分为长连接和短连接,而我们现在常用的都是HTTP1.1,因此我们用的都是长连接。

    这句话其实只对了一半,我们现如今的HTTP协议,大部分都是1.1的,因此我们平时用的基本上都是长连接。但是前半句是不对的,HTTP协议根本没有长短连接这一说,也正因为误解了这个,导致对于长连接一直不明不白,始终不得其要领,具体下面一段会说到。

    网络上很多文章都是误人子弟,根本没有说明白这个概念。这里要强调一下,HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,或者更准确的说,是本次HTTP请求就结束了,根本没有长连接这一说。那么自然也就没有短连接这一说了。

    之所以网络上说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

    其实知道了以后,会觉得这很好理解。HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接。

    一个形象的例子就是,拿你在网上购物来说,HTTP协议是指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP请求,等货物运到地方了,快递员会根据你发的请求把货物送给相应的收货人。而TCP协议就是中间运货的那个大货车,也可能是火车或者飞机,但不管是什么,它是负责运输的,因此必须要有路,不管是地上还是天上。那么这个路就是所谓的TCP连接,也就是一个双向的数据通道。

    因此,LZ现在甚至觉得,“HTTP连接”这个词就不应该出现,它只是一个应用层的协议,根本就没有所谓的连接这一说,就像FTP也是应用层的协议,但是你有听说过FTP连接吗?(恩,好像是听过,-_-,但你现在知道了,其实所谓的FTP连接,严格来说,依旧是TCP连接)

    实际上,说HTTP请求和HTTP响应会更准确一些,而HTTP请求和HTTP响应,都是通过TCP连接这个通道来回传输的。

    不管怎么说,一定要务必记住,长连接是指的TCP连接,而不是HTTP连接。
    

    一个疑问

    之前LZ一直对一件事有些模糊不清,首先是怎么样就算是把HTTP变成长连接了,是不是只要设置Connection为keep-alive就算是了?

    如果是的话,那都说HTTP1.1默认是长连接,而观察我们平时开发的Web应用的HTTP头部,Connection也确实是keep-alive,那就是说我们大部分都是用的长连接,但是长连接不是一般用于交互比较频繁的应用吗?像我们这种普通的Web应用,比如博客园这种,或者我的个人博客这种,长连接有什么用?

    如果有用那用处到底是什么,我们又不是客户端与服务器交互频繁的那种应用(毕竟你打开网页肯定要半天才打开另外一个吧),如果没用的话,那到底应不应该把Connection为keep-alive这个header值给改掉,从而改成短连接?

    这个疑问,在LZ明白了长连接其实是指的TCP连接之后,基本上就明白了。而这个疑问,也正是LZ在“以前的误解”那一段所提到的,那个因为误解导致LZ一直搞不明白的问题。

    为什么解决了上面那个误解之后,前面所说的这些疑问LZ都明白了?

    因为长连接意味着连接会被复用,毕竟一直保持着连接不就是为了重复使用嘛。但如果长连接是指的HTTP的话,那就是说HTTP连接可以被重复利用,这个话听起来就感觉很别扭。之所以觉得别扭,其实就是LZ的一种直觉,没什么理论依据。而这种别扭的根源就在于,之前一直没有融会贯通的感觉,所以总感觉缺少点什么。不过这点疑惑,并没有影响LZ的工作,因此也就没深究过。

    但现在好了,明白了长连接实际上是指的TCP连接,LZ瞬间自己就想明白了上面的那些问题。

    第一个问题是,是不是只要设置Connection为keep-alive就算是长连接了?

    当然是的,但要服务器和客户端都设置。

    第二个问题是,我们平时用的是不是长连接?

    这个也毫无疑问,当然是的。(现在用的基本上都是HTTP1.1协议,你观察一下就会发现,基本上Connection都是keep-alive。而且HTTP协议文档上也提到了,HTTP1.1默认是长连接,也就是默认Connection的值就是keep-alive)

    第三个问题,也是LZ之前最想不明白的问题,那就是我们这种普通的Web应用(比如博客园,我的个人博客这种)用长连接有啥好处?需不需要关掉长连接而使用短连接?

    这个问题LZ现在终于明白了,问题的答案是好处还是有的。

    好处是什么?

    首先,刚才已经说了,长连接是为了复用,这个在之前LZ就明白。那既然长连接是指的TCP连接,也就是说复用的是TCP连接。那这就很好解释了,也就是说,长连接情况下,多个HTTP请求可以复用同一个TCP连接,这就节省了很多TCP连接建立和断开的消耗。

    比如你请求了博客园的一个网页,这个网页里肯定还包含了CSS、JS等等一系列资源,如果你是短连接(也就是每次都要重新建立TCP连接)的话,那你每打开一个网页,基本要建立几个甚至几十个TCP连接,这浪费了多少资源就不用LZ去说了吧。

    但如果是长连接的话,那么这么多次HTTP请求(这些请求包括请求网页内容,CSS文件,JS文件,图片等等),其实使用的都是一个TCP连接,很显然是可以节省很多消耗的。

    这样一解释,就很明白了,不知道大家看了这些解释感觉如何,反正LZ在自己想明白以后,有种豁然开朗的感觉。

    另外,最后关于长连接还要多提一句,那就是,长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。

    这一点其实很容易理解,否则的话,TCP连接将会越来越多,直到把服务器的TCP连接数量撑爆到上限为止。现在想想,对于服务器来说,服务器里的这些个长连接其实很有数据库连接池的味道,大家都是为了节省连接重复利用嘛,对不对?

    长轮询和短轮询

    前面基本上LZ已经把长短连接说的差不多了,接下来说说长短轮询,今天也正是为了研究长短轮询,LZ才顺便研究了下长短连接这回事。

    短轮询相信大家都不难理解,比如你现在要做一个电商中商品详情的页面,这个详情界面中有一个字段是库存量(相信这个大家都不陌生,随便打开淘宝或者京东都能找到这种页面)。而这个库存量需要实时的变化,保持和服务器里实际的库存一致。

    这个时候,你会怎么做?

    最简单的一种方式,就是你用JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询。

    这种方式有明显的坏处,那就是你很浪费服务器和客户端的资源。客户端还好点,现在PC机配置高了,你不停的请求还不至于把用户的电脑整死,但是服务器就很蛋疼了。如果有1000个人停留在某个商品详情页面,那就是说会有1000个客户端不停的去请求服务器获取库存量,这显然是不合理的。

    那怎么办呢?

    长轮询这个时候就出现了,其实长轮询和短轮询最大的区别是,短轮询去服务端查询的时候,不管库存量有没有变化,服务器就立即返回结果了。而长轮询则不是,在长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒)。在这个时间里,服务器会去检测库存量有没有变化,检测到变化就立即返回,否则就一直等到超时为止。

    而对于客户端来说,不管是长轮询还是短轮询,客户端的动作都是一样的,就是不停的去请求,不同的是服务端,短轮询情况下服务端每次请求不管有没有变化都会立即返回结果,而长轮询情况下,如果有变化才会立即返回结果,而没有变化的话,则不会再立即给客户端返回结果,直到超时为止。

    这样一来,客户端的请求次数将会大量减少(这也就意味着节省了网络流量,毕竟每次发请求,都会占用客户端的上传流量和服务端的下载流量),而且也解决了服务端一直疲于接受请求的窘境。

    但是长轮询也是有坏处的,因为把请求挂起同样会导致资源的浪费,假设还是1000个人停留在某个商品详情页面,那就很有可能服务器这边挂着1000个线程,在不停检测库存量,这依然是有问题的。

    因此,从这里可以看出,不管是长轮询还是短轮询,都不太适用于客户端数量太多的情况,因为每个服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满。之所以举这个例子,只是因为大家肯定都会网购,所以这个例子比较通俗一点。

    哪怕轮询解决不了获取库存这个问题,但只要大家明白了长短轮询的区别,这就足够了。实际上,据LZ自己平日里购物的观察,那个库存量应该是不会变的,这个例子纯属LZ个人的意淫,-_-。

    长短轮询和长短连接的区别

    这里简单说一下它们的区别,LZ这里只说最根本的区别。

    第一个区别是决定的方式,一个TCP连接是否为长连接,是通过设置HTTP的Connection Header来决定的,而且是需要两边都设置才有效。而一种轮询方式是否为长轮询,是根据服务端的处理方式来决定的,与客户端没有关系。

    第二个区别就是实现的方式,连接的长短是通过协议来规定和实现的。而轮询的长短,是服务器通过编程的方式手动挂起请求来实现的.

    展开全文
  • 长连接和心跳 1 概念 2 优缺点 3 长连接的生命周期 4 使用场景 5 心跳 三 短连接 1 概念 2 优缺点 3 使用场景 四 长连接和短连接的选择 1 长连接:高频、服务端主动推送和有状态 2 短连接使用场景:...

    目录

    前言

    一 TCP连接

    二 长连接和心跳

    1 概念

    2 优缺点

    3 长连接的生命周期

    4 使用场景

    5 心跳

    三 短连接

    1 概念

    2 优缺点

    3 使用场景

    四 长连接和短连接的选择

    1 长连接:高频、服务端主动推送和有状态

    2 短连接使用场景:低频、无状态

    五 参考博客


    前言

    两个进程之间如果要通信,很显然必须要建立一个连接,通过它来相互传输数据。在网络通信过程中,主机与主机之前一般情况下是通过通过TCP协议进行连接的,既然是连接,那么就会有连接时间的长短,长时间的连接称之为长连接,短时间的连接称之为短连接,在长连接的过程中,由于是长时间连接,所以对于服务器来说,需要去判断连接进来的客户端是不是还在连接的过程中,这里就涉及到心跳的问题。就像人的心跳一样,每跳动一次,就发出一个消息,看看能不能得到回应,如果能得到回应,说明客户端还在连接的过程中,如果得不到回应,在一定的心跳次数下依然得不到回应,就判断长连接断开了。

    因此本文的主题就是:长连接和心跳、短连接

    关键词:TCP连接、短连接、长连接和心跳

    一 TCP连接

    首先要明确一点,不管是长连接还是短连接都是在TCP连接的过程中发生的,也就是发生在网络的传输层上面。

    简单来说,当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。

    关于TCP连接过程中,在确认连接的时候涉及到“三次握手”和“四次挥手的过程”,具体的相关原理参考下面的博客:

    博客标题:深入理解TCP、UDP协议及两者的区别

    博客链接:https://blog.csdn.net/weixin_37766087/article/details/100045797

    二 长连接和心跳

    1 概念

    长连接是指在通信过程中,两台主机可以多次传输数据,但是只连接一次,做到连接的复用。一次数据传输后,不关闭连接,长期保持连通状态。如果两个应用程序之间有新的数据需要传输,则直接复用这个连接,无需再建立一个新的连接。示意图如下:

                                            

    2 优缺点

    优点:

    (1)省时间:在多次通信中可以避免进行多次连接,从而节省了连接建立和关闭连接的开销,并且从总体上来看,进行多次数据传输的总耗时更少,减少网络阻塞的影响。

    (2)当发生错误时,可以在不关闭连接的情况下进行提示,

    (3)节约资源:减少CPU及内存的使用,因为不需要经常的建立及关闭连接。

    缺点:

    (1)连接数过多时,影响服务端的性能和并发数量。

    (2)我们就需要担心各种问题:比如端对端连接的维护,连接的保活等。需要花费额外的精力来保持这个连接一直是可用的,因为网络抖动、服务器故障等都会导致这个连接不可用,甚至是由于防火墙的原因。

    3 长连接的生命周期

    正常情况下一直存在。正常情况下,一条TCP长连接建立后,只要双方不提出关闭请求并且不出现异常情况,这条连接是一直存在的.操作系统不会自动去关闭它,甚至经过物理网络拓扑的改变之后仍然可以使用。所以一条连接保持几天、几个月、几年或者更长时间都有可能,只要不出现异常情况或由用户(应用层)主动关闭。客户端和服务端可一直使用该连接进行数据通信。

    4 使用场景

    高频请求的场景。

    (1)数据库的连接就是采用TCP长连接.

    (2)RPC,远程服务调用,在服务器,一个服务进程频繁调用另一个服务进程,可使用长连接,减少连接花费的时间。

    5 心跳

    将长连接和心跳一起介绍是因为心跳就是为长连接而设计的,既然是长连接,为了防止连接断开或者说判断连接是否依然存在,就需要有一种机制来进行判断,这种机制就是心跳机制(HeartBeat)。

    心跳:就像人的心跳一样,人的心跳是用来续命的,通信中的心跳是用来检测一个系统是否存活或者网络链路是否通畅的一种方式,其一般做法是定时向被检测系统发送心跳包,被检测系统收到心跳包进行回复,收到回复说明对方存活。心跳能够给长连接提供保活功能,能够检测长连接是否正常(这里所说的保活一方面可以理解为维持长连接,另一方面来说是一旦链路死了,不可用了,能够尽快知道,然后做些其他的高可用措施,来保证系统的正常运行)。

    心跳包机制

    心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包
    在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
    心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
    其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接保活。
    在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
    总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

    心跳检测步骤:
    1 客户端每隔一个时间间隔发生一个探测包给服务器
    2 客户端发包时启动一个超时定时器
    3 服务器端接收到检测包,应该回应一个包
    4 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
    5 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

    三 短连接

    1 概念

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

                               

    2 优缺点

    优点:

    (1)管理简单,不需要操心连接状态的管理。

    (2)由于每次使用的连接都是新建的,所以基本上只要能够建立连接,数据就大概率能送达到对方。并且哪怕这次传输出现异常也不用担心影响后续新的数据传输,因为届时又是一个新的连接。

    缺点:

    (1)频繁的连接就会浪费时间:每个连接都需要经过三次握手和四次握手的过程,耗时大大增加。

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

    3 使用场景

    并发量大,请求频率低的场景:通常浏览器访问服务器的时候就是短连接。对于服务端来说,长连接会耗费服务端的资源,而且用户用浏览器访问服务端相对而言不是很频繁的如果有几十万,上百万的连接,服务端的压力会非常大,甚至会崩溃。所以对于并发量大,请求频率低的,建议使用短连接。

     

    四 长连接和短连接的选择

    1 长连接:高频、服务端主动推送和有状态

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

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

    2 短连接使用场景:低频、无状态

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

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

    五 参考博客

    参考博客1:长连接和短连接详细解析

    原文链接:https://cloud.tencent.com/developer/article/1470024

    参考博客2:聊聊 TCP 长连接和心跳那些事

    原文链接:http://blog.itpub.net/31556476/viewspace-2375225/

    参考博客3:长连接和心跳的那些事儿

    原文链接:https://www.jianshu.com/p/c6af08f853d0

    参考博客4:长连接、短连接、心跳机制与断线重连

    原文链接:https://www.cnblogs.com/superfj/p/9153776.html

    展开全文
  • 最近,公司在做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的长连接和websocket的长连接

    千次阅读 2019-07-31 18:37:12
    关于Keep-alive的缺点 Keep-alive的确可以实现长连接,但是这个长连接是有问题的,本质上依然是客户端主动发起-服务端应答的模式,是没法做到服务端主动发送通知给客户端的。也就是说,在一个HTTP连接中,客户端...
  • java socket长连接客户端服务端(标准实例),准确无误,流行结构。
  • nginx长连接——keepalive

    千次阅读 2021-02-07 09:33:54
    当使用nginx作为反向代理时,为了支持长连接,需要做到两点: 从client到nginx的连接是长连接 从nginx到server的连接是长连接 1、保持和client的长连接: 默认情况下,nginx已经自动开启了对client连接的keep ...
  • 长连接及Java Socket实现

    千次阅读 2020-07-29 19:39:43
    Socket默认是不关闭的,除非手动关闭,建立连接的两端可互相发送信息,连接的长短主要针对的是连接的时间,长时间不关闭的连接即长连接,短连接即建立连接的两端在发送一次或几次数据后很快关闭Socket的连接。
  • 断开连接则需要四次握手(客户端和服务端都可以发起,FIN-ACK-FIN-ACK)。 1、为什么连接的时候是三次握手,关闭的时候却是四次握手? 答:       因为当...
  • Nginx 配置长连接

    千次阅读 2020-06-29 16:02:41
    对于客户端而言,Nginx是服务器,对于后端服务器而言,Nginx是客户端。 一、配置客户端到nginx的长连接 二、配置nginx到后端服务器的长连接
  • socket长连接

    热门讨论 2014-11-17 10:35:10
    简单的demo用于客户端与服务端通过socket建立长连接,服务器和客户端相互发送消息以及接受消息
  • C# socket异步长连接

    热门讨论 2011-07-28 15:59:09
    服务端监听接收端口,以等待建立连接。 客户端向服务端发送连接请求,得到允许后,建立连接。 客户端发送的所有数据都是通过同一条连接
  • 现在一款成熟的app一般都会具备长连接推送功能,那么我们要想项目具备长连接的功能现在又两种选择的方案,一种基于原生tcp协议的socket长连接,另外一种基于ws协议的websocket的长连接,今天我们演示两种socket...
  • netty实现 http 长连接

    千次阅读 2019-07-07 16:55:51
    最近接手项目上需要用到一个http服务。服务每次执行时间过长,所以请求的方式是异步轮询的方式调用服务。项目以前的同事在实现这个项目的时候采用的是单独开启一个线程,使用...并且手动实现了基于netty的长连接http...
  • Websocket如何实现长连接

    千次阅读 2019-12-02 11:30:25
    实现长连接 由于websocket连接成功过段时间自动关闭,无法继续获取消息 于是我就想到一个办法,就是自动关闭时再重新创建一次(因为自动关闭也不是很快就关闭的,所以我就这么写),虽然实现方式不是很好,但是也...
  • 整体思路:由于A和B的响应时间都比较长,先发请求B,然后发请求A,长连接请求流程:先new一个session对象,建立链接,然后不断请求获取长连接返回数据。 最终代码实现: def A(environment,cf,token): ...
  • 类库的主要功能是提供了基于网络传输层的长连接消息推送,包含服务端和客户端开发包,应用系统可以使用此类库,开发消息推送服务的程序;同时可以在JDK1.6以上的环境中编译使用,包括安卓操作系统。
  • 页面实现长连接

    千次阅读 2018-01-29 22:59:10
    长连接、长轮询:都是通过不断的向服务器发出请求,如果服务器有数据则马上返回,如果没有数据就会hold住请求,等到有数据的时候就推送给页面。 通常的做法是,在服务器的程序中加入一个死循环,在循环中监测数据的...
  • android长连接的所有方式及分析

    千次阅读 2019-02-17 20:42:30
    文章目录实现长连接的方式方案优缺点比较push原理及实现主流app常用方案:1. 使用第三方的长连接服务2. 使用NIO等方案实现长连接服务3. 使用MINA等第三方框架实现长连接4.websocket实现及才坑记录 实现长连接的方式...
  • 大多数人都知道HTTP1.0不支持长连接,知道HTTP1.1支持长连接。 这是业界的一个常识。 然而这样的描述导致了一些不做网络底层开发的开发者都下意识的认为HTTP1.1是一个可以建立长连接的的协议。 小弟之前也是如此认为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,856,796
精华内容 742,718
关键字:

长连接

友情链接: Visual Basic .Net.rar