IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

TCP keep-alive & connection pool

MySQL实验室 2010-07-09 13:17:00 累计浏览 5,923 次
本机暂存

要理解TCP keep-alive/persistent connection, 得从TCP协议说起。

TCP flow:

    _____                                                     _____
   |     |                                                   |     |
   |  A  |                                                   |  B  |
   |_____|                                                   |_____|
      ^                                                         ^
      |--->--->--->-------------- SYN -------------->--->--->---|
      |---<---<---<------------ SYN/ACK ------------<---<---<---|
      |--->--->--->-------------- ACK -------------->--->--->---|
      |--->--->--->-------------- ... -------------->--->--->---|
      |---<---<---<-------------- ... --------------<---<---M---|

建立TCP链接需要经过3步,SYN、SYN/ACK、ACK,关闭则需要4步

约定:

当用户通过浏览器打开一个页面的时候,最小情况下,只需要2个packet,一次是请求(http get request),一次是回应(response from server)。但是这里没有计入TCP链接的建立(3 packets)和关闭(4packets),当然每个packet都需要ACK,但是ACK信息一般直接包含在回应的packet里,为了量化方便,这里忽略掉。

以WEB APP为例:

有一个页面,当中包含5个很小的图片,因此为了将这些内容加载到浏览器,需要5次http请求。在没有开启keep-alive的情况下,总共需要(3+2+4)×5=45 packets;而开启keep-alive的情况下只需要3+(2)×5+4=17 packets。

当然实际情况下计算公式没这么简单,而且还涉及到各浏览器并发的连接数不同(比如IE6为2),header信息等其他因素,但是原理是一样的,因此在当今页面元素特别多的情况下,keep-alive能减少很大的开销。

在互联网实际工程应用的时候,需要解决相关的一些问题,比如充分利用带宽、小图片合并减少请求次数、避免链接异常不能正常关闭等等情况需要做相应的处理,从而实现最佳的资源配置和提升用户体验。

连接池:

上面提到TCP的keep-alive,而在应用上我们会遇到同样的问题,为了减少额外的开销,在验证、初始化一系列参数状态之后,保持现有资源,供下次或者其他需要该资源的程序使用,从而提高效率。

比如我们可以通过在web server上部署agent,agent跟数据库保持连接,这样web app只需要通过本地的domain socket快速通过agent跟数据库交互,从而极大提生服务器效率和负载能力,达到节约成本的目的。

链接的保持:

TCP层面keep-alive有它自己保持链接状态的机制,即:linux下默认情况2小时之后开始请求确认,每75秒一次,连续9次没有得到响应即判定链接失效。MySQL保持连接默认情况下是8小时,如果8小时没有任何请求,则在服务器端关闭相应的连接,因此可以通过mysql ping的方式每过一段时间让timer从新计数。

参考:
http://goo.gl/y7k9
http://goo.gl/GTkL

同分类推荐文章

  1. Vibe新开源项目 - Vaala AI Gateway (2026-05-17 02:10:19)
  2. SmartPerfetto 架构文章 Q&amp;A:8 个深度技术问答 (2026-04-10 11:00:00)
  3. 让 AI 把我的 PHP 博客重写成 Go (2026-03-27 18:33:54)

查看更多 后端 文章 →

建议继续学习

  1. gen_tcp发送进程被挂起起因分析及对策 (累计阅读 37,742)
  2. TCP 的那些事儿(上) (累计阅读 22,590)
  3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,805)
  4. 自建DNS以防止GFW干扰 (累计阅读 13,025)
  5. HTTP协议Keep-Alive模式详解 (累计阅读 12,005)
  6. 浅谈TCP优化 (累计阅读 11,024)
  7. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 10,783)
  8. 查看 Apache并发请求数及其TCP连接状态 (累计阅读 10,004)
  9. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 8,743)
  10. websocket 连接 C Server的尝试 (累计阅读 7,864)