一、长连接和短连接
长连接和短链接的概念:
- 短连接:传输完数据后连接立刻关闭。
- 长连接:传输完数据后不会立刻关闭连接,下次传输数据继续复用这个连接。
很容易看出,长连接和短连接的主要区别就是连接完成后是否会关闭连接,长连接不会在完成后立马关闭。
众所周知,HTTP是基于TCP的,TCP连接的建立和释放需要经过三次握手和四次挥手,这个过程相较于数据传输是极度费时的。而一个web页面往往包含许多个页面请求,因此,使用长连接的优势在于不会频繁创建和释放连接。连接的保持在高并发或者大量请求的情况下能大大减少连接建立的时间,这点对于客户端和服务端来说都能提升性能。
长连接除了可以减少连接建立的时间以外,还有一个重要的用处就是可以检测网络中端到端的故障。因为TCP本身是没有故障检测机制的,默认的keep-alive机制检测时间太长,如果线路的一端异常导致连接没有释放,会导致另一端一直占用连接资源,浪费资源。
二、HTTP的keep-alive
HTTP的长连接保持通过指定Connection
头部完成,如果值为keep-alive
表明希望建立长连接,而如果值为close
则表示短连接。当然,长连接还需要服务端软件也支持,目前广泛使用的apache/nginx等HTTP服务程序都能支持长连接。
在HTTP1.0中,Keep-Alive
默认是关闭的,需要手动指定才能开启。而HTTP1.1开始,Keep-Alive
默认是开启的。
当开启keep-alive后,同一个TCP连接会发送多个HTTP请求到对方。但是由于HTTP协议的无状态特性,只有一个HTTP连接完成之后才能继续在这个连接上发送下一个HTTP请求,即必须是pipeline模式。
以下是一个keep-alive抓包的示例,在nginx上开启keep-alive,使用浏览器访问web页面,同时使用wireshark抓包。抓到的数据包如下:
以上都是由客户端端口50591
发送到服务端80
的数据,数据包已经被分为了5段,分别是:
- TCP三次握手
- HTTP请求+响应
- HTTP请求+响应
- TCP的keep-alive
- TCP四次挥手
其中第二段和第三段都是单独的HTTP请求,说明一个TCP连接中确实可以完成多个HTTP请求。HTTP数据交互过程wireshark已经帮我们解析出来了,很明显就能看出。
同时,通过追踪HTTP流也可以看到HTTP的交互过程:
红色框出来的是第二次HTTP请求,它是在第一个HTTP请求的响应发送完成之后才执行的。
此处评论已关闭