第192题:HTTP 中的 keep-alive 有了解吗?它和多路复用的区别?
在 http 早期,每个 http 请求都要求打开一个 tpc socket 连接,并且使用一次之后就断开这个 tcp 连接。
使用 keep-alive 可以改善这种状态,即在一次 TCP 连接中可以持续发送多份数据而不会断开连接。通过使用 keep-alive 机制,可以减少 tcp 连接建立次数,也意味着可以减少 TIME_WAIT 状态连接,以此提高性能和提高 httpd 服务器的吞吐率,更少的 tcp 连接意味着更少的系统内核调用,socket 的 accept() 和 close() 调用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
引言
本文分为以下三部分循序渐进走进 HTTP/1.x 的 keep-alive 与 HTTP/2 多路复用:
下面正式开始吧
HTTP/1.x keep-alive
在一文走进 TCP 与 HTTP 中,我们介绍过,HTTP 协议是建立在 TCP 协议上的应用层协议, HTTP 协议最初是一个非常简单的协议,通信方式也是采取简答的请求-应答的模式,即:客户端与服务器端的的每次请求都需要创建 TCP 连接,服务器响应后断开 TCP 连接,再请求再创建断开。
在 HTTP/0.9 与 早期 HTTP/1.0 中,默认的就是这种,但这种频繁的创建、断开连接无疑是极大的消耗性能
所以 HTTP/1.0 引入了 keep-alive 长连接,HTTP/1.0 中是默认关闭的,可以通过
Connection: keep-alive;
开启 ,HTTP/1.1 默认是开启的,无论加没加Connection: keep-alive;
所谓长连接,即在 HTTP 请求建立 TCP 连接时,请求结束,TCP 连接不断开,继续保持一段时间(timeout),在这段时间内,同一客户端向服务器发送请求都会复用该 TCP 连接,并重置 timeout 时间计数器,在接下来 timeout 时间内还可以继续复用 TCP 。这样无疑省略了反复创建和销毁 TCP 连接的损耗。
HTTP/2 多路复用
为什么 HTTP/2 引入多路复用?
这是因为:
HTTP/2 是怎么做的喃?
HTTP/1.x keep-alive 与 HTTP/2 多路复用区别
总结一下,HTTP/1.x keep-alive 与 HTTP/2 多路复用区别:
HTTP/1.x 是基于文本的,只能整体去传;HTTP/2 是基于二进制流的,可以分解为独立的帧,交错发送
HTTP/1.x keep-alive 必须按照请求发送的顺序返回响应;HTTP/2 多路复用不按序响应
HTTP/1.x keep-alive 为了解决队头阻塞,将同一个页面的资源分散到不同域名下,开启了多个 TCP 连接;HTTP/2 同域名下所有通信都在单个连接上完成
HTTP/1.x keep-alive 单个 TCP 连接在同一时刻只能处理一个请求(两个请求的生命周期不能重叠);HTTP/2 单个 TCP 同一时刻可以发送多个请求和响应
原文