`

关于HTTP长连接

    博客分类:
  • Web
阅读更多
一、HTTP是无状态的
也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话

HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

如果浏览器或者服务器在其头信息加入了这行代码

Connection:keep-alive

TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。

二、实现长连接要客户端和服务端都支持长连接。

如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小

无论客户端浏览器 (Internet Explorer) 还是 Web 服务器具有较低的 KeepAlive 值,它都将是限制因素。例如,如果客户端的超时值是两分钟,而 Web 服务器的超时值是一分钟,则最大超时值是一分钟。客户端或服务器都可以是限制因素

在header中加入 --Connection:keep-alive
在HTTp协议请求和响应中加入这条就能维持长连接。
再封装HTTP消息数据体的消息应用就显的非常简单易用

Http Keep-Alive seems to be massively misunderstood. Here's a short description of how it works, under both 1.0 and 1.1

HTTP/1.0
Under HTTP 1.0, there is no official specification for how keepalive operates. It was, in essence, tacked on to an existing protocol. If the browser supports keep-alive, it adds an additional header to the request:

Connection: Keep-Alive

Then, when the server receives this request and generates a response, it also adds a header to the response:

Connection: Keep-Alive

Following this, the connection is NOT dropped, but is instead kept open. When the client sends another request, it uses the same connection. This will continue until either the client or the server decides that the conversation is over, and one of them drops the connection.

HTTP/1.1
Under HTTP 1.1, the official keepalive method is different. All connections are kept alive, unless stated otherwise with the following header:

Connection: close

The Connection: Keep-Alive header no longer has any meaning because of this.

Additionally, an optional Keep-Alive: header is described, but is so underspecified as to be meaningless. Avoid it.

Not reliable
HTTP is a stateless protocol - this means that every request is independent of every other. Keep alive doesn’t change that. Additionally, there is no guarantee that the client or the server will keep the connection open. Even in 1.1, all that is promised is that you will probably get a notice that the connection is being closed. So keepalive is something you should not write your application to rely upon.

KeepAlive and POST
The HTTP 1.1 spec states that following the body of a POST, there are to be no additional characters. It also states that "certain" browsers may not follow this spec, putting a CRLF after the body of the POST. Mmm-hmm. As near as I can tell, most browsers follow a POSTed body with a CRLF. There are two ways of dealing with this: Disallow keepalive in the context of a POST request, or ignore CRLF on a line by itself. Most servers deal with this in the latter way, but there's no way to know how a server will handle it without testing.


Java应用

client用apache的commons-httpclient来执行method 。
用 method.setRequestHeader("Connection" , "Keep-Alive" or "close") 来控制是否保持连接。

常用的apache、resin、tomcat等都有相关的配置是否支持keep-alive。

tomcat中可以设置:maxKeepAliveRequests

The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. Setting this attribute to 1 will disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 will allow an unlimited amount of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.

解释1

所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,  
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接

解释2

长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。  
而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。


解释3

长连接和短连接这个概念好像只有移动的CMPP协议中提到了,其他的地方没有看到过。  
通信方式  
各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包 发送,需要双方发检测包以维持此连接。短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只 完成一对 CMPP消息的发送。  
现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。


解释4

短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。  
长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。
最近在看“服务器推送技术”,在B/S结构中,通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息(比如股票价格),这样可 以节省大量的带宽。      传统的轮询技术对服务器的压力很大,并且造成带宽的极大浪费。如果改用ajax轮询,可以降低带宽的负荷(因为服务器返回的不是完整页面),但是对服务器 的压力并不会有明显的减少。     而推技术(push)可以改善这种情况。但因为HTTP连接的特性(短暂,必须由客户端发起),使得推技术的实现比较困难,常见的做法是通过延长http 连接的寿命,来实现push。     接下来自然该讨论如何延长http连接的寿命,最简单的自然是死循环法:
【servlet代码片段】   
public void doGet(Request req, Response res) {
	PrintWriter out = res.getWriter();//正常输出页面
	out.flush();
	while (true) {
		out.print("输出更新的内容");
		out.flush();
		Thread.sleep(3000);
	}     
}
      如果使用观察者模式则可以进一步提高性能。      但是这种做法的缺点在于客户端请求了这个servlet后,web服务器会开启一个线程执行servlet的代码,而servlet由迟迟不肯结束,造成 该线程也无法被释放。于是乎,一个客户端一个线程,当客户端数量增加时,服务器依然会承受很大的负担。      要从根本上改变这个现象比较复杂,目前的趋势是从web服务器内部入手,用nio(JDK 1.4提出的java.nio包)改写request/response的实现,再利用线程池增强服务器的资源利用率,从而解决这个问题,目前支持这一非 J2EE官方技术的服务器有Glassfish和Jetty(后者只是听说,没有用过)。
分享到:
评论

相关推荐

    聊天室(自己实现HTTP长连接)

    【描述】:这篇博客的文章链接指向了ITEYE上的一篇由作者“renxin-327666062-qq-com”分享的关于实现HTTP长连接的聊天室项目。在实际的网络应用中,HTTP长连接是解决实时通信问题的一种技术手段,它不同于HTTP短连接...

    CSharp HTTP长连接(Comet)

    在IT行业中,HTTP长连接(也称为Comet技术)是一种用于实现服务器向客户端实时推送数据的方法,常用于构建实时交互的应用,如聊天室、股票报价、在线游戏等。C#作为.NET框架的主要编程语言,提供了丰富的工具和技术...

    C#服务器推技术(http长连接)的应用实例

    2.不再定时不断请求Http请求,降低服务器资源消耗,可参考Taobao核心系统团队博客《http长连接200万尝试及调优》; 3.TX微博等很多应用均采用服务器推技术,你还在用Ajax? 网上关于服务器推技术的文章多,但关于.net...

    http长连接

    ### HTTP长连接详解 HTTP(Hypertext Transfer Protocol)作为互联网上应用最为广泛的一种网络协议,主要用于从万维网服务器传输超文本到本地浏览器的传输协议。然而,传统的HTTP通信方式采用短连接模式,即每次...

    http保持长连接,服务端主动发消息例子(isapi)

    最近一直在研究HTTP长连接问题,发现资料很少,本人研究后自己写的小例子,跟大家一起分享,共同进步吧。 该例子是用VC的isapi技术开发的HTTP服务端程序,实现与客户端建立长连接后主动给客户端发送消息。

    http长连接的实现,web端自动获取消息,不刷新页面

    在IT行业中,HTTP长连接(Persistent Connections)是一种优化网络通信的技术,它允许客户端和服务器在完成一次HTTP请求和响应后保持连接状态,而不是立即关闭。这样,在后续的交互中,数据传输无需重新建立连接,...

    Comet:基于 HTTP 长连接的“服务器推”技术

    Comet:基于 HTTP 长连接的“服务器推”技术

    打造支持上千万http长连接的应用

    淘宝http长连接技术,支持上千万http的技术架构

    \"打造支持上千万http长连接的应用\"分享总结

    在IT行业中,构建一个能支持上千万HTTP长连接的应用是一项技术挑战,这涉及到网络编程、服务器架构、性能优化等多个领域的专业知识。在这个分享总结中,我们将深入探讨如何实现这样的系统。 首先,HTTP长连接(Keep...

    构建高效的python requests长连接池详解

    本文将深入探讨如何构建高效的`requests`长连接池,这对于处理大量HTTP请求,尤其是涉及到频繁的API调用或者CDN刷新等场景时,能够显著提升性能和减少网络延迟。 首先,了解什么是长连接。在HTTP协议中,长连接...

    Java实现Socket长连接和短连接

    Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short Connection)** 短连接通常用于一次性、非持久性的通信,如HTTP协议就是典型的短连接。在短连接中...

    asp.net基于http的长连接项目

    通过学习和分析这些内容,你可以深入理解ASP.NET如何利用HTTP长连接来实现实时通信,以及如何构建聊天室或其他需要实时数据更新的应用。这将有助于提升你的ASP.NET编程技能,尤其是处理高并发、实时性需求的场景。

    Comet(Http长连接)

    **HTTP长连接原理** 在Comet技术中,HTTP连接被保持开放状态,直到有新的数据需要推送或者连接因为超时、网络问题等原因断开。主要有两种实现方式: 1. **HTTP流(HTTP Streaming)**:服务器在响应头中设置`...

    Android 实现WebSocket长连接

    Android 实现WebSocket长连接 最近项目中引入了实时接收服务器数据的功能,考量后通过WebSocket长链接来实现。 1、建立在 TCP 协议之上,服务器端的实现比较容易。 2、与 HTTP 协议有着良好的兼容性。默认端口也是80...

    HTTP长连接与短连接使用方法及测试详解

    HTTP长连接和短连接是HTTP协议中两种不同的通信方式,它们在互联网通信中扮演着重要角色,影响着网络资源的利用效率和响应速度。 HTTP短连接,也称为非持久连接,意味着每次HTTP请求/响应完成后,客户端和服务器就...

    微信小程序服务端接口支持普通Http请求上传文件长连接

    在这个场景中,我们关注的是微信小程序服务端接口对于普通Http请求、文件上传以及长连接的支持。以下是对这些知识点的详细解释: 1. **普通Http请求**:在Web开发中,HTTP(超文本传输协议)是最基础的通信协议,...

    TCP中长连接短连接

    本文将详细探讨TCP中的长连接和短连接,这两种连接方式在实际应用中的差异和选择。 长连接,也称为持久连接,指的是客户端(Client)与服务器端(Server)在完成连接建立后,保持连接状态不立即断开,以便于进行多...

    http长连接(服务器推)使用pushlet教程示例以及jar包源码

    HTTP长连接,也称为持久连接,是HTTP协议的一项特性,旨在优化网络通信效率,减少建立和关闭连接的开销。在传统的HTTP短连接中,每次请求-响应交互都会创建一个新的TCP连接,这在高并发场景下会消耗大量系统资源。而...

    php curl 长连接的实现

    当涉及到频繁的HTTP通信,如API调用或者内部服务交互时,使用cURL的长连接功能可以显著提升性能。本文将深入探讨如何在PHP中利用cURL实现长连接,并讨论其背后的原理以及对性能的影响。 ### PHP cURL长连接简介 长...

    C语言长连接服务器Demo(epoll非阻塞)

    本篇将详细探讨"长连接"和"C语言"结合,以及如何利用"epoll非阻塞"机制来实现一个高效的服务器Demo。 首先,"长连接"是指客户端和服务端之间建立一次连接后,可以进行多次数据传输,而不需要每次通信都重新建立连接...

Global site tag (gtag.js) - Google Analytics