知识点:
- HTTP的优化,包括并行连接、持久化连接(keep-alive)和管道化连接
- 管理连接时应该以及不应该做的事情
并行连接
特点:
- 连接时延的重叠
- 并行连接并不一定更快(实际上,多条连接会产生一些额外的开销,使用并行连接装载整个页面所需的时间很可能比串行下载的时间更长。)
场景: 一百个用户同时发出申请,每个用户打开 100 个连接,服务器就要负责处理 10 000 个连接。这会造成服务器性能的严重下降。 - 并行连接让用户感觉“更快”了
因为多个组件对象同时出现在屏幕上时,用户能够看到加载的进展
持久化连接
HTTP/1.1(以及 HTTP/1.0 的各种增强版本)允许 HTTP 设备在事务处理结束 之后将 TCP 连接保持在打开状态,以便为未来的 HTTP 请求重用现存的连接。在事 务处理结束之后仍然保持在打开状态的 TCP 连接被称为持久连接
特点:
- 不关闭TCP连接 - 降低了时延和连接的开销
- 在HTTP/1.0下需要使用
Connection: keep-alive
来开启 - HTTP/1.1 默认使用了持久连接(persistent connection)来取代了keep-alive
使用Connection: close
来关闭连接
关于Keep-alive的一些说明
- 如何想要保持持久连接,客户端需要发送一个带有
Connection: keep-alive
头部的请求,如果服务器支持持久连接,则同样会发送带有Connection: keep-alive
头部的回复 - keep-alive 无法与不支持 Connection 首部的代理进行互操作
【 Connection 首部是个逐 跳首部,只适用于单条传输链路,不应该沿着传输链路向下传输。接下来,就要 发生一些很糟糕的事情了。】
如下图,客户端和服务器都处于keep-alive的状态。而盲中继(blind relay)不理解keep-alive 的意思,就会一直挂在那里等待连接的关闭(但实际情况服务器已经同意了持久连接,三方就会一直挂着)
对比图如下:(持久连接去除了进行连接和关闭连接的开销)
管道化连接
关闭连接
所有 HTTP 客户端、服务器或代理都可以在任意时刻关闭一条 TCP 传输连接。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。