`

了解HTTP Keep-Alive的基本情况

阅读更多

HTTP Keep-Alive 很大程序上被误解了,下面介绍一下它在HTTP/1.0和HTTP/1.1版本下是如何工作的。

Keep-Alive是 HTTP协议中非常重要的一个属性。大家知道HTTP构建在TCP之上。在HTTP早期实现中,每个HTTP请求都要打开一个socket连接。这种做效 率很低,因为一个Web 页面中的很多HTTP请求都指向同一个服务器。例如,很多为Web页面中的图片发起的请求都指向一个通用的图片服务器。持久连接的引入解决了多对已请求服 务器导致的socket连接低效性的问题。它使浏览器可以再一个单独的连接上进行多个请求。浏览器和服务器使用Connection头ilai指出对 Keep-Alive的支持。

HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每个 请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求。这样的模式有一个很大的优点就是,它很简单,很容易理解和编 程实现;它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题。

 

HTTP/1.0

HTTP 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;HTTP 1.1中默认启用Keep-Alive,如果加入"Connection: close",才关闭。

在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的连接请求。列举以下浏览器的并发数作参考:IE6,7在HTTP/1.0中默认最大并发连接数为 4,在HTTP/1.1中默认最大并发连接数为2,IE8都为6,Firefox2在HTTP/1.0中默认最大并发连接数为2 在HTTP/1.1中默认最大并发连接数为8,firefox 3默认都是6。

在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,大部分服务器都会自动忽略,但是在未经测试之前是不可能知道一个服务 器是否会这样做。

一些容易犯的误区:

  1. HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)
  2. 从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
  3. Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
分享到:
评论

相关推荐

    vue中keep-alive,include的缓存问题

    首先,让我们来了解一下`keep-alive`组件的基本用法。在Vue中,你可以将`keep-alive`包裹在`router-view`组件周围,以此来缓存路由切换时的组件实例。 ```html &lt;keep-alive&gt; &lt;router-view/&gt; &lt;/keep-alive&gt; ``` ...

    vue中进入详情页记住滚动位置的方法(keep-alive)

    首先,了解keep-alive组件的基本作用是必要的。keep-alive是Vue提供的一个抽象组件,它用来缓存不活动的组件实例,而不是销毁它们。这样,在组件切换过程中能够保持这些组件的状态,而不是重新创建。 在实现滚动...

    vue中keep-alive组件的入门使用教程

    为了解决这个问题,开发者了解到`&lt;keep-alive&gt;`组件可以缓存组件实例,防止重新触发接口请求。 在Vue的路由配置中,开发者将`keepAlive: true`添加到需要缓存的路由元信息(meta)中,如歌曲列表页面的路由配置。...

    vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置

    首先,我们需要了解 `vue keep-alive` 的基本用法。`keep-alive` 是一个内置组件,用于缓存 Vue 实例,避免组件的渲染和销毁过程,保持组件的状态。在我们的例子中,我们关注的是它的 `include` 属性,这允许我们...

    线上问题分析:The target server failed to respond(目标服务器返回失败) - ado1986

    "线上问题分析:The target server failed to respond(目标服务器返回失败)" ...我们了解了HTTP协议、Keep-Alive机制、服务器配置和客户端配置的重要性,并了解了如何使用tcpdump和netstat工具来诊断网络问题。

    C# WinForm客户端连接 WebSocket

    首先,让我们了解WebSocket的基础知识。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它极大地简化了浏览器和服务器之间的数据交换,特别是在需要频繁交互或实时性要求高的应用中。WebSocket API被设计为低...

    vue缓存的keepalive页面刷新数据的方法

    首先,我们来了解&lt;keep-alive&gt;组件的基本概念。&lt;keep-alive&gt;是一个抽象组件,它可以对组件实例进行缓存,当这些组件在切换时,不会进行销毁操作,而是保存在内存中,当再次切换回该组件时,可以从内存中直接读取缓存...

    一个基于 umi 的移动 React 框架

    在该压缩包中,我们可能找到项目的基本结构,包括配置文件、源代码、样式文件、测试文件等,这些都是理解并使用这个框架的关键。 在深入探讨这个框架时,我们可以了解到以下关键知识点: 1. **umi框架**:umi是一...

    umi-antd-pro-antd-pro.zip

    - **创建项目结构**:根据项目需求,建立基本的目录结构,包括 src/pages 和 src/models 等。 - **配置路由**:在 `src/config/router.config.js` 中配置项目路由,包括页面跳转和子路由设置。 - **权限管理**:...

    Lwip之TCP实现.pdf

    - `TCP_KEEPDEFAULT`: 7200 秒 (2 小时),默认的keep-alive探测发送前的等待时间。 - `TCP_KEEPINTVL`: 75 秒,两次keep-alive探测之间的间隔。 - `TCP_KEEPCNT`: 9 次,keep-alive探测的最大发送次数。 - `TCP_...

    易语言-keep操作源码例程

    这个"keep例子"源码例程应该是演示了如何在易语言中实现上述的一些功能,通过查看和学习这个例程,你可以了解到如何在易语言环境下实现持久连接,优化网络请求的效率。在实际应用中,可以根据具体需求对这些基本操作...

    vue 实现tab切换保持数据状态

    以下是一个基本的示例,展示了如何使用`&lt;keep-alive&gt;`实现Tab切换时的数据保持: ```html &lt;el-tabs v-model="activeName" @tab-click="handleClick"&gt; &lt;el-tab-pane label="记录"&gt; &lt;keep-alive&gt; &lt;child1 v-if=...

    sqlmap用法

    - **HTTP Keep-Alive**: 使用 `--keep-alive` 参数启用HTTP Keep-Alive功能。 - **HTTP NULL连接**: 使用 `--null-connection` 参数启用HTTP NULL连接。 - **并发HTTP(S)请求**: 使用 `--threads` 参数设置并发HTTP...

    HTTP-Communication-Theory.zip_theory

    在实际的网络通信中,HTTP还可以进行持久连接(Keep-Alive),以减少建立和关闭TCP连接的开销。此外,HTTP/1.1引入了管道机制,允许在同一连接上同时发送多个请求,提高了效率。而HTTP/2则引入了二进制分帧,多路...

    vue-element-admin 菜单标签失效的解决方式

    首先,我们需要了解`vue-element-admin`的基本结构。这是一个基于Vue.js、Element UI和Vue Router构建的后台管理系统模板。Vue Router是Vue.js的官方路由管理器,它负责应用的路由配置和页面导航。在Vue Router中,...

    我靠这个过了面试-2023前端之VUE面试题汇总-53页

    - **动态组件与&lt;keep-alive&gt;**:如何使用动态组件实现按需加载,以及&lt;keep-alive&gt;的作用和使用场景。 3. **状态管理** - **Vuex**:学习Vuex的基本概念(store、state、mutations、actions、getters),以及如何...

    Http.rar_http 协议

    通过状态码,开发者可以了解请求的执行情况。 5. HTTP报文头: 报文头包含了关于请求或响应的附加信息,如缓存控制、内容类型、cookies、授权等。这些头字段可以帮助处理如身份验证、内容编码、请求范围等问题。 6...

    tcp/ip-HTTP-Header-消息报头

    - **Connection**: 指示连接是否保持打开状态,例如`Connection: keep-alive`。 - **Date**: 消息发送的时间戳。 - **Pragma**: 兼容HTTP/1.0的缓存控制指令,通常用于`no-cache`。 - **Transfer-Encoding**: 数据...

    vue面试题_vue常见面试题和答案.docx

    7. **&lt;keep-alive&gt;&lt;/keep-alive&gt;**:`&lt;keep-alive&gt;`组件用于缓存组件实例,当组件在路由或视图切换时,保持其状态不被销毁。 8. **$refs**:Vue中的`$refs`对象可以用来直接访问组件实例或元素,通常用于手动操作...

    http以post方式上传一个文件[文].pdf

    Connection: Keep-Alive -------------------------------7db372eb000e2 Content-Disposition: form-data; name="file"; filename="kn.jpg" Content-Type: image/jpeg (此处省略 jpeg 文件二进制数据...) ------...

Global site tag (gtag.js) - Google Analytics