大型网站为什么要在外部域上托管其图像/ css?


43

为什么像Facebook,Twitter和Google这样的网站在外部域上托管其图像和CSS,例如:

  • 脸书: static.ak.fbcdn.net
  • 推特: a0.twimg.com
  • 谷歌: ssl.gstatic.com

问题:

  • 是表现吗?还是安全性?

Answers:


53

@toomanyairmiles是部分正确的-此技术的目的是允许从Web浏览器到服务器的并行连接。Web浏览器至少应允许到一个主机的两个同时连接,但是许多新的浏览器最多可以管理60个。无论如何,浏览器与Web服务器之间的并发同时连接是主要的速度瓶颈。

来自Google的资源

HTTP 1.1规范(第8.1.4节)规定,浏览器每个主机名最多应允许两个并发连接(尽管较新的浏览器允许更多的并发连接:请参阅Browserscope列表)。如果HTML文档所包含的对资源的引用(例如CSS,JavaScript,图像等)超出一台主机上所允许的最大值,则浏览器将发出对该数量资源的请求,并将其余资源排队。一旦某些请求完成,浏览器就会发出对队列中下一个资源数量的请求。重复该过程,直到下载了所有资源。换句话说,如果页面从单个主机引用的X个外部资源超过X个,其中X是每个主机允许的最大连接数,则浏览器必须顺序下载它们,一次X个,每X个资源产生1个RTT。总往返时间为N / X,其中N是要从主机获取的资源数。例如,如果浏览器每个主机名允许4个并发连接,并且页面引用同一域中的100个资源,则每4个资源将产生1个RTT,总下载时间为25个RTT。

因此,解决此问题的方法是将请求“分片”到不同的域或主机:

同样,来自相同的Google资源:

平衡主机名之间的可并行化资源。 对大多数静态资源(包括图像,CSS和其他二进制对象)的请求可以并行化。尽可能平衡主机名对所有这些对象的请求。如果不可能,作为经验法则,请尝试确保没有一台主机的服务比所有主机的平均服务多50%。因此,例如,如果您有40个资源和4个主机,则理想情况下,每个主机应提供10个资源。在最坏的情况下,没有主机可以提供超过15个资源。如果您有100个资源和4个主机,则每个主机应提供25个资源。没有人可以为38人提供服务。

但是,这个难题还有另外一块。每个请求通常带有其自身的开销,通常以cookie的形式。静态元素(例如图像,CSS和JavaScript)不需要传输cookie数据,因此从无cookie(子)域提供它们可以提高往返速度:

静态内容(例如图像,JS和CSS文件)不需要附带Cookie,因为用户无需与这些资源进行交互。您可以通过不提供Cookie的域提供静态资源来减少请求延迟。对于引用大量很少缓存的静态内容(例如,频繁更改的图像缩略图或不经常访问的图像档案)的页面,此技术特别有用。对于任何提供5种以上静态资源的页面,我们建议使用此技术。(对于服务于此资源较少的页面,不值得设置额外的域。)

要保留无cookie的域来提供静态内容,请注册一个新域名,并使用CNAME记录配置DNS数据库,该记录会将新域指向您现有的域A记录。配置您的Web服务器以提供来自新域的静态资源,并且不允许在该域的任何位置设置任何cookie。在您的网页中,在URL中引用静态资源的域名。


13

过去,Web浏览器一次只能下载两个项目(现在为6个或更多),因此从各个域下载资源比单个域下载速度更快。这适用于从图像到JavaScript的所有内容。

许多公司还使用CDN(一种可确保最终用户从地理位置上与他们接近的服务器上获取数据)的工具,它还可以通过减少资源请求的往返时间来提高站点性能。


7

大型站点将其静态内容(图像,JS和CSS文件)移动到Content Delivery Network或CDN,因为从多个地理位置分散的服务器上部署您的内容将使用户的页面加载速度更快

由于CDN具有不同的域名,因此它还提供了域分片的好处



-1

对于在使用外部域名时未设置任何Cookie的情况下,发送给标头的不良cookie仍需要这样做,因此加载内容的速度要快得多。

所以是的,出于速度目的仍然需要它。


接受的答案已经表明,没有为外部域发送Cookie。这个答案没有说其他答案尚未涵盖的任何内容。
Stephen Ostermiller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.