Tcp: 在双方长时间未通讯时,如何得知对方还活着?如何得知这个TCP连接是健康且具有通讯能力的?
- TCP的保活机制就是用来解决此类问题,这个机制我们也可以称作:keepalive。保活机制默认是关闭的,TCP连接的任何一方都可打开此功能。有三个主要配置参数用来控制保活功能
- 系统级:保活时间tcp_keepalive_time、探测时间间隔tcp_keepalive_intvl、探测循环次数tcp_keepalive_probes。
- 保活时间(tcp_keepalive_time)默认7200秒,保活时间间隔(tcp_keepalive_intvl)默认75秒,探测循环次数(tcp_keepalive_probes)默认9次
- 默认情况下一条TCP连接在2小时(7200秒)都没有报文交换后,会开始进行保活探测,若再经过9*75秒=11分钟15秒的循环探测都未收到探测响应,即共计:2小时11分钟15秒后会自动断开TCP连接。
- 单条socket:保活时间TCP_KEEPIDLE、保活探测时间间隔TCP_KEEPINTVL、探测循环次数TCP_KEEPCNT
- 是由 TCP 层(内核态) 实现的
如果在一段时间(保活时间:tcp_keepalive_time)内此连接都不活跃,开启保活功能的一端会向对端发送一个保活探测报文
- 若对端正常存活,且连接有效,对端必然能收到探测报文并进行响应。此时,发送端收到响应报文则证明TCP连接正常,重置保活时间计数器即可
- 在探测过程中,对端主机会处于以下四种状态之一:
http:
- 是由应用层实现的
- http1.0默认是关闭的,通过http请求头设置“connection: keep-alive”进行开启;http1.1中默认开启,通过http请求头设置“connection: close”关闭
- 在一次http请求中,服务器进行响应后,不再直接断开TCP连接,而是将TCP连接维持一段时间。在这段时间内,如果同一客户端再次向服务端发起http请求,便可以复用此TCP连接,向服务端发起请求,并重置timeout时间计数器,在接下来一段时间内还可以继续复用
- 优点:1、keep-alive机制避免了频繁建立和销毁连接的开销。 2、减少服务端TIME_WAIT状态的TCP连接的数量
区别:
- 发送方式:tcp具备双端连续收发报文的能力,开启了keep-alive的HTTP连接,由于协议本身的限制,服务端无法主动发起应用报文。
- TCP中的keepalive是用来保鲜、保活的;HTTP中的keep-alive机制主要为了让支撑它的TCP连接活的的更久,所以通常又叫做:HTTP persistent connection(持久连接) 和 HTTP connection reuse(连接重用)
|