作者ireullin (raison detre)
看板Network
标题[问答] 网路封包的checksum计算有问题
时间Wed Dec 28 11:31:41 2011
请问一下各位
小弟最近在撰写发送网路卡封包的程式
在计算Tcp checksum的时候一直发生一个怪问题
就是checksum的值应该为 0xf3ac 的时候
我计算出来的都是 0xd3ac
我改变了封包的内容再算一次
正确的值应该是0xf3e7
我算出来是0xd3e7
我正确的值是用另外一个程式送
然後用wireshark去拦截回来看的
然後我再把这个正确的值直接填到我的封包中
我的封包就正常运作了
所以应该能确定是计算的时候出了问题
以下是我的程式码
请给我一些意见
谢谢大家
P.S 一样的这个涵式计算ip checksum的时候都正常没有问题
只有计算tcp checksum会出错
unsigned short GenerateChecksum(unsigned short *buffer,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(unsigned short);
}
if(size)
{
cksum+=*(unsigned char *)buffer;
}
while (cksum>>16)
{
TRACE_RECORD;
cksum=(cksum>>16)+(cksum & 0xffff);
}
return (unsigned short) (~cksum);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.220.71.34
1F:推 zaknafein:其实这是程式问题=_= 12/28 20:43
2F:推 overxxx:if(size)里的值应该要<<8再加到checksum,因为是後面要补0 12/29 03:03
3F:→ overxxx:但我不是很确定 12/29 03:14
4F:→ overxxx:不然就是先把buffer的值印出来跟wireshark比对是不是一样 12/29 03:19
5F:→ overxxx:刚刚google发现到tcp checksum的计算有点不同,还要加 12/29 03:57
6F:→ overxxx:src ip, dest ip, tcp port, tcp length 12/29 03:58