- 浏览: 157848 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (130)
- Database (5)
- JavaSE (23)
- JavaScript (11)
- Struts2 (15)
- Hibernate (11)
- Spring (16)
- Linux (4)
- Jquery (3)
- Tools (12)
- Jsp (7)
- 杂谈 (9)
- WEB Project (10)
- WebService (16)
- maven (2)
- android (1)
- memcache (2)
- 网络通信 (4)
- solr (1)
- cxf (7)
- powerdesigner (1)
- jxls (1)
- springmvc (1)
- nosql (1)
- node.js (0)
- thrift (0)
- REST (1)
- tag (1)
最新评论
HTTP Keep Alive
HTTP Keep-Alive 很大程序上被误解了,下面介绍一下它在HTTP/1.0和HTTP/1.1版本下是如何工作的,以及其在JAVA中的运行原理。
HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求。这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现;它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题。
HTTP/1.0
在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,因此实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接
HTTP/1.1
在HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不同,默认情况下所在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection: Close ,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。另外,还添加了一个新的字段Keep-Alive:,因为这个字段并没有详细描述用来做什么,可忽略它
Not reliable(不可靠)
HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于Keep-Alive的保持连接特性,否则会有意想不到的后果
Keep-Alive和POST
在HTTP1.1细则中规定了在一个POST消息体后面不能有任何字符,还指出了对于某一个特定的浏览器可能并不遵循这个标准(比如在POST消息体的后面放置一个CRLF符)。而据我所知,大部分浏览器在POST消息体后都会自动跟一个CRLF符再发送,如何解决这个问题呢?根据上面的说明在POST请求头中禁止使用Keep-Alive,或者由服务器自动忽略这个CRLF,大部分服务器都会自动忽略,但是在未经测试之前是不可能知道一个服务器是否会这样做。
Java实现--客户端
在客户端,Java抽象了Keep-Alive,和程序员分享离开来,HttpURLConnection类自动实现了Keep-Alive,如果程序员没有介入去操作Keep-Alive,Keep-Alive会通过客户端内部的一个HttpURLConnection类的实例对象来自动实现。也就是说,在java中keep-alive是由一个Java类库来实现的,但在其他类库中不一定可用。
Java实现--服务器端
在服务器端,Java依然是将Keep-Alive抽象出来,HttpServlet、HttpServletRequest、和HttpServletResponse类自动实现 了Keep-Alive。这种情况下一些由第三方控制的操作是可能的,如在KeepAliveServlet中提到的JavaWebServer,Keep-Alive是否启用由两个因素决定,内容长度和输出大小,如果内容长度是响应的一部分(即这段内容长度输出后还有内容需要输出),则Keep-Alive被启用(当然需要客户端支持的情况下);如果内容长度未设定,则Servlet会试着计算响应缓冲区长度以确定内容长度,在Javasoft实现中,使用一个4KB的缓冲区(相当于上面说的响应)。也就是说如果内容长度未设定,并且返回数据超过4KB,此时相当于内容长度大于响应长度,而不是响应长度一部分,Keep-Alive就不会被启用 。
HTTP Keep-Alive 很大程序上被误解了,下面介绍一下它在HTTP/1.0和HTTP/1.1版本下是如何工作的,以及其在JAVA中的运行原理。
HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求。这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现;它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题。
HTTP/1.0
在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,因此实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接
HTTP/1.1
在HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不同,默认情况下所在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection: Close ,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。另外,还添加了一个新的字段Keep-Alive:,因为这个字段并没有详细描述用来做什么,可忽略它
Not reliable(不可靠)
HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于Keep-Alive的保持连接特性,否则会有意想不到的后果
Keep-Alive和POST
在HTTP1.1细则中规定了在一个POST消息体后面不能有任何字符,还指出了对于某一个特定的浏览器可能并不遵循这个标准(比如在POST消息体的后面放置一个CRLF符)。而据我所知,大部分浏览器在POST消息体后都会自动跟一个CRLF符再发送,如何解决这个问题呢?根据上面的说明在POST请求头中禁止使用Keep-Alive,或者由服务器自动忽略这个CRLF,大部分服务器都会自动忽略,但是在未经测试之前是不可能知道一个服务器是否会这样做。
Java实现--客户端
在客户端,Java抽象了Keep-Alive,和程序员分享离开来,HttpURLConnection类自动实现了Keep-Alive,如果程序员没有介入去操作Keep-Alive,Keep-Alive会通过客户端内部的一个HttpURLConnection类的实例对象来自动实现。也就是说,在java中keep-alive是由一个Java类库来实现的,但在其他类库中不一定可用。
Java实现--服务器端
在服务器端,Java依然是将Keep-Alive抽象出来,HttpServlet、HttpServletRequest、和HttpServletResponse类自动实现 了Keep-Alive。这种情况下一些由第三方控制的操作是可能的,如在KeepAliveServlet中提到的JavaWebServer,Keep-Alive是否启用由两个因素决定,内容长度和输出大小,如果内容长度是响应的一部分(即这段内容长度输出后还有内容需要输出),则Keep-Alive被启用(当然需要客户端支持的情况下);如果内容长度未设定,则Servlet会试着计算响应缓冲区长度以确定内容长度,在Javasoft实现中,使用一个4KB的缓冲区(相当于上面说的响应)。也就是说如果内容长度未设定,并且返回数据超过4KB,此时相当于内容长度大于响应长度,而不是响应长度一部分,Keep-Alive就不会被启用 。
发表评论
-
RESTFUL实现主流框架 CXF、Restlet、RESTEasy、Jersey对比
2013-10-21 10:37 1517http://blog.csdn.net/jianxuan/ ... -
CXF-RESTFUL 入参是复合对象的使用方法
2012-12-18 18:31 1119java 开发CXF-RESTFUL,在服务端的入参如果比 ... -
CXF-WebClient客户端调用,配置JacksonProvider转换器的方法
2012-12-17 11:31 2809java语言调用cxf-rest服务,可以通过CXF-WebC ... -
classpath:xxx.xml 与 classpath*:xxx.xml的区别
2012-12-14 14:45 773在使用开源框架如spring、struts2等经常需要配 ... -
最新SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-12-14 14:19 692一 开发环境 1、动态web工程 2、部分依赖 ... -
远程通信技术实现原理(RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS)
2012-12-10 15:16 840在分布式服务框架中, ... -
关于“无状态的HTTP连接提供有状态的连接"
2012-12-07 09:58 1257HTTP是无状态链接,请求 ... -
cxf-rest 配置JSonProvider 来定制JSON的转换格式
2012-12-06 17:08 1418关于CXF JSonProvider CXF通过JSonPro ... -
myeclipse 开发webservice 方法
2012-06-14 18:33 660见附件::: -
基于CXF的JAX-WS、JAX-RS(RESTful)的webService
2012-06-14 15:51 1514原文链接:http://www.open-open.com/l ... -
Web service框架 ---Axis1,Axis2,Xfire,CXF区别
2012-06-13 18:36 1290原文地址:http://494078416.iteye.com ... -
JAVA中的Web服务规范:jax-ws|jax-rs|jaxm
2012-06-13 17:13 1304JAVA 中共有三种WebService 规范,分别是JAXM ... -
主题:Web Service实践之——开始XFire
2012-06-13 16:29 640原文链接: http://www.ite ... -
java 调用webservice的各种方法总结
2012-06-13 16:13 892原文链接:http://www.blogjava.n ... -
利用Session防止表单重复提交
2011-12-13 18:36 11761 由于服务器缓慢或者 ... -
终于淘得几款很好的jquery UI 框架
2011-12-09 17:47 1288Liger UI框架 http://www.ligerui ... -
servlet 中获得spring Bean 的方法
2011-12-01 10:58 1115只需要servlet 中的servletCo ... -
网络通信与安全 一点学习总结【简要版】
2011-09-28 16:59 919花了一天的时间对网络通信与安全方面的知识进行了扫盲式学习,通篇 ... -
servlet 上传文件
2011-09-21 11:08 703原文:http://zhidao.baidu.com/ques ... -
修改cxf rest的返回时间格式
2011-09-19 18:19 937参考:http://stackoverflow.com/que ...
相关推荐
#### 三、Keep-Alive机制详解 **TCP Keep-Alive**是一种用于维护长期空闲的TCP连接的技术,其主要目的是检测网络连接的异常中断。TCP Keep-Alive的工作原理如下: 1. **触发条件**:当TCP连接在一定时间内(默认为...
HTTP 协议 Keep-Alive 模式详解 Keep-Alive 模式是 HTTP 协议中的一种机制,它使客户端到服务器端的连接保持有效,从而避免了每个请求和应答都新建一个连接,并立即断开连接。下面是关于 Keep-Alive 模式的详细...
1.keep-alive 能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 相似, 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件...
server.tomcat.keep-alive-timeout=60000 # keep-alive超时时间,单位毫秒 ``` 在进行keepalive测试时,我们通常会使用像Jodd库这样的HTTP客户端工具,它可以模拟不同场景下的HTTP请求,以便检查keepalive功能的...
在HTTP协议中,Keep-Alive模式是一种用于优化网络通信的技术,它允许客户端和服务器在同一TCP连接上进行多次请求和响应,而不是每次交互都创建新的连接。这种模式显著提高了效率,减少了网络延迟,降低了资源消耗,...
在Vue.js应用中,`<keep-alive>`组件是一个非常重要的特性,它允许我们缓存组件的状态,使得组件在切换时能保持之前的状态,提高用户体验。然而,如何精确控制哪些组件应该被缓存,哪些不应该,特别是在不同条件下,...
Vue.js 是一款流行的前端框架,它提供了一个名为 `<keep-alive>` 的特殊组件,用于在应用中实现组件的状态保留和避免不必要的重新渲染,从而优化性能。`<keep-alive>` 主要适用于那些需要频繁切换但状态需要保持的...
这个不是业务的要求,但是看到每次进入页面就重新渲染DOM然后再获取数据更新DOM,觉得作为一个前端工程师有必要优化下的加载逻辑,正好vue提供了keep-alive的功能,所以就试用了下。当然,干任何事儿都不会一帆风顺...
这时候我们就会想到vue的keep-alive,接下来我们说一下keep-alive的使用 假如现在我们有两个页面,home.vue 和 about.vue home.vue home [removed] export default { name: Home, created() { console....
keep-alive是vue内置的一个组件,可以使被它包含的组件处于保留状态,或避免被重新渲染。 用法: 运行结果描述: input输入框内,路由切换输入框内部的内容不会发生改变。 在keep-alive标签内部添加 include:字符...
在做电商有关的项目中,当我们第一次进入列表页需要请求一下数据,当我从列表页进入详情页,详情页不缓存也需要请求下数据,然后返回列表页,这时候我们使用keep-alive来缓存组件,防止二次渲染,这样会大大的节省...
在Vue.js框架中,keep-alive是Vue内置的一个抽象组件,它能够包裹动态组件,实现组件的缓存功能。当我们希望避免组件被重新创建,而是将其保留在内存中时,可以使用keep-alive来实现这一需求。在Vue中,keep-alive...
主要介绍了keep-alive + vuex 让缓存的页面灵活起来,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
为了提升HTTP连接的性能,Nginx提供了对HTTP持久连接的支持,也就是所谓的keep-alive功能。持久连接允许在同一TCP连接中传输多个HTTP请求和响应,减少了频繁建立和拆除TCP连接所带来的开销。 Keep-alive机制改善了...