作者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
推 zaknafein:其實這是程式問題=_= 12/28 20:43
推 overxxx:if(size)裡的值應該要<<8再加到checksum,因為是後面要補0 12/29 03:03
→ overxxx:但我不是很確定 12/29 03:14
→ overxxx:不然就是先把buffer的值印出來跟wireshark比對是不是一樣 12/29 03:19
→ overxxx:剛剛google發現到tcp checksum的計算有點不同,還要加 12/29 03:57
→ overxxx:src ip, dest ip, tcp port, tcp length 12/29 03:58