当前位置: 首页 > news >正文

网站建设与维护视频教程天猫网站怎么做

网站建设与维护视频教程,天猫网站怎么做,h5平台网站开发,中国建筑出版在线官网appHTTP1.1中CHUNKED编码解析 一般HTTP通信时#xff0c;会使用Content-Length头信息性来通知用户代理#xff08;通常意义上是浏览器#xff09;服务器发送的文档内容长度#xff0c;该头信息定义于HTTP1.0协议RFC 1945 10.4章节中。浏览器接收到此头信息后#xff0c;接受…HTTP1.1中CHUNKED编码解析 一般HTTP通信时会使用Content-Length头信息性来通知用户代理通常意义上是浏览器服务器发送的文档内容长度该头信息定义于HTTP1.0协议RFC  1945  10.4章节中。浏览器接收到此头信息后接受完Content-Length中定义的长度字节后开始解析页面但如果服务端有部分数据延迟发送吗则会出现浏览器白屏造成比较糟糕的用户体验。 解决方案是在HTTP1.1协议中RFC  2616中14.41章节中定义的Transfer-Encoding: chunked的头信息chunked编码定义在3.6.1中所有HTTP1.1 应用都支持此使用trunked编码动态的提供body内容的长度的方式。进行Chunked编码传输的HTTP数据要在消息头部设置Transfer-Encoding: chunked表示Content Body将用chunked编码传输内容。根据定义浏览器不需要等到内容字节全部下载完成,只要接收到一个chunked块就可解析页面.并且可以下载html中定义的页面内容,包括js,css,image等。 采用chunked编码有两种选择,一种是设定Server的IO buffer长度让Server自动flush buffer中的内容另一种是手动调用IO中的flush函数。不同的语言IO中都有flush功能 l         php:    ob_flush(); flush(); l         perl:   STDOUT-autoflush(1); l         java:  out.flush(); l         python:  sys.stdout.flush() l         ruby:  stdout.flush 采用HTTP1.1的Transfer-Encoding:chunked,并且把IO的buffer flush下来,以便浏览器更早的下载页面配套资源。当不能预先确定报文体的长度时不可能在头中包含Content-Length域来指明报文体长度此时就需要通过Transfer-Encoding域来确定报文体长度。 Chunked编码一般使用若干个chunk串连而成最后由一个标明长度为0的chunk标示结束。每个chunk分为头部和正文两部分头部内容指定下一段正文的字符总数非零开头的十六进制的数字和数量单位一般不写,表示字节.正文部分就是指定长度的实际内容两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的chunk中的内容是称为footer的内容是一些附加的Header信息通常可以直接忽略。 上述解释过于官方简而言之chunked编码的基本方法是将大块数据分解成多块小数据每块都可以自指定长度其具体格式如下(BNF文法) Chunked-Body   *chunk            //0至多个chunk last-chunk         //最后一个chunk trailer            //尾部 CRLF               //结束标记符 chunk           chunk-size [ chunk-extension ] CRLF chunk-data CRLF chunk-size     1*HEX last-chunk     1*(0) [ chunk-extension ] CRLF chunk-extension *( ; chunk-ext-name [ chunk-ext-val ] ) chunk-ext-name token chunk-ext-val   token | quoted-string chunk-data     chunk-size(OCTET) trailer         *(entity-header CRLF) 解释 l         Chunked-Body表示经过chunked编码后的报文体。报文体可以分为chunk, last-chunktrailer和结束符四部分。chunk的数量在报文体中最少可以为0无上限 l         每个chunk的长度是自指定的即起始的数据必然是16进制数字的字符串代表后面chunk-data的长度字节数。这个16进制的字符串第一个字符如果是“0”则表示chunk-size为0该chunk为last-chunk,无chunk-data部分。 l         可选的chunk-extension由通信双方自行确定如果接收者不理解它的意义可以忽略。 l         trailer是附加的在尾部的额外头域通常包含一些元数据metadata, meta means about information这些头域可以在解码后附加在现有头域之后 下面分析用ethereal抓包使用Firefox与某网站通信的结果从头域结束符后开始 Address  0..........................  f 000c0                       31 000d0    66 66 63 0d 0a ...............   // ASCII码:1ffc/r/n, chunk-data数据起始地址为000d5 显然“1ffc”为第一个chunk的chunk-size,转换为int为8188。由于1ffc后马上就是CRLF,因此没有chunk-extension。chunk-data的起始地址为000d5, 计算可知下一块chunk的起始 地址为000d51ffc 2020d3如下 020d0    .. 0d 0a 31 66 66 63 0d 0a .... // ASCII码:/r/n1ffc/r/n 前一个0d0a是上一个chunk的结束标记符后一个0d0a则是chunk-size和chunk-data的分隔符。 此块chunk的长度同样为8188, 依次类推直到最后一块 100e0                          0d 0a 31 100f0    65 61 39 0d 0a......            //ASII码/r/n/1ea9/r/n 此块长度为0x1ea9 7849, 下一块起始为100f5 1ea9 2 11fa0,如下 11fa0    30 0d 0a 0d 0a                  //ASCII码0/r/n/r/n “0”说明当前chunk为last-chunk, 第一个0d 0a为chunk结束符。第二个0d0a说明没有trailer部分整个Chunk-body结束。 解码流程 对chunked编码进行解码的目的是将分块的chunk-data整合恢复成一块作为报文体同时记录此块体的长度。 RFC2616中附带的解码流程如下(伪代码 length : 0         //长度计数器置0 read chunk-size, chunk-extension (if any) and CRLF      //读取chunk-size, chunk-extension和CRLF while(chunk-size 0 )    {            //表明不是last-chunk read chunk-data and CRLF            //读chunk-size大小的chunk-data,skip CRLF append chunk-data to entity-body     //将此块chunk-data追加到entity-body后 length : length chunk-size read chunk-size and CRLF          //读取新chunk的chunk-size 和 CRLF } read entity-header      //entity-header的格式为name:valueCRLF,如果为空即只有CRLF while entity-header not empty)   //即不是只有CRLF的空行 { append entity-header to existing header fields read entity-header } Content-Length:length      //将整个解码流程结束后计算得到的新报文体length作为Content-Length域的值写入报文中 Remove chunked from Transfer-Encoding  //同时从Transfer-Encoding中域值去除chunked这个标记 length最后的值实际为所有chunk的chunk-size之和在上面的抓包实例中一共有八块chunk-size为0x1ffc(8188)的chunk,剩下一块为0x1ea9(7849),加起来一共73353字节。      注对于上面例子中前几个chunk的大小都是8188,可能是因为:1ffc 4字节rn2字节加上块尾一个rn2字节一共8字节因此一个chunk整体为8196,正好可能是发送端一次TCP发送的缓存大小。 最后提供一段PHP版本的chunked解码代码 $chunk_size  (integer)hexdec(fgets( $socket_fd, 4096 ) ); while(!feof($socket_fd)  $chunk_size  0) { $bodyContent . fread( $socket_fd, $chunk_size ); fread( $socket_fd, 2 ); // skip /r/n    $chunk_size  (integer)hexdec(fgets( $socket_fd, 4096 ) ); }       其C语言的解码如下java思路相同 int nBytes; char* pStart a;    // a中存放待解码的数据 char* pTemp; char strlength[10];   //一个chunk块的长度 chunk  : pTemp strstr(pStart,/r/n);              if(NULLpTemp)              {                       free(a);                  aNULL;                      fclose(fp);                      return -1;              }              lengthpTemp-pStart;              COPY_STRING(strlength,pStart,length);              pStartpTemp2;              nBytesHex2Int(strlength); //得到一个块的长度并转化为十进制                                             if(nBytes0)//如果长度为0表明为最后一个chunk             {                 free(a);                        fclose(fp);                        return 0;                }                fwrite(pStart,sizeof(char),nBytes,fp);//将nBytes长度的数据写入文件中                pStartpStartnBytes2; //跳过一个块的数据以及数据之后两个字节的结束符                fflush(fp);                goto chunk; //goto到chunk继续处理      如何将一个十进制数转化为十六进制 char *buf (char *)malloc(100); char *d buf; int shift 0; unsigned long copy 123445677; while (copy) {          copy 4;          shift; }//首先计算转化为十六进制后的位数 if (shift 0)          shift; shift 2; //将位数乘于4如果有两位的话 shift为8 while (shift 0) {          shift - 4;          *(buf) hex_chars[(123445677 shift) 0x0F];           buf; } *buf /0;   原文链接http://blog.csdn.net/zhangboyj/article/details/6236780   参考http://bbs.csdn.net/topics/390333793转载于:https://www.cnblogs.com/12taotie21/p/3916980.html
http://www.zqtcl.cn/news/440744/

