1. 程式人生 > >libpcap抓完整的http分包;http分包的拼包機制,

libpcap抓完整的http分包;http分包的拼包機制,



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 分包的最後一個包了。