HTTP 连接处理

当我们在浏览一个web页面时,页面里的元素可能是来自于多个源的,例如每张图片有各自的来源。我们在浏览一个拥有2张图片的web页面时,浏览器需要发起3个HTTP事务,一个用于获取顶层HTML页面元素,另两个获取相对应的图片。

串行连接

如果只是简单的对连接进行管理,使用串行化的方式去请求资源。每个请求都需要等待前方的请求完毕,并且每个事务在请求时都需要建立连接-传输数据-关闭连接。

使用串行化的方式去请求,则我们拥有了三倍的连接时延和慢启动时延


并行连接

HTTP允许客户端同时打开多条连接,并行地执行多个HTTP事务。此时,每个请求不用等待其他请求的处理情况,自行建立连接去执行自身的HTTP事务即可。

使用并行化的方式去请求,理论上相对串行化连接,时间缩短为了1/3;但每个任务都有自己的连接,在带宽很小(只能容下一个请求时)时,每个连接都会去竞争这有限的带宽,这样其实和串行化的效率相当,而且,同时打开大量连接会消耗很多内存资源,从而引发自身的性能问题


持久连接

如果这三个请求的目标服务器都是同一个,我们可以保持初次打开的TCP连接不关闭,在后续使用时可以直接拿来复用,这就叫做持久连接。

其实这里和我们在服务端开发时使用的连接池,是同样的道理,客户端维护一个连接池,要使用时直接捡起来用即可

持久连接相对于并行连接,将并行连接引起的多次连接时延和慢启动时延缩短到了一次。而且减少了打开连接的数量,节约了更多的资源。但要小心的是在管理持久连接时,如果不够细致,有可能会累积出大量的空闲连接(例如你访问了多个网站,每次都是一个持久连接,并且你忘记设置超时来关闭它们)


现在比较常用的方式是打开少量的并行连接,并且每个连接都持久化。这样可以享用两者带来的好处,但同样要小心地处理,避免连接长期空闲。