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

这次的重点放在数据的解析上面。具体的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一起说掉(其实是我只解析了这两个协议,呵呵。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值