HTTP协议的输出分为响应头和响应内容。头部信息通常较短,相应内容则可能很长。
怎样有效率地输出响应内容就成了一个需要研究的问题。
既然是输出,那很显然就跟其他输出流一样,用EOF标记结束位置就好了。
HTTP/1.1 200 OK Output Start Here <EOF>
如果可以提前知道有多少字节需要读取就好了。于是有了"Content-Length"属性,用于提前指定内容长度。
这要求先缓存全部输出内容,以计算内容长度。
HTTP/1.1 200 OK Content-Length: 9 123456789
但是没有办法一下子知道全部输出内容的大小,能不能分批输出呢。于是有了"chunked"的输出方式。
借助"Transfer-Encoding"来指定输出编码。这本质上是对内容的一种编码(Encoding)。
"chunked"编码的具体方法倒也很简单:一行16进制表示的字节长度 + 相应的字节流 + 换行符。最后以一个长度为0的块表示结束。
HTTP/1.1 200 OK Transfer-Encoding: chunked 18 data chunk 123 size = 24 1B data chunk 456789 size = 27 0