1,创建一个buffer list, 这个buffer list的总体大小不超过4M,
2,抓包: 网络包都大于64byte; 如果小于64,当做坏包处理,
3,如果当前的list 是空,并且整个包长小于 140 (tcp + http head ... 知道出现content length)
如果tcp包的,tcp.flags==0x18 :
并且pkt_data+34 是“HTTP” , 或者进一步判断是 HTTP/1.1 200 OK
如果是,说明这个包是http的response的开头。
寻找当前的content length ,并求出content length的大小。
如果没有找到content length,也没有找到 Transfer-Encoding : 那这种包,我还没有见过。
如果找到content length ,那判断pkt_data 的剩余长度 + 4 (\r\n\r\n),是不是 恰好是content length,
如果是-恰好说明是: 这个包已经是一个完整的http 包了,没有分包,即没有出现 数据被分包的问题。
如果不是-- 说明数据被分包了,请把下列属性当成一个 list 的一个节点。
src_ip,dst_ip,src_port,dst_port,seq ,next_seq, ack, current_buffer,cur_buf_len.
请把这个member ,增加到 list里面。
如果当前的list 非空,
那对比当前的 这些属性 是否和list的某个成员的属性一致: src_ip,dst_ip,src_port,dst_port,seq ,next_seq, ack
注意ack ,seq的大小端问题: BigLittleSwap32。
如果属性匹配那把这个buffer 增加到 旧的buffer后面,再次call : Check_http_content_is_end
如果分包的话,一般情况下包的长度的序列如下:X,X,X,X,...Y ,并且X>Y,
如果中间出现某些 包的PDU_Packet_length 和 X的包长不相等 --- 至少我没有见过, 那我就报错了。
如果不相等,去判断Check_http_content_is_end()了。
如果没有content-length ,na zhoad transfer-Encoding: 看是否是chunked.
如果最后一个包的tcp的flag: 是0x18 (PSH,ACK), 这更能说明是这是一个http 分包的最后一个包了。