一、什么是长连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
在HTTP/1.0中,默认使用的是短连接。浏览器和服务器每进行一次HTTP操作就建立一次连接,然后请求结束就直接中断连接。
在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来,譬如我自己写的HTTP客户端多线程去下载文件,就可以不遵循这个标准,并发的或者连续的多次GET请求,都分开在多个TCP通道中,每一条TCP通道,只有一次GET,GET完之后,立即有TCP关闭的四次握手,这样写代码更简单,这时候虽然HTTP头有Connection: Keep-alive,但不能说是长连接。正常情况下客户端浏览器、web服务端都有实现这个标准,因为它们的文件又小又多,保持长连接减少重新开TCP连接的开销很有价值。
二、长连接的过期时间
三、长连接的数据传输完成识别
四、并发连接数的数量限制
五、容易混淆的概念——TCP的keep alive和HTTP的Keep-alive
六、HTTP长连接的优点
我们使用了HTTP长连接后,可以省去很多TCP建立和关闭的步骤,节省了时间。而且因为服务器同时打开的连接减少了,可以降低网络阻塞,提高了资源请求的速度,因为后续请求无需再建立连接,减少了三次握手。例如在静态资源服务器中,一个页面往往有很多静态资源如图片、css、js等,那么在Web服务器上开启长连接,可以提高页面的打开速度。
七、HTTP长连接的缺点
长连接真的就一定好吗?长连接的状态下,一个Socket的存在时间是建立连接时间+ keepalive_timeout时间+ TIME_WAIT时间。那么如果在高并发的场景下,我们的Web服务器要同时保持大量的Socket连接,那么肯定是占用系统的资源。那么这个时候就要根据实际的情况来修改keepalive_timeout的值,直到一个合理的范围,那么这个需要根据自己的业务特点进行调整。