python-高级编程-06-长连接&连接池
我们都知道tcp是基于连接的协议,其实这个连接只是一个逻辑上面的概念,在ip层来看,tcp和udp仅仅是内容上稍有差别而已。
tcp 的连接仅仅是连接两端对于四元组和sequence号的一种约定而已
四元组:源IP 目的IP 源端 目的端口
五元组 :源IP 目的IP 源端 目的端口 协议
七元祖:源IP 目的IP 源端 目的端口 协议 服务类型 接口索引
在性能比较敏感的程序中,为了节省TCP网络调用建立连接三次握手的时间,很多程序都会采用复用之前已经建立过的连接方式来优化
在加上往往是 “请求 响应 请求 响应”的模式 单个连接限制了QPS的提升 所以会采取开启多个连接组 组成一个'池子'的方式来优化性能,
我们称之为"连接池“
http的长连接
及http持久连接,也称作 http keep-alive 是使用同一个TCP连接来发送和接受多个HTTP请求/应答,而不是为每一个新的请求都新建一个连接
如果浏览器支持keep-alive 它会在包头连接
Connection:Keep-Alive
当服务器收到请求,做出回应的时候 它也会在添加这个到响应中
这样做的话 连接就不会中断,而是保持连接 当客户端发送另一个请求,它会使用同一个连接 这样持续到客户端或服务器端认为回话结束,其中一方断开
在HTTP 1.1 中所有的连接默认都是持续连接,除非特殊声明不支持。http持久连接不使用独立的keepalive信息 而是仅仅允许多个请求使用单个连接、
然而 Apache2.0 httpd的默认连接过期时间是仅仅的15s 对于Apache 2.2 只要5s 短过期时间的优先是能够快速的传输多个web页最贱
而不会绑定多个服务器进程或线程太长时间。
keep-alive
*较少的cpu和内存
*允许请求和应答的HTTP管线化
* 减少了后续请求的延迟(无需再进行握手)
* 报告错误无需关闭tcp连接
对于现在的广泛普及的带宽连接来说 keep-Alive也许并不像以前一样有用,web服务器会保持若干秒的连接
这与提高的性能相比也许会影响性能,对于单个文件被不断请求的服务(如静态文件网站)keep-alive可能会极大的
影响性能,因为它在文件被请求的之后还保持了不必要的连接很长时间
根据RFC2616 用户客户端与任何服务器和代理服务器之间不应该维持超过2个连接,代理服务器应该最多是用2*N个持久连接打其他服务器,
或者代理服务器。其中N是同事活跃的用户数。
这个旨在提高http响应时间并且避免阻塞
但由于tcp连接减少了 对于静态资源较多的网站 性能反而可能会下降。
动静分离--
为了规避上面说的对图片等静态资源的影响,大多数商业网站会启用独立的静态资源域名。
从而保证主站的动态资源请求和静态资源请求不会相互拥挤占用资源、
而且还会有个一个额外的好吃
对于静态资源的请求,HTTP请求头里的Cookie等信息是没有用处的。反而占用了宝贵的上行网络资源,用独立的域名存放静态资源后,请求
静态资源域名就不会默认带上主站网的cookie。从而解决了这个问题。