先把结论放这:TCP 的 keepalive 和 HTTP 请求和响应的包头里的 keepalive 不是一回事。
TCP 的 keepalive 是用来检查 TCP 连接的对方是否还“活着”,Linux 有三个参数跟 keepalive 有关。
-
tcp_keepalive_time
一个连接闲了一定时间,就发 keepalive 的消息,这个时间长度是由tcp_keepalive_time
来指定。 -
tcp_keepalive_probes
指定发送多少个 keepalive 探测包。如果对方回了 keepalive 探测包,说明对方还在,就继续保持这个连接。 -
tcp_keepalive_intvl
指定发送 keepalive 探测报的间隔时间。跟tcp_keepalive_probes
相乘(发送多个 keepalive 探测包,对方没有响应),得到的就是从开始 keepalive 检查到放弃这个连接的时间。
HTTP 的 keepalive 是指客户端和 HTTP 服务端建立起 TCP 连接后,在这一个 TCP 连接上进行多次 HTTP 请求和响应,而不是建立 TCP 连接,请求,应答 HTTP,然后就断开 TCP 连接。建立、断开 TCP 的次数大大减少了,TCP 的连接数也减少了。