linuxchyu 发表于 2013-06-02 21:48

关于HTTP请求报文的分片分析[已解决]

本帖最后由 linuxchyu 于 2013-06-04 13:44 编辑

最近在做抓取Http请求报文分析的工作,先上抓取分析结果:(我是基于libpcap用C语言写的工具)**** *****1: 21:11:27cap len :1514 **** ****
frag : 0x4000 //相应IP报文的标记字段  
data length :1460//TCP数据段的数据长度 ,以下是数据字段对应的字符显示:
POST /aj/mblog/add?_wv=5&__rnd=1370178687496 HTTP/1.1
Host: weibo.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.11) Gecko/20121121 Firefox/10.0.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://weibo.com/u/2948108023?wvr=5&wvr=5&lf=reg
Content-Length: 100
Cookie: __utma=15428400.2100457009.1357316613.1357316613.1357316613.1; __utmz=15428400.1357316613.1.1.utmcsr=blog.sina.com.cn|utmccn=(referral)|utmcmd=referral|utmcct=/s/blog_86fe5b440100uni3.html; UOR=www.sina.com.cn,weibo.com,www.sina.com.cn; SINAGLOBAL=790171170880.6036.1370174363284; ULV=1370174363524:1:1:1:790171170880.6036.1370174363284:; ALF=1372766390; un=linuxchyu@sina.com; wvr=5; SinaRot_wb_r_topic=38; USRUG=usrmdins1540_24; _s_tentry=www.sina.com.cn; Apache=790171170880.6036.1370174363284; USRHAWB=usrmdins540_96; SUE=es%3Dc3adf336a31c0ee65023772a769a60cf%26ev%3Dv1%26es2%3D889111db824299fda73c6d0055de9600%26rs0%3DClD8mrOWsCZnFYSL8kTv2aVIVmRRV7xT2UWXM3uGgQPXtcP4P0LlhztuA5zBwLUUkQOVaBSJreyg6pLmHBjbZsN%252BdgREjcIAcUU0ozXyXHgmOA5DPbG2w5wb30jObcprOAS0AiZcWCkO75oS6eW1qm6F9lLd3SDWso8QEXu%252Fsfg%253D%26rv%3D0; SUP=cv%3D1%26bt%3D1370174391%26et%3D1370260791%26d%3Dc909%26i%3D5df2%26us%3D1%26vf%3D0%26vt%3D0%26ac%3D0%26st%3D0%26uid%3D2948108023%2

**** *****2: 21:11:27cap len :427 **** ****
frag : 0x4000 //相应IP报文的标记字段  
data length :373//TCP数据段的数据长度 ,以下是数据字段对应的字符显示: 6user%3Dlinuxchyu.%252A%252A%26ag%3D9%26name%3Dlinuxchyu%2540sina.com%26nick%3D%25E8%2583%259C%25E5%25AF%2592%26fmp%3D%26lcp%3D; SUS=SID-2948108023-1370174391-GZ-rufv3-d826802439e42d1599021a9c28e68649; SSOLoginState=1370174391
Pragma: no-cache
Cache-Control: no-cache

text=6666666666666666&pic_id=&rank=0&rankid=&_surl=&hottopicid=628&location=home&module=stissue&_t=0通过分析以上两个报文可以知道,一个Http请求被拆分为两个报文发送,但是第一个报文的Ip MF字段又没有被标记,请问大家根据什么才能将以上两个报文的数据字段合并?也就是说怎么才能知道以上两个报文实际上是属于同一个Http请求的报文?又知道用wireshark抓取的以上同一个Http报文,发现抓取结果是合并后的报文。wireshark又是根据什么来合并以上两个分开的报文?

解决问题的方向找到了,其实就是TCP会话重组,下一步就是实现TCP会话重组了。

solu 发表于 2013-06-02 23:49

http是TCP协议

linuxchyu 发表于 2013-06-03 00:00

本帖最后由 linuxchyu 于 2013-06-03 00:00 编辑

回复 2# solu
是TCP协议,问题是怎么把几个分片组合到一起,依据是什么?
   

csumck 发表于 2013-06-03 07:48

http是更上层的东西。你抓到的是tcp包,理论上有可能出现一个包里包含了前一个请求的末尾部分核后一个包的开始部分的。你抓到包后严格按照http协议来就可一了(http包的length头或着空行结尾),这就跟自己写了一个协议一样的。假设你自己写了一个http服务器,你怎么从客户端发来的数据里提取一个个http请求呢? 一样的道理。

linuxchyu 发表于 2013-06-03 13:56

本帖最后由 linuxchyu 于 2013-06-03 13:59 编辑

回复 4# csumck


    谢谢你的回答,但是这些不是问题,我想知道的是如何知道几个不同的分片是属于同一个HTTP请求数据?因为抓取的所有的分片IP包头里的MF标志位为0.
并且这和自己写HTTP服务器不用,如果是在服务器中则很容易获得完整的HTTP请求数据,但是我的需求是利用libpcap抓取数据包,如何根据抓取的数据包判断哪
几个数据包是属于同一个HTTP请求?

lenky0401 发表于 2013-06-03 16:20

HTTP是七层协议,所以会由七层应用去把握,TCP关心不到。
至于判断哪几个数据包是属于同一个HTTP请求,会有对应的头字段作标记的,你看一下RFC 2616文档后,应该就知道了。

lenky0401 发表于 2013-06-03 16:22

你需要对数据做一下解析,如果你在不解析HTTP协议数据的情况下,应该是无法实现你的目的。

linuxchyu 发表于 2013-06-03 18:45

回复 7# lenky0401


    呵呵,对HTTP请求报文分析是肯定要做的事情,但是,在服务器端要用基于libpcap的工具抓取所有到达服务器的http请求报文,并且,抓取的数据是直接过滤复制网卡的数据,那么需要根据什么规则判断哪些报文是属于同一个HTTP请求报文呢?

csumck 发表于 2013-06-03 18:56

回复 5# linuxchyu


    没用过libpcap,不太理解难点在哪里? 你是说所有连接的http包你都抓到一起了吗, 如果是的话,那通过客户端端口号就可以区分请求所在连接了。
   看你1楼贴的抓到的内容,似乎就是同一连接上的1个http请求分到两次抓包抓到了, 这跟自己做服务器的时候不是一样的麼,自己做服務器也是1個請求可能分兩次收取完。

linuxchyu 发表于 2013-06-03 19:10

本帖最后由 linuxchyu 于 2013-06-03 19:11 编辑

回复 9# csumck

呵呵,这是通过libpcap工具抓取的包,是直接复制网卡上的数据,这个工具运行在服务器端的机器上,抓取的是所有发到端口号是80的tcp数据包,所有的客户端的http请求数据包会同时出现在网卡上,需要通过一些规则找出哪些属于同一个HTTP请求报文的数据包。

   
页: [1] 2
查看完整版本: 关于HTTP请求报文的分片分析[已解决]