簡體   English   中英

在C中計算IP校驗和

[英]Calculating IP checksum in C

我查看了RFC 1071 ,了解有關計算IP校驗和的一些信息。 對於我正在制作的應用程序,我需要計算20字節IP標頭的IP校驗和(無選項)。 我的代碼如下:

uint16_t calculate_ip_chksum(IP *ip)
{
    uint16_t *buf = (uint16_t *) ip;
    uint32_t sum = 0;
    uint16_t checksum = 0;

    int counter = (ip->version & 0xF) * 4;
    while (counter > 1)
     {
            sum += *buf++;
            counter -= 2;
     }

    if (counter == 1)
            sum += * (uint8_t *) buf;

    while (sum >> 16)
            sum = (sum & 0xFFFF) + (sum >> 16);
    checksum = ~sum;
    return checksum;
}

我定義了一個IP標頭,如下所示:

typedef struct ip_h
{
    uint8_t version;
    uint8_t tos;
    uint16_t tot_len;
    uint16_t id;
    uint16_t frag_off;
    uint8_t ttl;
    uint8_t proto;
    uint16_t chksum;
    uint32_t src;
    uint32_t dst;

} IP;

我了解如何計算校驗和的數學方法,但是我不明白為什么我的代碼(與RFC幾乎完全相同)為什么不起作用。

您從ip-> version而不是tot_len派生計數器。

 int counter = (ip->version & 0xF) * 4;

我假設您想要緩沖區中的總字節數作為校驗和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM