一、长连接和短连接
长连接和短链接的概念:
- 短连接:传输完数据后连接立刻关闭。
- 长连接:传输完数据后不会立刻关闭连接,下次传输数据继续复用这个连接。
很容易看出,长连接和短连接的主要区别就是连接完成后是否会关闭连接,长连接不会在完成后立马关闭。
众所周知,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 请求的响应发送完成之后才执行的。
评论