记得以前做网盘相关的东西时候因为要涉及到上传数据都网盘,而且都是通过http协议进行的,所以当时还专门去好好的学习了一下http协议,后来看nginx源码的时候因为要解析http报文,所以相当于又复习了一次http协议的内容,最近遇到的东西涉及到了chunked(netty有一个chunkedwritehandler),当时就没有看,那么这次搞明白补上吧..
首先复习一下:
http报文分成了3部分;
(1)request-line GET /cache/aladdin/ui/jquery/jquery.js HTTP/1.1
(2)Connection: keep-alive
(3)body部分。。。(当然不是都有的)
requestline之后会有一个回车换行作为结束(\r\n),然后header部分的每一个栏目都需要一个回车换行来分开,最后用一个空的回车换行来作为结束。。
那么最后就是body部分了,一般情况下在header部分会有一个栏目:content-length,用于指明body部分的数据大小,那么我们在读取数据的时候只要读取相应大小的字节数据就表示body已经读完了。。。
但是有的情况下如果没有content-length,那么就需要那么就需要chunked来传输body的数据了。。。
如果采用了chunked方式来传输数据的话,那么需要在header部分添加一个栏目:
transfer-encoding:chunked
用于指明body部分是采用chunked的方式来传输的。。。
那么记下来就来说明chunked的内容吧:
chunked,其实看名字就能够看出来,数据是一块一块的发送的,其中每一块分为两个部分:
(1)chunked头部 (2)chunked的body
每一部分之后都需要一个回车换行来隔开。。。 其中头部其实就是一个整数,用于表示body的长度
例如 5\r\nabcde\r\n
这里还有一个尾部的chunked,它的头部值为0,如下:
0\r\n\r\n
好了,chunked本身定义还挺简单的。。。自己以前居然都觉得懒得去搞明白。。汗。。。