Chunked 数据块的重组
本文主要针对网页数据由 N 个 chunked 数据块组成的情况进行分析。
一、 chunked 块的组成结构
每一个 Chunked 数据块包含两部分,两部分用字符串 ”/r/n” 区分开,主要内容是:
1. 数据块的长度 (16 进制 )
2. 数据部分
所以单独的 chunked 块结构如: A0/r/ndata…./r/n
A0 为 16 进制的数据长度; data… 为数据部分,长度是 A0;
多个 chunked 的组成形式如:
A0/r/n[dataof(chunked)]/r/nB0/r/n[dataof(chunked)]/r/n A1/r/n[dataof(chunked)]/r/n 0/r/n/r/n
在整个 chunked 的结束部分由字符“ 0/r/n/r/n ”来表示。
二、 chunked 的解码代码
Chunked 的解析工做主要是将 chunked 块中的数据部分根据给出的长度提取出来。
代码如下:
二、 chunked 网络包数据信息的提取方式
chunked 块中关键字的获取,总的来说可以用两种方法:
1. 每来一个数据包,都提取出 gzip 压缩包,然后解压
2. 等所有数据包重组完成,一次性提取 gzip 压缩包解压
当然两种方式都有存在优点与缺点:
使用第一种方法:
优点:如果包中包含关键字,可以很快检测,后面的包就不需要接收了。
缺点:如果检测的网页中不包含关键字,那么这个工作将一直持续下去,知道整个网页都发送结束。因为解压的时候需要依赖前面所有的包,
假设有 100 个数据包,那么第一个包就要解压 100 次,第二个 99 次,依次递减。
总共要解压的次数是 : ( 100+1 ) *100/2
使用第二种方法:
优点:不用每次数据包过来都重组、解析 chunked 、解压。操作次数减少很多
缺点:每次都要等数据全部收集完成重组才能解包。如果包中包含关键字信息,可能在前 10 个包中就有,这时候依然要等待所有的包都发送过来才能提取 chunked 和解压。
用统计方法决定:
根据被检测关键字与库中的比例