长连接短连接长短连接争长短

其实还是这个老问题:

记一次文件下载丢包填坑之旅 http://www.cnblogs.com/syjkfind/p/5281677.html

即使现在只有haproxy-nginx-磁盘文件 比较少的转发,但文件特别大,还是偶有文件不完整的问题。

从现象上看,浏览器响应是200没问题,curl命令的日志显示是 curl: (18) transfer closed with 204800 bytes remaining to read

字面上理解就是连接已关闭。查相关资料并没有任何有关的答案,说nginx缓冲大小的现象不一样已排除,倒是偶有提到连接关闭。

百思不得其解,直到跟运维同事要到haproxy的配置看了好几遍。。。一个关键字引起了我的注意:http-server-close

【http-server-close】

相关配置参考资料 http://www.cnblogs.com/dkblog/archive/2012/03/13/2393321.html

大意就是haproxy和浏览器保持长连接,但haproxy跟后端服务器采用短连接。

什么是长连接参考资料 http://www.cnblogs.com/cswuyg/p/3653263.html

那么究竟是长连接好还是短连接好?其实要看具体场景。长连接可以节省反复连接的开销,加快响应;短连接则可以加快连接的释放,提高并发的能力。

于是改成了http-pretend-keepalive,好像发生少了很多,再后来使用gzip传输就很少再发生了。当然,偶尔再有发生也是网速的问题,无解了,总不能无限制地加大timeout吧。

再有就是顺带提起的haproxy该用7层http还是3层tcp,大部分资料都是讲http,这里有提到当https转发时得用tcp模式。http://serverfault.com/questions/611272/haproxy-http-vs-tcp

【断点续传】

改成http-pretend-keepalive后,有趣的事情发生了,浏览器得到的响应居然是206,也就是说,长连接的情况下,可以支持断点续传~~~

【开启gzip传输】

nginx本来就是开启支持gzip传输的,可是没生效啊,为什么呢?其实原因很简单,就是响应类型不对。开启支持gzip的格式是plain text和html,但默认类型是application/octet-stream。只要给返回的文件设置类型为text/plain就可以了。开启gzip和设置Content-Type的配置就不多说了。

开启gzip当然是爽到爆了,原来20MB的文本文件传输起来只有1.5MB!当然也有点小问题就是传输编码是chunked,无法知道文件的总大小,无法知道文件是否完整。但是在节省了92%带宽的情况下,都没再听用户提起过传输不成功了。

顺带,验证了一个问题,nginx设置限速,然后下载到一半把浏览器停掉,得到的文件是乱码的,说明gzip是整个文件压缩而不是每片去压缩,残缺的文件改为.zip后解压出来得到的文件则是正确的文本而内容少了后面部分。

再反思整个过程,其实有几分碰运气歪打正着的感觉,如果在haproxy层和nginx层有比较好的抓包或监控,问题可以定位得更快速更精确(然而是生产环境,你懂的)。再有就是网络链路这种东西就是个幽灵,如何重现也是个难题。幸得,各种查阅资料以及对着日志对着配置各种“格物致知”,终于在“大胆假设小心求证”中找到了出路。

至此,问题也算是相对圆满地解决了。

时间: 2024-10-10 18:05:00

长连接短连接长短连接争长短的相关文章

JAVA 网络长短连接

   作为java的初学者,看了网上的资料后,关于java的长短连接,感觉理解的不是很深刻,结合自己的学习和网上的资料整理如下,不正确之处请大家批评指正.                 其实作为java语言本身而言,能够提供给我们使用的最终的网络接口实际也就是java的Socket API,除此外别无他物. 所以我们经常提到的HTTP和Netty 长短连接实际都是针对的java Socket而言的,大家都学过网络的7层模型,但是在JAVA中7层模型显的过于的复杂,大多数的层,我们无法直接感知.

HTTP的长短连接、长短轮询的区别(转载)

引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HTTP的长长短短. 了解的方式主要都是LZ在网络上获取的,这里只是谈一下LZ对于这四种叫法最直观的理解.如果你之前不懂的话,可以帮你普及一下,如果你之前就懂得话,可以互相对照一下. 以前的误解 很久之前LZ就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默

长连接&短连接分析

转自:http://www.cnblogs.com/heyonggang/p/3660600.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接 我们模拟一下TCP短连接的情况,client向

http 长连接 & 短连接

1.意义 同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法. 2.优 较少的CPU和内存的使用 允许请求和应答的HTTP pipelining 降低网络阻塞 减少了后续请求的延迟(无需再进行握手) 报告错误无需关闭TCP连接 3.缺 空闲的连接需要过段时间后才能被断开,可能影响整体性能(比如那些单次访问次数多的web 服务) http 长连接 & 短连接

TCP报文结构和长短连接

参考博文: https://www.cnblogs.com/onlysun/p/4520553.html https://blog.csdn.net/zxy987872674/article/details/52653101 一.报文结构介绍 在开始讲TCP连接过程时,还是先看看TCP报文的格式如图1所示.IP数据报此时由IP头部+TCP头部+TCP数据组成.不带选项的TCP头部是20字节长,而带选项的,TCP头部最长可达60字节.常见的选项包括最大的大小(MSS),时间戳(传输控制时使用).窗

如何管理代理服务器的长短连接

一.http连接的常见流程 浏览器解析出主机名 浏览器查询这个主机名的IP地址(DNS) 浏览器获得服务端端口 浏览器发起请求到到服务器 浏览器向服务器发送一条HTTP GET报文 浏览器从服务器读取HTTP响应报文 浏览器关闭连接 二.从TCP编程看HTTP请求处理过程 1.服务端:创建套接字(socket):将套接字绑定到端口上(bind):允许套接字进行连接(listen):等待连接(accept) 2.客户端:获取服务端ip地址和端口号:创建套接字(socket):连接到服务器ip:po

“ping”命令的原理就是向对方主机发送UDP数据包,HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”

Socket  是一套建立在TCP/IP协议上的接口不是一个协议 应用层:  HTTP  FTP  SMTP  Web 传输层:  在两个应用程序之间提供了逻辑而不是物理的通信(TCP  UDP) TCP  可靠的  面向连接的服务 UDP  不可靠的  无连接的服务 只要底层实现TCP IP协议  都可以用socket进行通信 1.TCP和UDP 1.1 TCP连接 TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往

ADO.NET基础巩固-----连接类和非连接类

      最近的一段时间自己的状态还是不错的,早上,跑步,上自习看书,下午宿舍里面编程实战,晚上要么练习代码,要么去打球(在不打就没机会了),生活还是挺丰富的. 关于C#的基础回顾就先到前面哪里,这些要自己在工作中慢慢的去体会,不是说看书就可以掌握的.我们都是从学生时代过来的知道每个人的学习情况是不一样的,所以找到自己的学习节奏是最好不过的. 下面是关于访问数据库[ADO.NET]的学习,之前刚开始学习的时候把这些基本的都过了一遍,但是长时间不使用,一些基本的用法还是会遗忘的.     一:关

Tcp连接出现大量ESTABLISHED连接解决方法

TCP状态转移要点TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源.在众多TCP状态中,最值得 注意的状态有两个:CLOSE_WAIT和TIME_WAIT. 1.LISTENING状态FTP服务启动后首先处于侦听(LISTENING)状态. 2.ESTABLISHED状态ESTABLI