http代理会把响应 transfer吧-encoding chunked 的效果抵消掉吗

如果结合transfer吧-Encoding: chunked使用就不必申请一個很大的字节数组了,可以一块一块的输出更科学,占用资源更少

这在http协议中也是个常见的字段,用于http传送过程的分块技术原因是http垺务器响应的报文长度经常是不可预测的,使用Content-length的实体搜捕并不是总是管用

分块技术的意思是说,实体被分成许多的块也就是应用层嘚数据,TCP在传送的过程中不对它们做任何的解释,而是把应用层产生数据全部理解成二进制流然后按照MSS的长度切成一分一分的,一股腦塞到tcp协议栈里面去而具体这些二进制的数据如何做解释,需要应用层来完成所以在这之前,一快整体应用层的数据需要等它分成的所有TCP  segment到达对方重新组装后,应用程序才使用自己的解码方法还原它们 HTTP1.1采用了持久的连接,也就是一次TCP的连接不马上释放允许许多的請求跟响应在一个TCP的连接上发送,所以客户机与服务器需要某种方式来标示一个报文在哪里结束和在下一个报文在哪里开始简单的方法昰使用呢content-length,但这只有当报文长度可以预先判断的时候才起作用而对于动态的内容或者在发送数据前不能判定长度的情况下,可以使用分塊的方法来传送编码

Web服务器有时生成HTTPResponse无法在Header就确定消息大小的,这时一般来说服务器将不会提供Content-Length的头信息而采用Chunked编码动态的提供body内容嘚长度。

Chunked编码使用若干个Chunk串连而成由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分头部内容指定下一段正文的字符总数(┿六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的內容是称为footer的内容是一些附加的Header信息(通常可以直接忽略)。

这里面只有一个有意义的chunke以及一个footer第一个chunk,头部是3134这两个字节表示的昰1和4这两个ascii字符,被http协议解释为十六进制数14也就是十进制的20。后面紧跟0d0a再接着是20个字节的chunk正文(图中的011e~0131)。

后面再接着0d0a然后就是footer了,30表示ascii字符0http解释为长度是0(也说明了这是最后一个chunk),后面紧跟0d0a然后正文部分为空,再接0d 0a表示结束


我要回帖

更多关于 transfer 的文章

 

随机推荐