1HTTP Keep-Alive
在 http 早期, 每个 http 请求都要求打开一个 tpc socket 连接, 并且使用一次之后就断开这个 tcp 连接
使用 keep-alive 可以改善这种状态, 即在一次 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 的 KeepAliveTimeout 这个 keepalive_timout 时间值意味着: 一个 http 产生的 tcp 连接在传送完最后一个响应后, 还需要 hold 住 keepalive_timeout 秒后, 才开始关闭这个连接
当 httpd 守护进程发送完一个响应后, 理应马上主动关闭相应的 tcp 连接, 设置 keepalive_timeout 后, httpd 守护进程会想说: 再等等吧, 看看浏览器还有没有请求过来, 这一等, 便是 keepalive_timeout 时间如果守护进程在这个等待的时间里, 一直没有收到浏览发过来 http 请求, 则关闭这个 http 连接
2TCP KEEPALIVE
链接建立之后, 如果应用程序或者上层协议一直不发送数据, 或者隔很长时间才发送一次数据, 当链接很久没有数据报文传输时如何去确定对方还在线, 到底是掉线了还是确实没有数据传输, 链接还需不需要保持, 这种情况在 TCP 协议设计中是需要考虑到的
TCP 协议通过一种巧妙的方式去解决这个问题, 当超过一段时间之后, TCP 自动发送一个数据为空的报文给对方, 如果对方回应了这个报文, 说明对方还在线, 链接可以继续保持, 如果对方没有报文返回, 并且重试了多次之后则认为链接丢失, 没有必要保持链接
3http keep-alive 与 tcp keep-alive
http keep-alive 与 tcp keep-alive, 不是同一回事, 意图不一样 http keep-alive 是为了让 tcp 活得更久一点, 以便在同一个连接上传送多个 http, 提高 socket 的效率而 tcp keep-alive 是 TCP 的一种检测 TCP 连接状况的保鲜机制 tcp keep-alive 保鲜定时器, 支持三个系统内核配置参数:
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 是 TCP 保鲜定时器, 当网络两端建立了 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 连接 TCP 连接默认闲置时间是 2 小时, 一般设置为 30 分钟足够了
也就是说, 仅当 nginx 的 keepalive_timeout 值设置高于 tcp_keepalive_time, 并且距此 tcp 连接传输的最后一个 http 响应, 经过了 tcp_keepalive_time 时间之后, 操作系统才会发送侦测包来决定是否要丢弃这个 TCP 连接一般不会出现这种情况, 除非你需要这样做
4 图解 http 的 keep-alive
参考链接地址: http://www.bubuko.com/infodetail-260176.html
http://www.nowamagic.net/academy/detail/23350305
来源: http://www.bubuko.com/infodetail-2483995.html