- 主题:一个HTTP消息,消息头里面是否包含了"本消息字节数"的信息?
原则上如果不用chunked模式,就应该在response的content-length里指定body大小
【 在 daishu59 (daishu59) 的大作中提到: 】
: 也就是说Http消息的大小是在http头部的某个地方有定义的?
--
修改:sayinger FROM 202.106.68.*
FROM 202.106.68.*
不知道你的结论有什么依据
就目前常见的web容器而言,对于你所说的“不能”直接知道内容长度,也就是通常所说的“动态”内容来说,由于输出缓冲区的存在,容器在最终向客户端输出之时大多是知道实际长度的,除非你的内容大到超出缓冲区的容量。一般的页面出现这种情况,基本可以认为是失败的设计,应该设法减小单个页面的体积了。
【 在 mOK (爱母哦克诶) 的大作中提到: 】
: 事实上大部分页面是没有content-length的,
: 一般像图片,下载文件这样的有,因为直接就能知道要发送的内容的长度
--
FROM 180.77.84.*
我说的是web容器,不要简单对应为web server,谢谢
另外如果是自己山寨的容器,那也不在我的讨论范围之内。
使用chunk模式需要以连接中断来表示消息的终结,而http1.1希望每个消息能描述自己的长度,否则连接没法重用,因此,负责任的web容器应当缓冲输出内容,尽可能的输出content-length。当然,需要平衡由此带来的空间开销,这就看缓冲区的大小了。
事实上,google, 163基本都是遵循这个原则的。
【 在 JulyClyde (信RFC1149得自由) 的大作中提到: 】
: 你是烟酒僧吧?抓包看看不就知道了?
: web服务器虽然“能”知道动态页面的长度,但它并不添加content-length header
--
FROM 202.106.68.*
你不妨到gmail和163 mail里,翻翻你的邮件,看看返回那堆json的请求有没有content-length呗。如果你觉得这堆json也可能是事先静态化过的,不妨改变一下每页返回条数的设置看看呗。
【 在 JulyClyde (信RFC1149得自由) 的大作中提到: 】
: 你确定那个不是真的静态页面?
--
修改:sayinger FROM 202.106.68.*
FROM 202.106.68.*
那么我补充一种例外的情况:认为自己还活在http1.0世界里的web容器,如果其可以被认为不山寨并且负责任的话...
【 在 shui (水色) 的大作中提到: 】
: 可怜的水木啊,不知是山寨的还是不负责任的。
: 刚才抓了几个js,貌似连静态资源也是没有content length的。
: 这个头会受到http代理的影响吗?
--
FROM 202.106.68.*
【 在 mOK (爱母哦克诶) 的大作中提到: 】
: 理论上讲当然最好是每次通信都先算好这个头再发给客户最好。
: 可这个和你说的缓冲区,或者页面显示速度有些矛盾,所以很多时候不带这个头
矛盾在哪里?
: 人家问有没有,只能回答不一定喽
我说得很清楚啊,chunk模式之外的一定得有,你还能找到第三种情况么?
--
FROM 202.106.68.*
说的就是,除了一些特殊情况,特别大的页面要么想办法静态化,要么设法减小体积,当然你要认为搞个几百k的页面也是正常的“大多数的”,那也没办法。
既然你说事实上存在很多第三种模式,那么第三种模式是啥?
我想“除了chunk模式之外”这个表述并不难理解吧
【 在 mOK (爱母哦克诶) 的大作中提到: 】
: 页面比较大,不希望所有html都算完后才向客户端传输。
: 这种情况http header里就没法知道content-length
: 事实上很多没有的。
: ※ 修改:·mOK 于 Oct 13 15:17:03 2010 修改本文·[FROM: 114.251.120.*]
--
修改:mOK FROM 114.251.120.*
FROM 202.106.68.*
没错,我说得不够严谨
只不过要用chunk-size来标识消息结束,同样离不开缓冲区,其核心就是容器不光要“知道”消息的大小,还要设法告诉客户端,整体上不清楚,那也应该在分块时指明。
其实就是,如果内容不多,只有一个块,就直接输出content-length,如果内容很多,超过一个块,就用chunk模式,以chunk-size来标识。
至于说哪种更多一些,就看缓冲区和页面的大小呗。
google首页在我这里看到的都是有content-length的啊,那上面又没有多少东西,没有chunked的必要啊
【 在 Orpherus (奥路菲) 的大作中提到: 】
: chunk模式也可以用chunk-size为0表示结束
: 不需要中断连接 google首页就是这么做的
--
FROM 202.106.68.*
你在加上
User-Agent: Mozilla/5.0 Firefox/3.6.10
Accept-Encoding: gzip,deflate
试试
【 在 Orpherus (奥路菲) 的大作中提到: 】
: $ telnet www.google.com 80
: Trying 66.102.7.104...
: Connected to www.l.google.com.
: ...................
--
FROM 202.106.68.*
header可以辨别啊
【 在 JulyClyde (信RFC1149得自由) 的大作中提到: 】
: gzip,deflate的话内容就不可辨别了
--
FROM 202.106.68.*