HTTP协议中的长连接,读完之后,大部分程序员收藏了...( 二 )

HTTP1.1规定了默认保持长连接(HTTP persistent connection , 也有翻译为持久连接) , 数据传输完成了保持TCP连接不断开(不发RST包、不四次握手) , 等待在同域名下继续用这个通道传输数据;相反的就是短连接 。

HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展 , 当前的HTTP1.1 RFC2616文档没有对它做说明 , 因为它所需要的功能已经默认开启 , 无须带着它 , 但是实践中可以发现 , 浏览器的报文请求都会带上它 。 如果HTTP1.1版本的HTTP请求报文不希望使用长连接 , 则要在HTTP请求报文首部加上Connection: close 。 《HTTP权威指南》提到 , 有部分古老的HTTP1.0 代理不理解Keep-alive , 而导致长连接失效:客户端-->代理-->服务端 , 客户端带有Keep-alive , 而代理不认识 , 于是将报文原封不动转给了服务端 , 服务端响应了Keep-alive , 也被代理转发给了客户端 , 于是保持了“客户端-->代理”连接和“代理-->服务端”连接不关闭 , 但是 , 当客户端第发送第二次请求时 , 代理会认为当前连接不会有请求了 , 于是忽略了它 , 长连接失效 。 书上也介绍了解决方案:当发现HTTP版本为1.0时 , 就忽略Keep-alive , 客户端就知道当前不该使用长连接 。 其实 , 在实际使用中不需要考虑这么多 , 很多时候代理是我们自己控制的 , 如Nginx代理 , 代理服务器有长连接处理逻辑 , 服务端无需做patch处理 , 常见的是客户端跟Nginx代理服务器使用HTTP1.1协议&长连接 , 而Nginx代理服务器跟后端服务器使用HTTP1.0协议&短连接 。

推荐阅读