即時計算我的數據包的正確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轉發數據包到我的代碼..
請幫助,如果你可以,謝謝。
您的網卡是否支持校驗和卸載?如果是這樣,你可能會收到錯誤的校驗和。 HTTP://維基。wireshark.org/TCP_Checksum_Verification –
卸載據我瞭解,意味着校驗和是在數據包被注入網絡之前計算的? – stefo0O0o