精华内容
参与话题
问答
  • 长连接

    千次阅读 2016-07-21 16:24:35
    一、什么是长连接  HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;...

    一、什么是长连接

         HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。

     HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展,当前的HTTP1.1 RFC2616文档没有对它做说明,因为它所需要的功能已经默认开启,无须带着它,但是实践中可以发现,浏览器的报文请求都会带上它。如果HTTP1.1版本的HTTP请求报文不希望使用长连接,则要在HTTP请求报文首部加上Connection: close。《HTTP权威指南》提到,有部分古老的HTTP1.0 代理不理解Keep-alive,而导致长连接失效:客户端-->代理-->服务端,客户端带有Keep-alive,而代理不认识,于是将报文原封不动转给了服务端,服务端响应了Keep-alive,也被代理转发给了客户端,于是保持了“客户端-->代理”连接和“代理-->服务端”连接不关闭,但是,当客户端第发送第二次请求时,代理会认为当前连接不会有请求了,于是忽略了它,长连接失效。书上也介绍了解决方案:当发现HTTP版本为1.0时,就忽略Keep-alive,客户端就知道当前不该使用长连接。其实,在实际使用中不需要考虑这么多,很多时候代理是我们自己控制的,如Nginx代理,代理服务器有长连接处理逻辑,服务端无需做patch处理,常见的是客户端跟Nginx代理服务器使用HTTP1.1协议&长连接,而Nginx代理服务器跟后端服务器使用HTTP1.0协议&短连接。

        在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来,譬如我自己写的HTTP客户端多线程去下载文件,就可以不遵循这个标准,并发的或者连续的多次GET请求,都分开在多个TCP通道中,每一条TCP通道,只有一次GET,GET完之后,立即有TCP关闭的四次握手,这样写代码更简单,这时候虽然HTTP头有Connection: Keep-alive,但不能说是长连接。正常情况下客户端浏览器、web服务端都有实现这个标准,因为它们的文件又小又多,保持长连接减少重新开TCP连接的开销很有价值。

         以前使用libcurl做的上传/下载,就是短连接,抓包可以看到:1、每一条TCP通道只有一个POST;2、在数据传输完毕可以看到四次握手包。只要不调用curl_easy_cleanup,curl的handle就可能一直有效,可复用。这里说可能,因为连接是双方的,如果服务器那边关掉了,那么我客户端这边保留着也不能实现长连接。    
        如果是使用windows的WinHTTP库,则在POST/GET数据的时候,虽然我关闭了句柄,但这时候TCP连接并不会立即关闭,而是等一小会儿,这时候是WinHTTP库底层支持了跟Keep-alive所需要的功能:即便没有Keep-alive,WinHTTP库也可能会加上这种TCP通道复用的功能,而其它的网络库像libcurl则不会这么做。以前观察过WinHTTP库不会及时断开TCP连接

    二、长连接的过期时间

        客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间,譬如:
     
         上图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。

    三、长连接的数据传输完成识别

        使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。更细节的介绍可以看这篇文章

    四、并发连接数的数量限制

        在web开发中需要关注浏览器并发连接的数量,RFC文档说,客户端与服务器最多就连上两通道,但服务器、个人客户端要不要这么做就随人意了,有些服务器就限制同时只能有1个TCP连接,导致客户端的多线程下载(客户端跟服务器连上多条TCP通道同时拉取数据)发挥不了威力,有些服务器则没有限制。浏览器客户端就比较规矩,知乎这里有分析,限制了同域名下能启动若干个并发的TCP连接去下载资源。并发数量的限制也跟长连接有关联,打开一个网页,很多个资源的下载可能就只被放到了少数的几条TCP连接里,这就是TCP通道复用(长连接)。如果并发连接数少,意味着网页上所有资源下载完需要更长的时间(用户感觉页面打开卡了);并发数多了,服务器可能会产生更高的资源消耗峰值。浏览器只对同域名下的并发连接做了限制,也就意味着,web开发者可以把资源放到不同域名下,同时也把这些资源放到不同的机器上,这样就完美解决了。

    五、容易混淆的概念——TCP的keep alive和HTTP的Keep-alive

        TCP的keep alive是检查当前TCP连接是否活着;HTTP的Keep-alive是要让一个TCP连接活久点。它们是不同层次的概念。
        TCP keep alive的表现:
        当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。
    这个“一段时间”可以设置。
    WinHttp库的设置

    WINHTTP_OPTION_WEB_SOCKET_KEEPALIVE_INTERVAL
    Sets the interval, in milliseconds, to send a keep-alive packet over the connection. The default interval is 30000 (30 seconds). The minimum interval is 15000 (15 seconds). Using WinHttpSetOption to set a value lower than 15000 will return with ERROR_INVALID_PARAMETER.

    libcurl的设置
    http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
    CURLOPT_TCP_KEEPALIVE
    Pass a long. If set to 1, TCP keepalive probes will be sent. The delay and frequency of these probes can be controlled by the CURLOPT_TCP_KEEPIDLE and CURLOPT_TCP_KEEPINTVL options, provided the operating system supports them. Set to 0 (default behavior) to disable keepalive probes (Added in 7.25.0).
    CURLOPT_TCP_KEEPIDLE
    Pass a long. Sets the delay, in seconds, that the operating system will wait while the connection is idle before sending keepalive probes. Not all operating systems support this option. (Added in 7.25.0)
    CURLOPT_TCP_KEEPINTVL
    Pass a long. Sets the interval, in seconds, that the operating system will wait between sending keepalive probes. Not all operating systems support this option. (Added in 7.25.0)
         CURLOPT_TCP_KEEPIDLE是空闲多久发送一个心跳包,CURLOPT_TCP_KEEPINTVL是心跳包间隔多久发一个。 
    打开网页抓包,发送心跳包和关闭连接如下:
     
        从上图可以看到,大概过了44秒,客户端发出了心跳包,服务器及时回应,本TCP连接继续保持。到了空闲60秒的时候,服务器主动发起FIN包,断开连接。

    六、HTTP 流水线技术

        使用了HTTP长连接(HTTP persistent connection )之后的好处,包括可以使用HTTP 流水线技术(HTTP pipelining,也有翻译为管道化连接),它是指,在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起。从wiki上了解到这个技术目前并没有广泛使用,使用这个技术必须要求客户端和服务器端都能支持,目前有部分浏览器完全支持,而服务端的支持仅需要:按HTTP请求顺序正确返回Response(也就是请求&响应采用FIFO模式),wiki里也特地指出,只要服务器能够正确处理使用HTTP pipelinning的客户端请求,那么服务器就算是支持了HTTP pipelining。
        由于要求服务端返回响应数据的顺序必须跟客户端请求时的顺序一致,这样也就是要求FIFO,这容易导致Head-of-line blocking:第一个请求的响应发送影响到了后边的请求,因为这个原因导致HTTP流水线技术对性能的提升并不明显(wiki提到,这个问题会在HTTP2.0中解决)。另外,使用这个技术的还必须是幂等的HTTP方法,因为客户端无法得知当前已经处理到什么地步,重试后可能发生不可预测的结果。POST方法不是幂等的:同样的报文,第一次POST跟第二次POST在服务端的表现可能会不一样。
        在HTTP长连接的wiki中提到了HTTP1.1的流水线技术对RFC规定一个用户最多两个连接的指导意义:流水线技术实现好了,那么多连接并不能提升性能。我也觉得如此,并发已经在单个连接中实现了,多连接就没啥必要,除非瓶颈在于单个连接上的资源限制迫使不得不多开连接抢资源。
        目前浏览器并不太重视这个技术,毕竟性能提升有限。
    展开全文
  • 长连接与短连接含义

    千次阅读 2020-08-27 21:44:21
    长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就...

    长连接与短连接

    所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。

    短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。  

    比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。

    其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

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

    千次下载 热门讨论 2014-09-21 11:32:43
    Java实现Socket长连接和短连接,实现原理可参见个人博客
  • HTTP 长连接

    千次阅读 2020-03-05 15:25:05
    先理解下长连接和短链接短连接: 短连接就是每次请求一个资源就建立连接,请求完成后连接立马关闭。每次请求都经过“创建tcp连接->请求资源->响应资源->释放连接”这样的过程长连接: 长连接(persistent ...

    先理解下长连接和短链接
    短连接:
        短连接就是每次请求一个资源就建立连接,请求完成后连接立马关闭。每次请求都经过“创建tcp连接->请求资源->响应资源->释放连接”这样的过程
    长连接:
        长连接(persistent connection),就是只建立一次连接,多次资源请求都复用该连接,完成后关闭。要请求一个页面上的十张图,只需要建立一次tcp连接,然后依次请求十张图,等待资源响应,释放连接。
    client发出的HTTP请求头需要增加connection:keep-Alive字段。
    web-service端需要能识别到connection:keep-alice字段,并且在http的response里指定connection:keep-Alive字段,告诉client我们提供keep-alive服务,允许client暂时别关闭socket链接。
    http 1.0版本中要实现长连接必须在http请求头显示指定Connection:keep-alive
    http 1.1版本中默认开始了keep-alive。 需要关闭keep-vlive的话在请求头指定connection:close
    现在大多数浏览器都支持HTTP 1.1协议,所以keep-alive都是默认打开的,一旦client和server达成一致长连接就建立好了。

    以NGINX 为例:
    keepalive_timeout #一个HTTP产生的TCP链接在传送完最后一个响应后还需要等待 keepalive_timeout 设置的秒后才关闭这个链接。默认是75秒,有些浏览器默认是60秒,所以可以设置为60,如果设置成0的话就关闭了keep-aliveNGINX做反向代理的时候upstream长连接配置:
     

    http{
    
        upstream test_keepalive{
        server 127.0.0.1:5002;
        keepalive 4; #最多保留的长连接,如果超过这个数,会根据LRU算法关闭多余的链接。这个参数不会限制worker跟upstream的连接数。
    }
        keepalive_timeout 60; #设置链接保持的时间
        keepalive_requests 100;  #每个长连接能处理的请求次数,超过后会被close。定期关闭对清理每个链接占用的内存是非常有必要的。否则链接只能用的内存会越来越多。
    
    location {
         proxy_http_version 1.1;   #location配置里主要是修改HTTP版本为1.1、并且把NGINX的默认传递给upstream connection:close 的行为去掉。http_version需要制定用1.1 
         proxy_set_header connection "";# 这样就嫩完成NGINX转发给upstream的长连接配置。
        
    }
    }
    

     

    展开全文
  • 移动端长连接

    千次阅读 2017-03-18 23:41:14
    1、什么是长连接先说短连接, 短连接是通讯双方有数据交互时就建立一个TCP连接, 数据发送完成后,则断开此连接(建立连接需三次握手,断开连接需四次挥手)。长连接就是大家建立TCP连接之后, 不主动断开。 双方互相...

    1、什么是长连接

    先说短连接, 短连接是通讯双方有数据交互时就建立一个TCP连接, 数据发送完成后,则断开此连接(建立连接需三次握手,断开连接需四次挥手)。

    长连接就是大家建立TCP连接之后, 不主动断开。 双方互相发送数据, 发完了也不主动断开连接, 之后有需要发送的数据就继续通过这个连接发送。TCP连接在默认的情况下就是所谓的长连接, 也就是说连接双方都不主动关闭连接, 这个连接就应该一直存在。

    2、移动客户端为什么要定时发送心跳包

    通过定期的数据包,对抗运营商的NAT(Network Address Translation,网络地址转换)超时。

    明确一点, TCP长连接本质上不需要心跳包来维持。大家可以试一试, 让两台电脑连上同一个wifi, 然后让其中一台做服务器, 另一台用一个普通的没有设置KeepAlive的Socket连上服务器, 只要两台电脑别断网, 路由器也别断电, DHCP正常续租, 就这么放着, 过几个小时再用其中一台电脑通过之前建立的TCP连接给另一台发消息, 另一台肯定能收到。

    对于移动设备,因为IPv4地址不足,当一台智能手机连上移动网络时,其实并没有真正连接上Internet,运营商分配给手机的IP其实是运营商的内网IP,手机终端要连接上Internet还必须通过运营商的网关进行IP地址的转换,这个网关简称为NAT(NetWork Address Translation),简单来说就是手机终端连接Internet 其实就是移动内网IP,端口,外网IP之间相互映射。相当于在手机终端在移动无线网络这堵墙上打个洞与外面的Internet相连。

    由于大部分的移动无线网络运营商为了减少网关NAT映射表的负荷,如
    一个链路有一段时间没有通信时就会删除其对应表,造成链路中断,正是这种刻意缩短空闲连接的释放超时,原本是想节省信道资源的作用,没想到让互联网的应用不得以远高于正常频率发送心跳来维护推送的长连接。

    以下是部分地区网络NAT 超时统计:
    这里写图片描述

    3、服务保活

    • 减少推送进程所占内存,Push Service单独一个进程;
    • 提升Service优先级,Android 的前台service机制(但该机制的缺陷是通知栏保留了图标)。
    • ConnectReceiver,BootReceiver,AlarmReceiver保活。特别是通过Alarm定期检查保活。
    • fork守护进程

    具体请参考:
    Android版微信后台保活实战分享(进程保活篇)
    移动端IM实践:实现Android版微信的智能心跳机制
    微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
    Android端消息推送总结:实现原理、心跳保活、遇到的问题等
    互联网推送服务原理:长连接+心跳机制(MQTT协议)

    展开全文
  • 关于 HTTP 长连接

    千次阅读 2019-09-15 23:57:13
    使用长连接能够减少建立销毁连接的消耗,三次握手、四次挥手对性能影响是很大的。一般 RPC 如 Dubbo 默认都是长连接的,HTTP 1.1 之上也可以支持长连接了,HTTP 2.0 也支持了单一长连接的多路复用。 一般 HTTP 服务...
  • 现在一款成熟的app一般都会具备长连接推送功能,那么我们要想项目具备长连接的功能现在又两种选择的方案,一种基于原生tcp协议的socket长连接,另外一种基于ws协议的websocket的长连接,今天我们演示两种socket...
  • websocket 长连接

    千次阅读 2018-06-14 18:37:27
    web socket 长连接
  • dubbo 长连接

    千次阅读 2018-05-30 14:18:35
    Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及 服务消费者机器数远大于服务提供者机器数的情况。 反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,...
  • HTTP长连接

    千次阅读 2018-09-22 10:15:20
    长连接的概念 HTTP 的请求是在 TCP 连接的基础上发送的,而 TCP链接分为长连接和短连接 。 长连接:HTTP 发送请求时,要先创建一个 TCP 连接,并在 TCP 连接上把 HTTP 请求的内容发送并且接收完返回,这是一次请求...
  • 长连接长连接是相对于短连接来说的。长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。mysql的长连接如果长期闲置,mysql会8小时后(默认时间)主动断开...
  • 整体思路:由于A和B的响应时间都比较长,先发请求B,然后发请求A,长连接请求流程:先new一个session对象,建立链接,然后不断请求获取长连接返回数据。 最终代码实现: def A(environment,cf,token): ...
  • TCP长连接和短连接

    千次阅读 2018-07-26 16:53:14
    TCP长连接和短连接是什么 TCP短连接就是在三次握手和四次挥手之间客户端和服务器端只进行一次读写操作,一次读写完成双方都可以发起close请求,一般都是客户端先发起close操作。 TCP长连接就是在三次握手和四次...
  • mysql长连接与短连接

    千次阅读 2017-09-07 14:40:15
    什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。 通常的短连接操作步骤是: 连接-》数据传输-》关闭连接; 而长连接通常就是: 连接-》数据传输-...
  • nginx长连接

    千次阅读 2016-08-29 22:53:55
    nginx长连接很多参考教程都说设置nginx长连接是设置keepalive_timeout,往往忽视了keepalive_requests,nginx的keepalive_requests默认是100,一个长连接100次和短连接也差不多了。keepalive_timeout含义长连接有tcp...
  • tcp长连接和短连接

    千次阅读 2019-05-01 15:52:13
    tcp长连接和短连接 TCP在真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接, 连接的建立通过三次握手,释放则需要四次握手, 所以说每...
  • websocket 实现长连接原理

    万次阅读 多人点赞 2019-02-21 21:18:24
    一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个...
  • 关于长连接和短连接

    千次阅读 2014-12-26 09:12:55
    短连接  连接->传输数据->关闭连接  ...  也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。  ...长连接  ...长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 
  • curl 长连接

    千次阅读 2019-09-30 09:45:40
    curl 保持长连接关键代码, 连接生命周期与php-fpm生命周期一致。 因为工作中不仅涉及业务开发,也涉及服务稳定性和服务规划,所以经常面临一些问题,这个想法产生于一次性能profile。 在用xprof对服务进行性能...
  • HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上...
  • JAVA长连接与短连接

    千次阅读 2018-06-25 23:06:02
    最近在使用极光推送,听用过的同事讲了句:使用长连接,心跳机制等知识点,很是熟悉,但是又不能明确的说出其中的不同,所以这里总结下。 长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有...
  • HTTP长连接设置

    千次阅读 2019-09-15 13:40:29
    1. HTTP长连接是指在一个TCP长连接中发送和接收多个HTTP报文。 相应地,短连接则指发送一个HTTP请求后直接关闭TCP连接。 HTTP1.0默认使用短连接,可以在客户端HTTP报文头部添加Connection:Keep-alive启用长连接请求...
  • HTTP的长连接(持久连接)和短连接

    千次阅读 2018-04-24 11:48:22
    分享网络编程中涉及的长连接、短连接概念。  关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一、什么是长连接  HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输...
  • http的长连接和短连接

    千次阅读 2019-04-16 16:00:26
    但终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉。 今天通过一番研究,终于明白了这其中的奥秘。而之前,也看过长连接相关的内容,但一直都是云里雾里的。这次之所以能在这么短的时间里搞清楚,和自己...
  • HTTP长连接和短连接

    千次阅读 2017-04-04 16:54:44
    HTTP是工作在应用层的文本传输协议,它在底层的实现是基于TCP协议的,今天说的HTTP的长连接和短连接实质上是TCP的长连接和短连接。 TCP的长连接和短连接: TCP的连接 在客户端和服务器端之间进行数据传输时,...
  • 根据需求,需要使用nginx返回长连接和短连接响应。 配置思路 长连接: http { --------------------------- keepalive_requests 100000; //这里实际只需要大于1就可以 -------------------- } 短连接: http {...
  • HTTP长连接---requests的长连接

    万次阅读 2017-07-23 17:53:10
    使用HTTP协议时,为了充分利用资源,经常会用到http的长连接,也就是底层tcp连接的复用。 在requests库中,HTTP的长连接是通过Session会话实现的。 会话对象让你能够跨请求保持某些参数。它也会在同一个 Session ...
  • HTTPclient保持长连接

    千次阅读 2019-07-03 21:05:21
    首先解释一下什么是长连接,当我们向一台服务器发起请求时,我们需要和对方建立一条通道,去传输数据,所谓的短连接,就是说我们建立起了通道,然后在传输完数据,就把通道摧毁,下次需要的时候再重新去建立通道。...

空空如也

1 2 3 4 5 ... 20
收藏数 50,353
精华内容 20,141
关键字:

长连接