[問答] 網路封包的checksum計算有問題

看板Network作者 (raison detre)時間14年前 (2011/12/28 11:31), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串1/1
請問一下各位 小弟最近在撰寫發送網路卡封包的程式 在計算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

12/28 20:43, , 1F
其實這是程式問題=_=
12/28 20:43, 1F

12/29 03:03, , 2F
if(size)裡的值應該要<<8再加到checksum,因為是後面要補0
12/29 03:03, 2F

12/29 03:14, , 3F
但我不是很確定
12/29 03:14, 3F

12/29 03:19, , 4F
不然就是先把buffer的值印出來跟wireshark比對是不是一樣
12/29 03:19, 4F

12/29 03:57, , 5F
剛剛google發現到tcp checksum的計算有點不同,還要加
12/29 03:57, 5F

12/29 03:58, , 6F
src ip, dest ip, tcp port, tcp length
12/29 03:58, 6F
文章代碼(AID): #1E-esV32 (Network)