Page 186 - Web性能权威指南
P. 186
比较安全的一个数字。对某些站点而言,这个数字已经足够了,但对其他站点来说,
可能还满足不了需求。
消耗客户端和服务器资源
限制每个主机最多 6 个连接,可以让浏览器检测出无意(或有意)的 DoS(Denial
of Service)攻击。如果没有这个限制,客户端有可能消耗掉服务器的所有资源。
讽刺的是,同样的安全检测在某些浏览器上却会招致反向攻击:如果客户端超过
了最大连接数,那么所有后来的客户端请求都将被阻塞。大家可以做个试验,在
一个主机上同时打开 6 个并行下载,然后再打开第 7 个下载请求,这个请求会挂
起,直到前面的请求完成才会执行。
用足客户端连接的限制似乎是一个可以接受的安全问题,但对于需要实时交付数
据的应用而言,这样做越来越容易造成部署上的问题。比如 WebSocket、Server
Sent Event 和挂起 XHR,这些会话都会占用整整一个 TCP 流,而不管有无数据传
输——记住,没有多路复用一说!实际上,如果你不注意,那很可能自己对自己
的应用施加 DoS 攻击。
11.4 域名分区
HTTP 1.x 协议的一项空白强迫浏览器开发商引入并维护着连接池,每个主机最多 6
个 TCP 流。好的一方面是对这些连接的管理工作都由浏览器来处理。作为应用开发
者,你根本不必修改自己的应用。不好的一方面呢,就是 6 个并行的连接对你的应
用来说可能仍然不够用。
根据 HTTP Archive 的统计,目前平均每个页面都包含 90 多个独立的资源,如果这
些资源都来自同一个主机,那么仍然会导致明显的排队等待(图 11-5)。实际上,
何必把自己只限制在一个主机上呢?我们不必只通过一个主机(例如 www.example.
com) 提 供 所 有 资 源, 而 是 可 以 手 工 将 所 有 资 源 分 散 到 多 个 子 域 名:{shard1,
shardn}.example.com。由于主机名称不一样了,就可以突破浏览器的连接限制,实
现更高的并行能力。域名分区使用得越多,并行能力就越强!
当然,天下没有免费的午餐,域名分区也不例外:每个新主机名都要求有一次额外
的 DNS 查询,每多一个套接字都会多消耗两端的一些资源,而更糟糕的是,站点作
者必须手工分离这些资源,并分别把它们托管到多个主机上。
HTTP 1.x | 171