2018年,我寫過 http://www.itdecent.cn/p/a33923734d3c
極簡(jiǎn)http抓包
但是http抓包一直有問題。問題在什么地方呢?就是http協(xié)議里沒有特別明確的body長(zhǎng)度。
再加上包序一錯(cuò),就出現(xiàn)各種解決不了的問題。
那么這些問題怎么辦呢?
第一、
tcp assembly 要使用 https://github.com/google/gopacket/tree/master/reassembly
而不能使用 https://github.com/google/gopacket/tree/master/tcpassembly
tcpassembly 目錄下的 代碼很久沒有更新,很多包序處理的不好。
而 reassembly非常完善。
第二、
不要直接在run 里面通過 read 解析代碼
這樣做的缺點(diǎn)就是 當(dāng) keepalive 包存在的時(shí)候,同一個(gè)鏈接里因?yàn)閔ttp 協(xié)議里的body錯(cuò)誤
會(huì)導(dǎo)致抓不到 request 和response 開頭,導(dǎo)致整個(gè)包錯(cuò)亂。
我現(xiàn)在的解決方案是 每次read 都加一個(gè)中間環(huán)節(jié)進(jìn)行判斷。當(dāng)出現(xiàn)了新的 equest 和response 開頭。就告知上一個(gè)body 已經(jīng)結(jié)束了。
第三、 http 協(xié)議里 keepalive 包可能會(huì)出現(xiàn) request 和response不匹配
這個(gè)我目前也不是100%解決了。只能模糊匹配。實(shí)際上通過seq+時(shí)間會(huì)比較好。
但是 reassembly 在傳輸數(shù)據(jù)的時(shí)候沒有給seq,所以我只能通過時(shí)間戳 簡(jiǎn)單的判斷。
整個(gè)的代碼,我放在github上了 https://github.com/asmcos/httpdump
執(zhí)行結(jié)果:
192.168.10.110->175.27.0.201:54893->80
extshort.weixin.qq.com
POST /mmtls/1d70cf00 HTTP/1.1
Connection :[close]
Content-Length :[542]
Content-Type :[application/octet-stream]
Upgrade :[mmtls]
User-Agent :[MicroMessenger Client]
Accept :[*/*]
Cache-Control :[no-cache]
175.27.0.201->192.168.10.110:80->54893
HTTP/1.1 200 OK
Content-Type :[application/octet-stream]
Content-Length :[229]
