- 论坛徽章:
- 0
|
最近写了个sniffer程序,但在IP包重组的时候碰到一些问题,希望有人能帮忙解释下。
主要是关于struct ip结构中unsigned short int ip_off这个字段的运算问题。
因为这个字段记载了IP包的标志位和段内偏移.我对这2个计算如下:
struct ip ip_head;
//这里是计算标志位第3位,跟多段位标志,如果是0说明后面没有后续包(只是说该包是这个分组的最后一个包,不是说传输的最后一个包),1则表示还有包
ip_flag = ntohs(ip_head->ip_off) & 0x2000;
ip_flag = ip_flag >> 13;
//下面是计算这个包在原来包中的起始位置(段内偏移)
loc = ntohs(ip_head->ip_off) & 0x1FFF;
loc = loc * 8;
但从我抓包的结果来看这种算法好像不是正确的。下面是我抓的包的其中2个(只给包头,其实抓的是HTTP包,所以内容也可以列出,但节省长度就不列了)
包A:
TCP from 60.28.164.18:80 to 192.168.1.154:2671 ip flag = 0, ip id = 43987, ip off = 0
包B:
TCP from 60.28.164.18:80 to 192.168.1.154:2671 ip flag = 0, ip id = 43988, ip off = 0
其中ip id指的就是struct ip中的ip_id字段。
包A的内容结尾是:
if(window.location.search.indexOf("from=mail")
包B的内容开头是:
== -1){
2个合并起来刚好是一个JS代码的判断语句。从ip id上看,这2个包很有可能是一个IP包中途被分片,但ip flag却显示位0, 偏移量显示的也为0。所以可能计算有错误。当然也有可能是其它错误。
希望知道的同学给点帮助,谢谢。
|
|