http://code.google.com/intl/zh-CN/speed/page-speed/docs/request.html
最小化请求开销
每当客户端发送 HTTP 请求时,必须随之发出所有与域名和路径相关的 cookie (原文:Every time a client sends an HTTP request, it has to send all associated cookies that have been set for that domain and path along with it.)。 大多数用户的 internet 链接是非对称的:上传和下载的带宽比例通常在 1:4 到 1:20 之间。这意味着上传一个 500 字节的 HTTP 头耗用的时间等同于下载 10 KB HTTP 响应数据——实际上可能更多,因为发出的 HTTP 请求头通常是未压缩的。换句话说,包含小对象(即,少于 10 KB,一张压缩图片的常见尺寸)的请求,即, 数据被加在请求头之中,是影响响应时间的主要因素。
这种延迟在新建浏览器会话时会更长。为了减小网络拥塞的影响,TCP 建立新连接时使用“慢启动(slow start)”算法。这样一来,在得到接受者认可之前,限制通过发送者连接送出大量数据。如果发送者发送的数据超过了新建连接的承受能力,将产生额外的 RTT。
客户端缩减请求时间的最佳方式是:缩减搭载在请求头中的数据的字节数。
最小化请求尺寸
概览
让 cookie 和 请求头尽可能的小,确保一个 HTTP 请求恰好能放到一个包里面(packet)。
详情
理想状况下,一个 HTTP 请求应当能装载一个包里面。网络对包的最普遍的限制大约是 1500 字节,所以,如果你能限制每个请求小于 1500 字节,你就缩减了请求流的开销。HTTP 请求头包括:
- Cookies:对于那些必须要用 cookie 传送的资源,要全力减小 cookie 的尺寸。为保证请求尺寸在上述限制内,域提供的 cookie 应当小于 1000 字节。我们建议域的平均尺寸不超过 400 字节。
- 浏览器设置的字段(field): 许多 HTTP 头里面的字段是用户浏览器的用户代理(user agent)自动设置的,所以,你没法控制他们。
- 请求资源的 URL(
GET
和Host
字段)。携带许多参数的 URL 可能会产生成千上万的字节数。尽力限制 URL 的长度为最多几百字节。 - 引用URL(Referrer URL)。
建议
-
在服务端存储大多数 cookie 有效荷载 (Use server-side storage for most of the cookie payload)
- 如果 cookie 中仅仅存放 ID,给这个 ID 加上键(Key)把它变成数据存储在服务端。不论 session 还是设置了 date/time 过期的 cookie,都可以使用服务端 cookie。
- 下级域名路径上的所有资源会继承位于顶级域名的 cookie 设置的字段(例如 /)。因此,如果你在不同的 URL 路径上提供了不同的应用,而且你有一个全局字段(该域名上的所有应用都用到该字段)——例如,关于用户语言的引用——将设置在顶级域名的 cookie 字段中;而不必在域名的子路径中重复设置。反过来,如果一个字段仅仅应用在某个应用或者某个子路径中——例如,一个 UI 设置——没有必要在顶级 cookie 的字段中设置而迫使其他不要用他的应用传递这个无用数据。
移除无用的和重复的 cookie 字段 (Remove unused or duplicated cookie fields)
让不含 cookie 的域提供静态内容服务
概览
让不含 cookie 的域名提供静态资源,以便缩减页面请求的总体尺寸。
详情
静态内容,例如:图像、js 和 CSS 问价,是一些没有用户交互的资源,不需要用 cookie。使用无 cookie 域上的资源可以缩减请求的延迟。这项技术尤其适合那些大量引用大体积文件的应用,大体积文件是难以缓存的静态资源,例如高频变换的缩略图,或者不常访问的图像文档。如果页面提供了超过 5 个这样的静态资源,我们推荐你这样做。(要是页面引用要少少于 5 个,不值得另外设置一个域名。)
想要存储提供静态内容的无 cookie 域,需要先注册一个新域名,并配置给你的 DNS 数据库配置一个 CNAME 记录,让新域名指向已存在的域名 A 记录。配置你的 WEB 服务器在新域名上提供静态资源服务,并拒绝在该域名上设置任何 cookies。更新网页上引用这些静态资源的 URL 中的域。
如果你用 CDN(Content Delivery Network,即:内容分发网络)提供静态文件服务,你的 CDN 可能会支持来自其他域的资源服务。联系你的 CDN 并找到答案。
推荐
-
启用代理缓存(Enable proxy caching)
- 对那些很少改变的资源, 设置有关浏览器和代理的缓冲头(caching headers) 。因为这些资源不会发送 cookies,所以不用担心代理会缓存具体用户信息。
- 因为 JavaScript在文档的头部指定并需要页面启动,所以 JS 文件应当 与主文档放在同一台主机上 。因为大多数浏览器会阻塞其他文件的下载以及阻塞页面呈现,除非所有 JS 文件下载、解析并执行;此时,避免额外的 DNS 查询也是不错的。
不要过早使用从无 cookies 域加载的外部 JS 文件(Don't serve early loaded external JS files from the cookieless domain)
例子
许多 Google 产品,包括 新闻 和 代码 ,提供静态资源服务,例如:JS 文件和图像文件,它们来自独立域名 www.gstatic.com。这个域上没有 cookie 。因为新闻的主页在 news.google.com,在下面的截屏上你能看到包含在请求中的 cookie:
但是,对于 www.gstatic.com,通常提供新闻的 logo.gif 文件, 请求或响应中都没有出现 cookie 头。