相关文章:

  • 利用帝国软件如何做网站网站友链交换平台
  • 简述网站开发技术深圳网站设计合理刻
  • wordpress网站名称寻找销售团队外包
  • 一浪网站建设网页qq邮箱
  • 做网站需要注册公司吗夫唯seo系统培训
  • 沈阳人流哪个医院好安全百度关键词优化怎么做
  • 1688网站怎么做分销高质量的网站内容建设
  • 网站建设公司济宁网站转跳怎么做
  • 镇江网站设计多少钱企业网络部署方案
  • 建网站的公司浩森宇特wordpress登录缓存
  • 便宜建站空间战队头像在线制作免费
  • 做招聘网站赚钱吗厦门网站建设哪里好
  • 新乡网站建设哪家公司好阿里巴巴做国际网站多少钱
  • 怎么在悉尼做网站dede做手机网站
  • 企业网站模板免费下载品牌建设专家库推荐表
  • 辽宁智能网站建设推荐网络营销推广方案创意
  • 安阳做一个网站多少钱东营做网站公司
  • 深圳市罗湖网站建设百度自助建站官网
  • 网站开发安装环境网站建设销售话术
  • 网站权重网站栏目划分的原则
  • 国际网站建设的目的我的百度账号登录
  • 温州网站设计定制博客和网站的区别
  • 益阳建设网站wordpress加载图片慢
  • 网站官网阜新网站开发公司
  • 适合做网站的图片印刷公司网站模板
  • 南昌哪家网站建设最好网站建设的方法有
  • 东莞做网站 动点官网百度开户流程
  • 中力建设网站怎么做自己的门户网站
  • 做的网站必须放做音乐网站的目地
  • 网站备案下来以后怎么做网页万网创始人张向东