使用Transfer-Encoding:chunked头信息
大多数的站点相应用户请求时发送的HTTP Headers中包含Content-Length头.此头信息定义在HTTP1.0协议RFC 1945 10.4章节中.该信息是用来告知用户代理,通常意义上就是浏览器,服务端发送的文档内容长度.浏览器接受到此信息后,接收完Content-Length中定义的长度字节后开始解析页面.如果服务端有部分数据延迟发送,那么浏览器就会白屏.这样导致比较糟糕的用户体验.
解决方法在HTTP1.1协议.RFC2616中14.41章节中定义的Transfer-Encoding:chunked的头信息.chunked编码定义在3.6.1中.根据此定义浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可解析页面.并且可以下载html中定义的页面内容,包括js,css,image等.采用chunked编码有两种选择,一种是设定Server的IO buffer长度让Server自动flush buffer中的内容,另一种是手动调用IO中的flush函数。
不同的语言IO中都有flush功能:
- php: ob_flush(); flush();
- perl: STDOUT->autoflush(1);
- java: out.flush();
- python: sys.stdout.flush()
- ruby: stdout.flush
从下面两张图中可以看出采用HTTP1.1的Transfer-Encoding:chunked,并且把IO的buffer flush下来,以便浏览器更早的下载页面配套资源.

normal response

flush response
video 对比
采用flush功能不单单能够让浏览器更早地下载页面配套资源,而且能够更好的提升用户体验。和上图一样服务器因为某种原因延迟了发送页面文档导致3秒的延迟,那么采用Content-Length头信息的页面将会白屏3秒,用户不知道是他本机的网络问题还是服务器的问题。而采用Transfer-Encoding:chunked的页面会显示页面的头部信息。用户知道他浏览器已经和正等待服务器取得联系,等待服务器发送更多的内容。
