网络中的keepalive机制

keepalive机制详解

前言

我们在配置web服务器,或者其他服务的时候总会涉及一个叫keepalive的参数,翻译过来叫保持连接.他能够管理我们tcp/http 连接的状态(长连接/短连接)并且常常配合超时时间来对keepalive进行管理.你可不要小看这个操作.在高并发场景下,能够把keepalive调整到一个合适值对于优化来讲意义是很大的.那么既然keepalive这么重要.下面我和大家一起来学习下.

长连接与短链接

在说keepalive之前,我们可以先了解一下什么是长连接和短连接.

长连接: 客户端与服务器完成了一次请求和响这个过程后,连接不会立即断开而是下次请求还是通过这条连接发送. 但是有超时时间,可以自己设置

短连接:与长连接的区别就是,一次请求响应完成后,立即断开连接,下一次请求需要重新建立连接.

区别: 长连接占用内存较高,适用于数据库或者一些不断请求的web静态资源,而短连接占用内存较低,适用高并发的场景.

如何开启keepalive

注意: http 1.0协议只支持短连接. 不支持keepalive.http1.1才开始支持

每个服务都有指定的参数这里以nginx为例

http {
  keepalive_timeout 20; --长连接timeout
    keepalive_requests 8192; --每个连接最大请求数
    #keepalive_timeout 0; --等于0 是关闭keepalive
}

keepalive的超时时间

开启keeplive后,我们需要配置一个超时时间,在这个时间段内我们的连接不会断开,这样做是为了检测连接是否活跃,不是活跃连接(达到超时时间还没回应)的连接就会被断开.

原理:

一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,他会发送一个空包给客户端看他是否回应,如果没有回应则关闭这个http连接,释放资源

keepalive与timewait

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

http keepalive 和tcp keepalive

二者层次结构就不同,tcp在传输层.http是应用层.

  • http中的keepalive是为了让tcp活得更久,以便在次基础上能多传送多个http.从而提高socket效率
  • 而tcp中的keepalive是一种死连接检测机制,是借助于操作系统中的keepalive机制来踢掉死链接.可以理解为是一种保护机制

总结: TCP的keepalive是TCP保活计时器,判断TCP当前的连接状况,检查当前TCP连接是否活着;HTTP的keepalive是使用持续连接,要让一个TCP连接活久点, 以便在同一个连接上传送多个HTTP。


echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
keepalive_time 单位是秒 tcp_keepalive_time 是超时时间 tcp_keepalive_intv1 是发送探测包间隔时间 tcp_keepalive_probes 是探测次数 当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了 tcp_keepalive_time后, 服务器内核就会尝试向客户端发 送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。 如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack, 一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。

什么时候开启keepalive

1.当服务器内存充足时.keepalive=0n 还是off对系统影响不大.

2.当服务器上静态网页(html css js 图片居多) ,建议打开keepalive

3.当服务器多为动态请求, keepalive关掉会节省一些内存,节省的内存会作为文件系统的cache(vmstat 命令中的cache一列),较低I0请求.

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...