1
Livid MOD 如果 Cookie 的数据量很大,那么用单独的图片域名就不会需要在每一个图片请求时都包括 cookie 数据,可以节约流量,提高性能。
|
2
14ly 2015-02-14 17:17:22 +08:00 1
感觉以前有类似帖子?还有单域最高并发限制和安全因素
|
3
msg7086 2015-02-14 17:17:56 +08:00 1
防止cookie在子域名上发送。
|
4
msg7086 2015-02-14 17:18:40 +08:00
(是不是应该加一句欢迎回到地球→_→
|
6
KyonLi 2015-02-14 17:20:28 +08:00 via Android 2
国内的话可能有一部分监管的原因吧,如果有一个子域名下出现不和谐内容可能导致整个挂掉,用不同主域名可以规避这样的问题
|
7
a2z 2015-02-14 17:23:57 +08:00 1
利用同源策略,安全。
|
8
skybr 2015-02-14 17:30:42 +08:00 2
除了上面几位说的, 还有就是浏览器对同一个域的并发数有限制.
|
9
zhicheng 2015-02-14 17:35:27 +08:00 via Android 31
能回答出 Cookie 的,给 2 分。能补充浏览器连接数限制的,加 2 分。能再补充 TCP慢启动的(这是缺点)加 3 分。能再补充浏览器渲染之类的,再加 3 分。至今仍没有人答出来过,虽然面过的前端不多。
========= 这是我常用的面试题,在一个 thread 里回复过。 |
10
Gary 2015-02-14 17:36:33 +08:00 1
浏览器对同一个域的并发限制
|
11
weisoo 2015-02-14 17:37:38 +08:00
什么cookie什么并发数量,都不重要,重要原因就是6楼所说的
|
16
zhicheng 2015-02-14 17:50:40 +08:00 via Android
|
17
zhicheng 2015-02-14 17:52:33 +08:00 via Android
显然Cookie是有性能和安全双重影响的。
|
18
xiezefan 2015-02-14 17:55:17 +08:00
@zhicheng Hi, 能科普下这个和 TCP慢启动 有什么关系么? 科普了下 TCP慢启动指在建立连接后,主键增加数据包的发送量, 以防止出现大量数据包造成网络堵塞的问题. 暂时联想不到这个这个问题的关系
|
19
s51431980 2015-02-14 17:59:17 +08:00
我感觉楼主问的主要是 “用 zhimg.com 非 img.zhihu.com ”,所以 cookie 是主要考虑因素
如果问“用 img.zhihu.com/some.jpg 非 zhihu.com/some.jpg ”,连接数才是主要考虑因素 @Livid 的答案足够了 |
20
kaneg 2015-02-14 18:10:32 +08:00 via iPhone
子域名应该和主域名的连接数是分开控制的吧
|
21
anouser 2015-02-14 18:16:15 +08:00
@zhicheng 详细说说对浏览器渲染有啥影响?没理解,至于css javascript放到html头还是尾和域名用啥是两回事吧。
浏览器有并发限制,动态内容用一个域名,静态内容用一个域名会加快资源的载入速度且不会阻塞。 当然,你还要考虑dns解析的时间,多一个域名,浏览器就要多解析一下。这在移动网络下是一个问题,尤其是你的网站是全球可访问的时候。chrome有dns预解析的技术,在桌面上这个问题不大。 另外cookie不用发过去,加快访问速度,并且可以防止子网站出现漏洞,整个站点的session被劫持的影响。 |
22
anjianshi 2015-02-14 18:30:21 +08:00 2
https://developer.yahoo.com/performance/rules.html
见 Use Cookie-free Domains for Components 小节,针对楼主的问题,说的已经很详细了 |
23
raincious 2015-02-14 18:33:21 +08:00 5
主要其实还是Cookie的问题。并发数只是另一方面,因为img.zhihu.com和zhihu.com被浏览器视为两个域名,会各自并发进行下载。
zhimg.com是接收不到给zhihu.com设置的Cookie的,但是img.zhihu.com能收到,所以这是主要原因。 http://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-work 但这又是双刃剑了。DNS查询每个域名需要时间,HTTP需要重新启动握手请求等等。所以这不意味着你能滥用多域名并发的好处。 > 另外在自己开发 App 时只用一个域名有缺点吗?Thanks 这取决于你要怎么干了。如果你设置了xxxx.com的Cookie,这就意味着所有到达xxxx.com以及xxx.xxxx.com的HTTP访问都会被带上Cookie,显然这不利于优化。 但是如果你仅仅只给比如app.xxxx.com设置了Cookie,那么无论是aaa.xxxx.com或bbb.xxxx.com又或是assets.xxxx.com还都是访问不到的。 不过这样太麻烦了不是么? |
24
fising 2015-02-14 18:34:35 +08:00 via iPad
img.zhihu.com 和 www.zhihu.com 不是同一个域,应该没有浏览器并发限制吧?@zhicheng
|
25
Showfom 2015-02-14 19:33:35 +08:00 via iPhone
楼主还有一个事情 DNS 服务器其实不联系用同一个后缀的 参考 AWS ROUTE 53
|
26
lyragosa 2015-02-14 19:36:05 +08:00
还好我们100人小网站界从来不考虑这种事情xd
|
27
zhicheng 2015-02-14 20:33:45 +08:00
|
28
Smartype 2015-02-14 21:01:45 +08:00 via iPhone
@zhicheng 沟通,交流。共同成长。其实我也好奇这和浏览器渲染有什么关系。希望明示,瞎掰也愿意听听/看看
|
29
denghongcai 2015-02-14 21:23:31 +08:00
@zhicheng 我也好奇,希望明示
|
30
zhicheng 2015-02-14 21:27:11 +08:00 18
@Smartype
那我简单说一下,HTTP 协议 的特点是无状态,所以 HTTP 协议只能做到, 请求1->回复1->请求2->回复2 在 keep-alive 的时候就没有这么弱了,但依然受限于 HTTP 无状态,只能做到 , 请求1->请求2->回复1->回复2 那么为什么这和浏览器渲染有关系,其实没关系,如果你设计得好。但设计得不好就有关系了,如果你把 css,js和img放到同一个 hostname 下,并且请求顺序可能会成为 img->css->js 或 css->img->js 或 js->img->css 那么问题就来了,如果一个 img 尺寸是 500K ,那么不管 css 和 js 有多小,依然要等着img返回之后才能返回。 所以,完整的正确的答案是。 1,Cookie ,减少流量增强性能并且降低安全隐患。 2,降低连接数限制造成的阻塞。 3,增加了连接数,所以多了慢启动。 4,小资源快速返回,使网页渲染更加迅速。 |
31
denghongcai 2015-02-14 21:36:29 +08:00 1
浏览器对DOM树的解析是按照顺序而来的,除非你把img写到最前面,这样才会有影响。这是基本的开发原则,有人把img放到head里来加载的?
|
32
dant 2015-02-14 21:52:22 +08:00 3
@zhicheng keep-alive 的工作方式是
请求1--(等待)->回应1-->请求2--(等待)->回应2 ... 请求n--(等待)->回应n ------------------------------------ 连接1 -------------------------------------------- 请求n+1--(等待)->回应n+1-->请求n+2--(等待)->回应n+2 ... 请求2n--(等待)->回应2n ------------------------------------ 连接2 -------------------------------------------------------------- 你所说的方式属于 pipelining, HTTP/1.1, SPDY 和 HTTP/2 有实现。但是 HTTP/1.1 pipelining 在大部分浏览器上都是默认禁用的,Chrome 甚至直接移除了这个功能。 |
34
raincious 2015-02-14 22:20:22 +08:00 1
@zhicheng
所以感谢你解释了HTTP加载顺序的问题,回答挺完善。但,这一点答主根本就没有问啊 :D 如果真的想了解的话可以参考: https://developers.google.com/web/fundamentals/performance/critical-rendering-path/?hl=zh-cn 建议你再补充一点细节,比如Firefox等对img等外链标签的优化,是如何让它们在分析完HTML之后让JavaScript和CSS(Render Blocking Points)一直优先加载的 :) |
35
zhicheng 2015-02-14 22:24:14 +08:00
@raincious
哈哈,我就猜肯定会有人说“楼主根本就没有问这个”。所以我说少了不是,说多了也不是。毕竟我前边已经说了,如果不明白,当我瞎掰好了。 |
36
qiuai 2015-02-14 22:28:51 +08:00 3
@zhicheng 其实对于问得出这种问题的人,就没必要说这么多.
让他们自己看看YSlow的评分标准就是了... 我本来想回答,不过想了想就没回...因为你也不知道他问这个的目的是什么... 如果他是前端,他又不关注服务器的部分,如果他是后端,他又不关注前端和渲染的部分... 所以我现在在V2EX不回这种问题了.回了还会被人质疑,弄的跟自己是笨蛋似的... 最无奈的就是会有人挖坟来跟你对峙...我前天就遇到了一个...也是无奈. |
37
coolcfan 2015-02-15 00:06:47 +08:00
变相增加代理自动切换规则编写难度=.=(开个玩笑)
|
38
kiritoalex 2015-02-15 00:53:35 +08:00 via iPhone
twitter→t.co
感觉很多案例都是如此 |
39
sophymax 2015-02-15 01:22:25 +08:00 via iPad 1
技术上的原因livid说的很靠谱,在国内还有一些其他顾虑,比如去年acfun的A岛出现不和谐内容,被有关部门发现,随后域名商完全停止了解析,视频站和A岛用的同一个主域名,所以A站就因为一个辅助功能而被封域名了,acfun.com域名到现在还不能用,可以认为com域名是永久封杀了。对国外的,域名被盗的话,这个情况也很麻烦,鸡蛋都在一个篮子里了
|
42
111111111111 2015-02-15 08:23:53 +08:00 via Android
感谢本楼各位回复的大神,大开眼界
|
44
skyline75489 2015-02-15 12:42:53 +08:00
@dant 为什么现在的浏览器会默认关闭 pipeline 呢?开启的话对加载速度应该有一点提示吧
|
45
tolerious 2015-02-15 14:27:40 +08:00
脑洞大开
|
46
soulgeek 2015-02-15 19:00:39 +08:00
之前看到各种图片cdn却没有深究,受教了!
|
47
vileer 2015-02-16 11:06:30 +08:00
@raincious app只用一个域名我觉得问题应该不大,因为写app的时候很少会用cookies传递信息,做认证类的一般都是带token,其他的按需加参数就好了
|
48
Biwood 2015-02-16 12:49:42 +08:00 via Android
涨姿势了,之前做过这种项目,但是没有深究
|
49
emonber 2015-03-04 15:31:42 +08:00 1
@skyline75489 HTTP pipelining 要求:服务端需要将响应按顺序返回,在上一响应完全应答之前,不能发送下一响应。比如客户端按顺序请求了 /html 和 /css,服务端需要按顺序返回 /html 和 /css 响应。
考虑这样的场景,服务端并行处理客户端的请求,/css 响应先于 /html 生成,但 /css 响应需要等待 /html 响应生成后才能发送,这就产生了阻塞延迟——线头阻塞(head-of-line blocking)。 除此之外,HTTP 服务器对响应的缓存还会造成性能损失,而对客户端请求数量的未加限制还容易引发对服务器的攻击。 出于上述原因,部分 HTTP 服务器、代理并未实现 HTTP pipelining,或实现不正确(比如,并行化处理而不考虑应答顺序)。浏览器厂商由于担心线头阻塞的影响或是 pipelining 被代理破坏(所有请求都得重新发送),也大多采取保守的选择(默认关闭 HTTP pipelining 选项)。 更多信息可以参考这里: http://chimera.labs.oreilly.com/books/1230000000545/ch11.html#HTTP_PIPELINING http://stackoverflow.com/questions/14810890/what-are-the-disadvantages-of-using-http-pipelining |