首先先说一个结论,无论是HTTP的长连接还是TCP的长连接,最终都是基于TCP的长连接,因为HTTP是基于TCP的上层网络协议。
1 长连接&短连接比较
HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。那么长连接和短连接有什么不同呢?
(1)概念不同
- 长连接:HTTP客户端与服务端先建立连接,连接建立后不断开,然后再进行不断的数据传输。
- 短连接:HTTP客户端与服务端每进行一次数据传输时才进行通讯连接,传输完成后立即断开连接。
(2)传输数据过程不同
- 长连接:TCP三次握手打开连接—> HTTP报文传输—> 保持连接—> HTTP报文传输—> ...—> TCP四次挥手关闭连接
- 短连接:TCP三次握手打开连接—> HTTP报文传输—> TCP四次挥手关闭连接
2 长连接原理
连接的保活:KeepAlive
首先想到的是KeepAlive 机制。他有三个参数:
- tcp_keepalive_time
- tcp_keepalive_probes
- tcp_keepalive_intvl
KeepAlive 并不是 TCP 协议的一部分,但是大多数操作系统都实现了这个机制。KeepAlive 机制开启后,在一定时间内(一般时间为 7200s,参数tcp_keepalive_time)在链路上没有数据传送的情况下,TCP 层将发送相应的KeepAlive探针以确定连接可用性,探测失败后重试 10(参数tcp_keepalive_probes)次,每次间隔时间 75s(参数tcp_keepalive_intvl),所有探测失败后,才认为当前连接已经不可用。
但是,默认 TCP 连接并不启用 Keep-alive,若要打开的话要显式地调用 setsockopt(),来设置保活包的发送间隔、等待时间、重试个数等配置。在全局层面,Linux 还默认有 3 个跟 Keep-alive 相关的内核配置项可以调整:tcp_Keepalive_time,tcp_Keepalive_probes,还有 tcp_Keepalive_intvl。
参考:
https://network.51cto.com/article/603345.html
https://time.geekbang.org/column/article/482610
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!