2012-09-10 170 views
1

即時計算我的數據包的正確ip校驗和有問題。下面是代碼,我會解釋什麼IM做的和什麼錯誤..IP校驗和計算不正確

所有的
u_short checkSum(u_short *data, int byteCount){ 
int i, sum = 0; 

for(i = 0; i < byteCount/2; i++){ 
    if(i == 5) continue; 
    sum += *data++; 
} 

while(sum >> 16) 
sum = (sum & 0xffff) + (sum >> 16); 
return (u_short)~sum; 
} 

首先,我的作用是一般用於計算髮送數據的16位校驗和。 ByteCount被假定爲僅用於測試目的。總和是我保留32位和的變量(當16位總和溢出時,我可以將溢出保持在高16位一半)。用for循環遍歷數據的16位數據塊並對它們進行求和,將數據指針遞增(16位爲u_short),如果測試跳過頭部的校驗和部分,則有一個數據指針。可以看出在RFC 791中,校驗和部分是頭中的第6個16位塊(在我的情況中是5,因爲我從0開始計數)。在數據求和之後,我將高16位加到低16位,並將32位整數折成16位短路。最後,我反轉這些位(補碼)並將16位中的32位縮短並將其返回給調用者函數。

這不是提供從pcap發送給我的正確校驗和(我用它來嗅探數據包)。這是我打電話給我的功能來比較結果..

if(etherHdr->ether_type == 8){ 
    ipHdr = (struct ip*) (packet + sizeof(struct ether_header)); 
    printf("chck: %04x mychck: %04x\n\n", ipHdr->ip_sum, checkSum((u_short*)ipHdr, sizeof(struct ip))); 
} 

IF是在濾除僅IP數據包(在以太網報頭類型字段代碼8)..

,這是輸出時我跑我的程序..

CHCK:EF66 mychck:06ee

CHCK:3db8 mychck:0264

CHCK:9615 mychck:0000

CHCK:edef mychck:ff64

CHCK:59f1 mychck:0164

CHCK:49f1 mychck:0264

CHCK:a3d4 mychck:0c77

CHCK:e36b mychck:0264

CHCK:aad4 mychck:0c77

CHCK:46d1 mychck:0c77

CHCK:f40b mychck:0264

CHCK:a8d4 mychck:0c77

我下載在網絡上跑來跑去其他代碼示例和那些都給出了每一個IP報頭包含在它的時候結果pcap轉發數據包到我的代碼..

請幫助,如果你可以,謝謝。

+0

您的網卡是否支持校驗和卸載?如果是這樣,你可能會收到錯誤的校驗和。 HTTP://維基。wireshark.org/TCP_Checksum_Verification –

+0

卸載據我瞭解,意味着校驗和是在數據包被注入網絡之前計算的? – stefo0O0o

回答

1

正確的方法在RFC 1071中給出。你很近,但沒有雪茄。

+0

這是否意味着rfc 791在校驗和部分無關緊要? – stefo0O0o

+0

@ user1661352完全沒有。你有沒有證據表明他們不同意? – EJP

0

也許嘗試此計算校驗和的源代碼,我正在使用它,它對我的​​軟件非常有用。

  int 
checksum 
      (unsigned short * data, 
      int   length) 
{ 
    register int    nleft = length; 
    register unsigned short  * w = data; 
    register int    sum = 0; 
    unsigned short    answer = 0; 

    while (nleft > 1) 
    { 
     sum  += *w++; 
     nleft -= 2; 
    } 

    if (nleft == 1) 
    { 
     *(unsigned char *)(&answer) = *(unsigned char *)w; 
     sum+=answer; 
    } 

    sum = (sum>>16) + (sum & 0xffff); 
    sum += (sum>>16); 
    answer = ~sum; 

    return answer; 
} 
+0

虐待嘗試,謝謝...但我認爲我的代碼是附近你寫的這裏.. – stefo0O0o

+0

不適合我..給我0000(十六進制)爲每個包=/ – stefo0O0o

+0

謝謝,它的工作,我沒有意識到我得到0的原因校驗和摺疊校驗和字段中計算的校驗和。我將它設置爲0,我得到正確的校驗和。再次感謝! – stefo0O0o