网络编程(五)丨长连接&连接池的应用

22

长连接&连接池的应用

我们知道TCP是基于连接的协议,其实这个“连接”只是一个逻辑上的概念。在IP层看来, TCP和UDP仅仅是内容上稍有差别而已。

TCP的“连接”仅仅是连接的两端对于四元组和sequence号的一种约定而已。

在有些文章里总会提到这名词、或者五元组,甚至七元组。 虽然我很反对摆弄名词秀专业,但我们也要防止被“秀”。 其实很容易理解:

  • 四元组: 源IP地址、目的IP地址、源端口、目的端口
  • 五元组: 源IP地址、目的IP地址、协议、源端口、目的端口
  • 七元组: 源IP地址、目的IP地址、协议、源端口、目的端口,服务类型,接口索引

在性能比较敏感的程序中,为了节省TCP网络调用建立连接三次握手的时间, 很多程序都会选择采用复用之前已经建立过的连接的方法来优化。

再加上往往是“请求、响应、请求、响应”的模式,单个连接限制了QPS(Query Per Second)的提升。 所以会采取开启多个连接组成一个“池子”的方式来优化性能,我们称之为连接池。

HTTP的长连接

HTTP长连接,HTTP持久连接(HTTP persistent connection,也称作HTTP keep-alive或HTTP connection reuse)是使用同一个TCP连接来发送和接收多个HTTP请求/应答, 而不是为每一个新的请求/应答打开新的连接的方法。

在 HTTP 1.0 中, 没有官方的 keepalive 的操作。通常是在现有协议上添加一个指数。 如果浏览器支持 keep-alive,它会在请求的包头中添加:

然后当服务器收到请求,作出回应的时候,它也添加一个头在响应中:

这样做,连接就不会中断,而是保持连接。当客户端发送另一个请求时,它会使用同一个连接。 这一直继续到客户端或服务器端认为会话已经结束,其中一方中断连接。

在 HTTP 1.1 中 所有的连接默认都是持续连接,除非特殊声明不支持。 HTTP 持久连接不使用独立的 keepalive 信息,而是仅仅允许多个请求使用单个连接。

然而,Apache 2.0 httpd 的默认连接过期时间是仅仅15秒,对于 Apache 2.2 只有5秒。 短的过期时间的优点是能够快速的传输多个web页组件,而不会绑定多个服务器进程或线程太长时间。

33

Keep-Alive的优势

  • 较少的CPU和内存的使用(由于同时打开的连接的减少了)
  • 允许请求和应答的HTTP管线化
  • 减少了后续请求的延迟(无需再进行握手)
  • 报告错误无需关闭TCP连接

Keep-Alive的劣势

对于现在的广泛普及的宽带连接来说,Keep-Alive也许并不像以前一样有用。 web服务器会保持连接若干秒(Apache中默认15秒),这与提高的性能相比也许会影响性能。 对于单个文件被不断请求的服务(例如图片存放网站),Keep-Alive可能会极大的影响性能, 因为它在文件被请求之后还保持了不必要的连接很长时间。

根据RFC2616,用户客户端与任何服务器和代理服务器之间不应该维持超过2个链接。 代理服务器应该最多使用2×N个持久连接到其他服务器或代理服务器,其中N是同时活跃的用户数。 这个指引旨在提高HTTP响应时间并避免阻塞。

但由于,TCP连接减少了,对于静态资源(图片、JavaScript、CSS)较多的网站, 性能反而可能会下降。

动静分离

为了规避上面说的对图片等静态资源的影响,大多数商业网站会启用独立的静态资源域名。 从而保证主站的动态资源请求和静态资源的请求不会互相挤占连接。

动静分离同时还会有一个额外的好处:

对于静态资源的请求,HTTP请求头里的Cookie等信息是没有用处的, 反而占用了宝贵的上行网络资源。用独立的域名存放静态资源后, 请求静态资源域名就不会默认带上主站域的Cookie,从而解决了这个问题。

如下表:

3344

文章分类 技术博客, 运维开发

发表评论

电子邮件地址不会被公开。

在线交流

数百位业内高手和同行在等你交流
Reboot运维开发分享