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

上次说了基础的数据包解析,这次先说UDP包的。

上次说到了第33位数据。再往后,如果包头部分还没结束,就是option的内容了。到这里,总共分析过的数据长度为:14位的ip头和一定长度的数据包头。

接下来,就从上面说到的地方开始从新计数,仅仅是为了叙述方便。

这样,接下来的1,2两位是源IP地址的端口,3,4两位是目的IP地址的端口。5,6两位是UDP包的长度。7,8两位是UDP包的crc码,后面的就是具体的数据内容了。

那么,UDP包的crc怎样验证呢?它比上次说过的数据包的crc验证来得复杂一点。过程如下:

先定义一个累加变量:
long sum = 0;
然后两位两位的加,把IP地址先加进来,其实就是数据包里面的26-34这个段的数据。
for (int i = 26; i <34 ;i++)
{
sum+= (data[i]<<8) + data[i+1];
}

接着把UDP包的内容都加进来,也是两位两位的加。不过呢,这次可能就会遇到数据包长度为奇数的情况了。如果是奇数,就把最后一位直接加上来就可以了。
这个过程我就省略了。

继续加,这次加个17。对,就是17。因为17就是UDP包的表示码啊。

剩下的步骤就跟解析数据包头的步骤一样了,就是先把高16位加到低16位上,然后再这样加一次,然后进行比较验证就可以了,代码如下:
sum = (sum>>16) + (sum & 0xffff);
sum += (sum>>16);
if ((short)(~sum) == 0)
{
//true
}

到这里,UDP数据包的验证就结束了。

下面说TCP的。
套用上面的方式,也从新开始计数,从1开始。
1、2、3、4这4位是seqnum;5、6、7、8这4位是acknum;
9位是Offset
10位是Flags
11、12位是windows
13、14位是Urgent
剩下的就是真正的数据了。

验证方法如下:
也是先把IP地址加上,跟UDP一样,然后是从seqnum开始到结束的数据也加上,如果个数为奇数,就把最后一位直接加上。
接着加6 ,因为6是TCP的标识码。
然后加上TCP包的长度,这个长度,是从IP地址的开始处开始算,一直到结尾的长度。举例来说,一般ip头长14,数据包头长20,要加的长度就是去掉这个14+20之后的长度了。
不知道是不是写得太粗了~

到这里,数据包就算解析完成了.剩下的就是数据分析了.这个下次写吧.

然后,重复上面的高16位加到低16位那一套过程,没有区别了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值