您的位置:首页 > 理论基础 > 计算机网络

.net下基于winpcap实现的网络分析程序(二)

2008-01-07 16:09 288 查看
这次的重点放在数据的解析上面。具体的winpcap的操作嘛,因为官方的手册已经很好很强大了,我就不废话了。只在这里留个链接好了,大家可以自行去看。

中文的手册:http://www.coffeecat.net.cn/winpcap/html/index.html

现在呢,假设我们已经抓取到了一个数据包。数据包解析还涉及到了大数小数的问题。为了方便,这里就不详细区分了,仅仅以比较常见的格式来描述了,并且还是IPv4的。

通过winpcap得到的数据包,0到5位这6个byte是目的MAC地址,6到11这6个byte是源MAC地址。接着的12、13两位是以太网类型。到这里说到的总共14位是ip数据包头,不算在数据包的里面。

再接下来的第14位,前面4个bit,也就是高位的4个bit,表示版本号,后面的4个bit表示数据包头的长度。这个长度是有一个计算公式的,实际的长度要拿这个数乘以4。15位是服务类型,16、17两位表示数据包头的总长度,这个总长度,就是用winpcap获得的数据包长度减去14。减去的14,就是上面说的数据包头,它不计算在数据包长度里面。

接着18、19位是ID,20、21位是flags和offset,22是ttl。23很有用,它是协议包类型,表示此包是tcp或者udp或者igmp等等。24、25两位是“数据包的头的crc码”,它的计算范围是从15位开始的数据包头长度个数的数据的crc。具体的计算方法网上虽然很容易找到,但是也经常有错误的。我这里就再说一次。

计算的时候,用32位的整形来累计结果。数据要两位两位的取,第一位做为高位,第二位做为低位,组成一个16位的整数,然后把这些整数相加。如果长度是奇数,那……放心好了,因为前面说过了,长度要乘以4的,所以肯定是偶数啦,呵呵。

代码如下:

long sum = 0;

for(int i = 0;i < headlen;i+=2)

{

sum+= (data[i + 14]<<8) + data[i+15];

}

然后把累加好的和的高16位加到低16位上。

代码如下:

sum = (sum>>16) + (sum&0xffff);

最后再把高16位加到低16位上,这样做主要是为了防止上面一步出现了进位,导致sum超过0xffff。

代码如下:

sum+=(sum>>16);

现在就可以进行crc检测了,代码如下:

if ((short)(~sum) == 0)

return true;

else return false;

刚才扯得多了些,下面继续说其他位的意义。

26、27、28、29表示源IP地址,4位分别表示IP地址的4段。30、31、32、33表示目的IP地址。再往后,如果包头部分还没结束,就是option的内容了。不过看起来,那样的数据包似乎很少见的。也许我说的不对,还希望大家指出来。

为了说着方便,我就假定没有后面的option内容了。其实如果真没有的话,头的长度就固定是20了,也就不需要再标示头的长度了。

刚才说的那个crc计算,就是截至到这里的。

这次就写这些了。下次把TCP和UDP一起说掉(其实是我只解析了这两个协议,呵呵。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