细谈keep_alive

一、为什么要引入keep_alive

HTTP是一个请求+响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老版本的HTTP中,每个请求都将被创建一个新的客户端到服务器的连接,在这个连接上发送请求,然后接收请求。

优点:简单,容易理解和编程实现;

缺点:效率很低。

因此,Keep-Alive被提出用来解决效率低的问题。

二、HTTP中使用keep_alive的好处

HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive也没能改变这个结果。Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的。唯一能保证的就是当连接被关闭时,能得到一个通知,所以不应该让程序依赖于Keep-Alive的保持连接特性,否则会有意想不到的后果。

在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。

使用keep-alive可以改善TIME_WAIT这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。

但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。

三、keepalvie timeout时间设置

Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。如nginx的keepalive_timeout,和Apache的keep_alive_timeout。这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。

当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这便是keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。

1. 当keepalive_timeout=0时(不启用Keep-Alive)

在没有设置 keepalive_timeout 情况下,一个socket资源从建立到真正释放需要经过的时间是:建立tcp连接 + 传送http请求 +数据传输 + 传送http响应 + 关闭tcp连接 + 2MSL。

2. 当keepalive_timeout>0时(启用Keep-Alive)

服务端httpd守护进程发完响应后,没有立即主动关闭tcp连接。keepalive_timeout时间后,服务端主动关闭这个tcp连接。这个时间,是我们设置的keepalive_timeout的时间。

所以,设置了keepalive_timout时间情况下,一个socket建立到释放的时间多了keepalive_timeout时间。

3. 当keepalive_timeout>0,且在同一个tcp连接发送多个http响应

当设定了keepalive_timeout,一个socket由建立到释放,需要时间是:tcp建立 + (最后一个响应时间 – 第一个请求时间) + tcp关闭 + 2MSL。

注意:正在关闭或者TIME_WAIT状态的tcp连接,不能传输http请求和响应。即,当一个连接结束keepalive_timeout计时,服务端守护进程发送第一个FIN标志ip包后,此时该连接不能再使用了。

四、http keep-alive与tcp keep-alive

http keep-alive为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率;

而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器。

keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置(双方无任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等)。如果没有收到对方的ack包,则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对方的ack,如果一直没有收到对方的ack,则会尝试 tcp_keepalive_probes次,每次的间隔时间是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes次,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

也就是说,仅当http_keepalive_timeout值设置高于tcp_keepalive_time,并且距此tcp连接传输的最后一个http响应,经过了tcp_keepalive_time时间,操作系统才会发送侦测包来决定是否要丢弃这个TCP连接。一般不会出现这种情况。

五、keep-alive与TIME_WAIT

使用http keep-alvie,可以减少服务端TIME_WAIT数量(因为由服务端httpd守护进程主动关闭连接)。启用keep-alive,建立的tcp连接少了,自然要被关闭的tcp连接也相应少了。

时间: 2024-10-27 08:40:41

细谈keep_alive的相关文章

Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基本配置.核心API的底层实现和源码解析将在以后的博客中一一为大家讲解. 首先我们一起来看一下开发一个hibernate应用程序的大体流程是什么样的(流程顺序可以颠倒): •创建Hibernate的配置文件 •创建持久化类 •创建对象-关系映射文件 •通过Hibernate API编写访问数据库的代码 关于配置

细谈RDD的弹性

细谈RDD的弹性 弹性之一:自动的进行内存和磁盘数据存储的切换   弹性之二:基于Lineage(血缘)的高效容错   弹性之三:Task如果失败会自动进行特定次数的重试 弹性之四:Stage如果失败会自动进行特定次数的重试,而且只会计算失败的分片 弹性之五:checkpoint和persist Checkpoint是比较重量级的操作,RDD操作,一般每次都会产生新的RDD,除了最后一个action操作触发作业以外.但是有时候,链条比较长或者计算比较笨重,考虑把数据放到磁盘上,这就是Checkp

JAVA基础细谈

JAVA基础细谈 一. 源文件和编译后的类文件     源文件的本质就是程序文件,是程序员编写,是人看的.而编译后的类文件是给电脑看的文件.一个类就是一个文件,无论这个类写在哪里,编译以后都是一个文件.源文件通过java编译生成类文件,后缀名为”.java“的是源文件,后缀为“.class”的为类文件.如图 这就是一个源文件和一个和它同名的类文件,文件名和类名一样,方便开发中的文件管理. 二. 语句    java程序的组成是类文件,类文件的组成是方法,方法的组成语句.语句是任何程序的基本单位,

Css的使用细谈

Css的使用细谈 Css可以通过简单的更改CSS文件,改变网页的整体表现形式,可以减少我们的工作量,所以她是每一个网页设计人员的必修课. Css简介              (1) CSS是用于布局(layout)与美化网页的. (颜色,字体)       (2) CSS是Cascading Style Sheets的英文缩写,即层叠样式表       (3) CSS语言是一种标记语言,因此不需要编译,可以直接由浏览器执行(属于浏览器解释型语言).        (4) CSS文件是一个文本文

细谈Spring(一)spring简介

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.  然而,Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益. Spring的核心是个轻量级容器(container),实现了IoC(Inversion of Control)模式的容器,Spring的目标是实现一个全方位的整合框架,在Spr

细谈HTML解析模块

 细谈HTML解析模块 Html在网页中所占的位置,用一个简单直观的图给展示一下:         HTML基本介绍 (1) HTML是用来制作网页的标记语言.    (2) HTML是Hypertext Markup Language的英文缩写,即超文本标记语言.    (3) HTML语言是一种标记语言,不需要编译,直接由浏览器执行.     (4) HTML文件是一个文本文件,包含了一些HTML元素,标签等.HTML文件必须使用html或htm为文件名后缀.    (5) HTML是大小写

细谈 对象的初始化过程------内存中的实现过程?

今天对于内存的理解 又加深了一步: 对下面代码的理解: class Person { private String name="xiaohong"; private int age=23; private static String country="CN"; { System.out.println(name+" "+age); } public Person(String name,int age) { this.name = name; t

细谈微信提示已停止访问网页的解决方案,微信跳转链接的生成

相信大部分试用微信分享转发链接的时候,都很容易碰到链接在微信中无法打开的问题.通常这种情况微信会给个提示 “已停止访问该网址” ,导致这个情况的因素有以下三点. 1. 分享链接被多人举报. 2. 链接含违规内容,含敏感词. 3. 被腾讯检测系统判断为诱导分享内容. 被人举报我们无法阻止,因为现在行业竞争大,举报的人里其实用户占很少数,多数都是来自同行的恶意举报,这是没有办法的事.第一种情况我们无法避免,但是我们可以避免链接因含敏感词或者含违规内容从而被腾讯主动拦截. 那么有朋友问到底怎么避免呢?

细谈unity资源管理的设计

一.概要 本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面需要详细讨论的. 二.Unity的资源管理方式 2.1 资源分类 unity项目中的资源,大体上可以分为外部导入资源和内部生成资源两种类型.外部导入资源: 美术生成的大部分资源,都是外部带入资源,模型,贴图,UI用图,基本是美术工具生成后,导入到工程中的.内部生成资源: 部分美术生成资源,例如材质,shader,特效,场景等,属于基于Unity引擎来制作生成的,此外各种