长连接与短连接
Http基于TCP连接,连接方式有长连接和短连接。
短连接指建立TCP连接后只进行一次数据的请求和应答,就关闭TCP连接。后续即使有这两点之间的数据请求,也只能建立新的TCP连接。
使用长连接时,一次TCP连接可持续一段时间(可由web服务器设定),在这期间一切数据交换都可在当前TCP连接上进行,无需重新建立。
对比
TCP连接需要经过三次握手四次挥手,因此TCP连接的建立和关闭都很耗时。同样TCP连接的保持会占用服务器很多资源。
因此,在有密集数据交换的场景下,短连接耗时严重,长连接可以有效提高TCP连接的利用率。
在数据交换稀疏的场景下,长连接需在服务端保持TCP连接,占用服务器资源。
连接控制字段
默认连接方式为长连接,可用首部字段Connection
切换。
Connection:keep-alive
表示启用长连接,Connection:close
表示启用短连接。
请求报文中表明启用短连接时,服务器会将短连接字段添加到响应报文中,默认情况下会携带Connection:keep-alive
字段。
队头阻塞
服务器接收到Http请求后需要在服务端进行相关处理。而有多个请求时,队列中的请求会按次序处理。那么问题来了,如果前面的请求处理特别耗时,就会阻塞后续请求处理。
解决方案
并发连接
浏览器可对一个域名同时建立多个长连接,提供多通道处理。
建立多个长连接会对服务器产生特别大的负荷,通常限制浏览器对一域名最多有6个长连接。
域名分片
上述方案,对同一域名还是限制了6个长连接。如何可以得到更高性能,也就是如何建立更多的TCP连接,那就是域名分片。
域名分片指根据域名,创建它的子分片域名,域名指向同一服务器。如此就跳过了6个长连接数量的限制。