1.定义
长连接:数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。(如qq,建立链接之后就不断开,知道你关闭和某个用户的聊天窗口才会断开连接)
短连接:数据传输完成了就断开连接。(如我们平时开发的接口,得到数据后接口就断开。)
2.长连接的过期时间
目前大多数HTTP请求使用的是长连接(HTTP/1.1默认keep-alive为true),而长连接意味着,一个TCP的socket在当前请求结束后,如果没有新的请求到来,socket不会立马释放,而是等timeout后再释放。
客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间,譬如:
上图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。
![](http://static.oschina.net/uploads/img/201602/24094425_FQUk.png)
上图中的 Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说, 如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。
3.学习资料
1、HTTP Keep-Alive模式:
http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
2、浏览器的并发请求限制:
http://www.zhihu.com/question/20474326
3、RFC文档 connection部分:http://tools.ietf.org/html/rfc2616#page-44
4、C/C++网络编程中的TCP保活:
http://blog.csdn.net/weiwangchao_/article/details/7225338
5、HTTP persistent connection: http://en.wikipedia.org/wiki/HTTP_persistent_connection
6、HTTP pipelining:http://en.wikipedia.org/wiki/HTTP_pipelining
7、Head-of-line blocking:http://en.wikipedia.org/wiki/Head-of-line_blocking
8、《HTTP权威指南》第四章 连接管理