transfer-encoding和content-length的不同实现

传输数据编码:Transfer-Encoding
数据编码,即表示数据在网络传输当中,使用怎么样的保证方式来保证数据是安全成功地传输处理。可以是分段传输,也可以是不分段,直接使用原数据进行传输。
有效的值为:Trunked和Identity.
传输内容编码:Content-Encoding
内容编码,即整个数据信息是在数据器端经过怎样的编码处理,然后客户端会以怎么的编码来反向处理,以得到原始的内容。这里的内容编码主要是指压缩编码,即服务器端压缩,客户端解压缩。
可以参考的值为:gzip,compress,deflate和identity。
传输内容格式:Content-Type
内容格式,即接收的数据最终是以何种的形式显示在浏览器中。可以是一个图片,还是一段文本,或者是一段html。内容格式额外支持可选参数,charset,即实际内容的字符集。通过字符集,客户端可以对数据进行解编码,以最终显示可以看得懂的文字(而不是一段byte[]或者是乱码)。内容长度:Content-Length

内容长度,即表示整个传输内容的有效长度信息。客户端可以通过此头信息来判断接收的数据是否已经完全接收。此编码和transfer-encoding相冲突,因为transfer-encoding会通过额外的处理方式来改变数据的组织方式,就会改变实际的数据长度,如果客户端仍按照原content-length来处理的话,则不会接收到完整的数据。

由于transfer-encoding和content-length之间存在冲突问题,因此在服务端和客户端就会有相应的实现来支持相应的数据处理。整个处理过程按照RFC 2616来处理。

处理规则:(http://tools.ietf.org/html/rfc2616#page-119所述)

If a Content-Length header field (section 14.13) is present, its
      decimal value in OCTETs represents both the entity-length and the
      transfer-length. The Content-Length header field MUST NOT be sent
      if these two lengths are different (i.e., if a Transfer-Encoding
      header field is present). If a message is received with both a
      Transfer-Encoding header field and a Content-Length header field,
      the latter MUST be ignored.

即通常使用content-length来表示内容长度。但如果存在transfer-encodig时,就不能再使用content-length了,而且也不应该再出现content-length头。既使服务器端同时有2个头信息,content-length也应该被忽略。

服务器端实现Tomcat

tomcat在实现transfer-encoding时默认采用trunked传输,但如果应用指定追加了content-length,则会使用content-length的值,就不再追加transfer-encoding了。相应的实现在类AbstractHttp11Processor方法prepareResponse中(tomcat7.0.52版本):



你可能感兴趣的:(http,协议)