简介:TCP协议和HTTP协议中,都有keepalive机制,只是二者的含义有所不同。TCP中keepalive主要用来进行链路检测;HTTP中keepalive主要用来进行链路复用。其中http1.1版本已经默认支持keepalive,即支持持久连接。下面将详细分析TCP和HTTP中keepalive机制。
1、TCP keep alive
(1)
TCP是无感知的虚拟连接,中间断开两端不会立刻得到通知。一般在使用长连接的环境下,需要心跳保活机制可以勉强感知其存活。业务层面有心跳机制,TCP协议也提供了心跳保活机制。
长连接的环境下,一旦有热数据需要传递,若此时连接已经被中介设备断开,应用程序没有及时感知的话,那么就会导致在一个无效的数据链路层面发送业务数据,结果就是发送失败。
无论是因为客户端意外断电、死机、崩溃、重启,还是中间路由网络无故断开、NAT超时等,服务器端要做到快速感知失败,减少无效链接操作。
(2)
在一个正常的TCP连接上,当我们用无限等待的方式调用下面的recv或send的时候:
ret=recv(s);或ret=send(s);如果TCP连接被对方正常关闭,也就是说,对方是正确地调用了closesocket(s)或者shutdown(s)的话,那么上面的recv或send调用就能马上返回,并且报错。这是由于closesocket()或者shutdown()有个正常的关闭过程,会告诉对方“TCP连接已经关闭,你不需要再发送或者接受消息了”。但是,如果是网线突然被拔掉,TCP连接的任何一端的机器突然断电或重启动,那么这时候正在执行recv或send