资料参考:1.HTTP的长连接和短连接 - 烛秋 - 博客园
2.极客时间详解HTTP
什么是长连接
一次HTTP请求是建立在一次TCP 连接
在早期如1.0是如此,
但现在1.1以上,一次TCP连接上可以建立多个HTTP请求
一次HTTP请求建立一次TCP连接,我们称为短连接
反之多次我们称为长连接
而且 从HTTP1.1协议以后,连接默认都是长连接
用网络面板抓包工具访问百度首页
connection:keep-alive请求和响应的header-field 的 Connection 为keep-alive即长连接
以前我就有一个误解,不是说HTTP请求是无状态的吗,怎么又是长连接
1.HTTP协议底层是TCP,这里的长短连接是TCP的长短连接,长连接指不断开会话
2.无状态是指两次HTTP请求之间的依赖关系,不是指HTTP和TCP
3.需要客户端和服务端都设置Connection:keep-alive (不需要即为close)
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
长连接的过期时间
服务器有时候会回复客户端超时时间,将数据存在响应头的Keep-Alive中
如Keep-Alive:timeout=20 即保持20s的会话
长连接的数据传输完成识别
1.如果传输数据的大小达到了Content-Length大小
2.分块传输需要根据chunk编码
注意:一些场景情况
如果一个资源需要经过多个代理服务器,其中有些代理服务器用的HTTP/1.0的
即不支持长连接
这时你携带Connection想要去保持长连接怎么办?
1.首先中间旧的代理服务器无法处理Connection头部,原样转发给目标服务器(上游服务器)
2.上游服务器认识Connection,试图处理并保持连接,返回给代理服务器一个Connection
3.代理服务器还是不认识原样转发给客户端,同时关闭连接
4.客户端以为长连接,仍在该连接上上发起请求,代理服务器出错,短链接无法发起两次请求
解决方法:
就需要使用Proxy-Connection来替换Connection
比如我利用chorme浏览器的代理模式将阿里云服务器设为代理
网友评论