关于 Http 协议中的 keep-alive 与 Tcp keep-alive

最近在做api开发,http无状态是众所周知的,但是刚才突然想到了http的keep-alive模式,心里有些不解,于是找了些资料,挑选了比较容易理解的摘出来,和大家分享一下.
一些词汇的基础概念:
Http协议
TCP协议

以下内容并非原创.
首先Http协议是建立在TCP协议的基础上的,TCP传输层的协议,Http应用层协议。Http底层也是通过TCP传输的

HTTP keep-alive

Http是一个”请求-响应”协议,它的keep-alive主要是为了让多个http请求共享一个Tcp连接,以避免每个Http又新建一个TCP连接。每个Http服务器默认的keep-alive时间可能是不一样的。

TCP keep-alive

Tcp的keep-alive是Tcp协议的一种保鲜装置,当Tcp请求响应结束后,经过tcp_keep-alive_time时间后,服务器会发出监测包去看看改Tcp连接是否还是继续连接的,是否已经出现了网络问题,是否客户端崩溃了等等问题。如果发现出现了问题,那么服务端就会去关闭该TCP连接

关于TCP心跳

在目前这两年的移动互联网火热的环境下,推送应用的非常多。推送实现的就是通过TCP长连接实现的,因为移动网络很多时候都会不稳定,另外NAT过一段时间就会刷新,所以而要如何保证客户端和服务器端连接就成了一个问题。TCP心跳包就是客户端监测连接的,它先发送一个心跳包到服务器,服务器再Ask,通过这种方式判断是否目前的长连接是否可用,如果断了,则通知上层应用,并关闭连接,另外发送心跳包也是避免一段时间都没有通信,NAT超时,NAT表被刷新,导致连接失效。

HTTP与TCP keep-alive联系

直接介绍一个场景就可能更容易明白了。客户端发送了一个Http请求,服务器响应后,判断这个Http是否是keep-alive模式的,如果不是则关闭连接,如果是keep-alive,则等待keep-alive time后再关闭,如果这期间再收到一个http 请求,则继续等待最后一个请求的keep-alive time时间,直到keep-alive time时间内没有收到请求,则关闭

上面是HTTP keep-alive的,而TCP是它下一层的协议,本身TCP是长连接的除非主动关闭。HTTP的keep-alive time一般是15ms, 30ms之类的,如果是超过了HTTP的keep-alive time时间,则HTTP会关闭TCP连接。本身TCP是不会关闭连接的,TCP的keep alive是TCP的保鲜装置,在keep alive timeout 后服务端发送一个监测包来判断连接是否仍保持着,如果还是可连接,则继续保持,它不会主动关闭连接的。而心跳包是为了防止NAT超时。