事实上,这两个完全是两样不同东西,实现的层面也不同:
- HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接;
- TCP 的 Keepalive,是由 TCP 层(传输层、内核态) 实现的,称为 TCP 保活机制;
HTTP
短连接:在一次TCP连接中只能发送和响应一个HTTP请求,即:建立TCP->请求资源->响应资源->释放连接
长连接:在一次TCP连接中可以发送和响应多个HTTP请求
web服务软件会提供keepalive_timeout 参数和启动一个定时器,用来指定HTTP长连接的超时时间。如果在完成了一个HTTP请求后,在HTTP的超时时间之内没有发送新的HTTP请求,则调用回调函数释放TCP连接。
长连接的优点:减少多次TCP连接所带来的开销,给HTTP流水线技术提供了可实现的基础。
HTTP流水线:客户端一次可以发送多个请求,在发送过程中不需要等待服务器端的响应,减少了整体响应的时间。
TCP:
如果对端程序正常工作,在发送探测报文后,对端程序会进行正常的响应,此时TCP保活时间会被重置。
如果对端程序宕机:(是宕机,而不是进程崩溃。如果进程崩溃,操作系统在回收进程资源时会发送FIN报文来释放连接,而宕机的情况下是无法感知到的,所以需要TCP保活机制),或对端由于其他原因导致报文不可达时,会发送探测报文,当连续多个探测报文都没有回应时,TCP会报告TCP连接已死亡。
注意,应用程序若想使用 TCP 保活机制需要通过 socket 接口设置 SO_KEEPALIVE 选项才能够生效,如果没有设置,那么就无法使用 TCP 保活机制。
总结
HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。
TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。
上述内容,用于本人学习相关专业知识,如有问题,请联系我,谢谢。