012_TCP keepalive 和 http keep-alive

TCP keepalive
概念
在使用TCP长链接(复用已创建TCP链接)的场景下,须要对TCP链接进行保活,避免被网关干掉链接。
在应用层,能够经过定时发送心跳包的方式实现。而Linux已提供的TCP KEEPALIVE,在应用层可不关心心跳包什么时候发送、发送什么内容,由OS管理:OS会在该TCP链接上定时发送探测包,探测包既起到链接保活的做用,也能自动检测链接的有效性,并自动关闭无效链接。安全

原理
创建TCP链接时,就有定时器与之绑定,其中的一些定时器就用于处理keepalive过程。当keepalive定时器到0的时候,便会给对端发送一个不包含数据部分的keepalive探测包(probe packet),若是收到了keepalive探测包的回复消息,那就能够判定链接依然是OK的。若是咱们没有收到对端keepalive探测包的回复消息,咱们即可以判定链接已经不可用,进而采起一些措施。但Keepalive会额外产生一些网络数据包外,这些包将加大网络流量,对路由器和防火墙形成必定的负担。服务器

Linux设置
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
tcp_keepalive_time,在TCP保活打开的状况下,若是在该时间内没有数据往来,则发送探测包。即容许的持续空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2h)。
tcp_keepalive_probes 尝试探测的次数。若是发送的探测包次数超过该值仍然没有收到对方响应,则认为链接已失效并关闭链接。默认值为9(次)
tcp_keepalive_intvl,探测包发送间隔时间。默认值为75s。网络

Java/netty服务器如何使用
如基于netty 4服务器程序tcp

serverBootstrap.option(ChannelOption.SO_KEEPALIVE, true);性能

长链接环境为何要保活
TCP链接被中间设备断开,客户端和服务端对此是得不到通知的。长链接的环境下,如IM服务,若某链接长时间没有数据交换,可能被丢弃。那一旦有数据须要传递,且此时链接已经被中介设备断开,应用程序没有及时感知的话,那么就会致使在一个无效的数据链路层面发送业务数据,结果就是发送失败。netty

TCP链接不活跃被干掉具体是什么
在三层地址转换中,咱们能够保证局域网内主机向公网发出的IP报文能顺利到达目的主机,可是从目的主机返回的IP报文却不能准确送至指定局域网主机(咱们不能让网关把IP报文广播至所有局域网主机,由于这样必然会带来安全和性能问题)。为了解决这个问题,网关路由器须要借助传输层端口,一般状况下是TCP或UDP端口,由此来生成一张传输层端口转换表。
因为端口数量有限(0~65535),端口转换表的维护占用系统资源,所以不能无休止地向端口转换表中增长记录。对于过时的记录,网关须要将其删除。如何判断哪些是过时记录?网关认为,一段时间内无活动的链接是过时的,应定时检测转换表中的非活动链接,并将之丢弃。
更多参考:https://blog.chionlab.moe/201...server

Http keep-alive
在 HTTP 1.0 时期,每一个 TCP 链接只会被一个 HTTP Transaction(请求加响应)使用,请求时创建,请求完成释放链接。当网页内容愈来愈复杂,包含大量图片、CSS 等资源以后,这种模式效率就显得过低了。因此,在 HTTP 1.1 中,引入了 HTTP persistent connection 的概念,也称为 HTTP keep-alive,目的是复用TCP链接,在一个TCP链接上进行屡次的HTTP请求从而提升性能。blog

HTTP1.0中默认是关闭的,须要在HTTP头加入"Connection: Keep-Alive",才能启用Keep-Alive;HTTP1.1中默认启用Keep-Alive,加入"Connection: close ",才关闭。生命周期

区别
二者在写法上不一样,http keep-alive 中间有个"-"符号。
HTTP协议的keep-alive 意图在于链接复用,同一个链接上串行方式传递请求-响应数据
TCP的keepalive机制意图在于保活、心跳,检测链接错误。图片

http链接池与keep-alive关系
链接池技术做为建立和管理链接的缓冲池技术,减小建立和销毁链接的开销,是对多个链接的生命周期管理。keep-alive强调的是一个http链接自己的复用机制。

总结本文重点梳理了TCP keep alive概念和原理,并与http keep-alive对比区别,又引伸出http链接池与keep-alive的关系,帮助理清基础概念。

相关文章
相关标签/搜索