tcp keep-alive
tcp keep-alive提供的是一种链路有效检测机制,当链路建立之后,可能经过很长时间应用程序一直没发送数据,这时有可能链路因为某种原因已经失效了,如果对这种情况不做处理那肯定有问题,tcp对于这种情况提供了keep-alive机制,该机制在操作系统内核有3个配置参数:
- /proc/sys/net/ipv4/tcp_keepalive_time
- /proc/sys/net/ipv4/tcp_keepalive_intvl3
- /proc/sys/net/ipv4/tcp_keepalive_probes
当tcp链路空闲超过tcp_keepalive_time时间后,服务器内核会向客户端发送探测报文,来检测tcp连接是否正常,如果收到客户端的ack,那么在下次空闲时间再一次超过tcp_keepalive_time后再进行检测;如果没有收到客户端的ack,那么隔tcp_keepalive_intvl3时间后再发一次检测链路的空报文,如果重试tcp_keepalive_probes次后依然没有收到客户端的ack,则判定连接已失效,关闭连接。
虽然tcp的keep-alive机制能够定时清理失效的连接,但这个tcp_keepalive_time时间一般比较长,tcp默认是2小时,在关闭失效连接前如果客户端发起通信则会失败,所以不能完全通过该机制解决链路有效性问题。
tcp的keep-alive机制发送的探测报文是将之前TCP报文的序列号减1,并设置1个字节,内容为“00”的应用层数据,这样对端能识别这个报文是tcp keep-alive探测报文并进行ack。
http keep-alive
http keep-alive是应用层的机制,是http server端的一种长连接机制。该机制弥补了http请求每次请求都要创建连接的缺陷,只要客户端在keep-alive时间内发起下一次请求,就能复用之前的连接。
在HTTP/1.0协议中,客户端通过在http请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样客户端不会主动断开该连接,在下次http请求直接用该连接,除非两次请求的间隔超过了keep-alive的时间。当http server端检测到该连接超过了keep-alive时间还没有收到请求,就会断开该连接。
在HTTP/1.1协议中,keep-alive默认实现,不需要客户端在http请求头中添加Connection: Keep-Alive。