C Программирование контрольной суммы TCP

У меня уже несколько дней возникают проблемы с вычислением контрольной суммы для TCP. Я просмотрел множество источников в Интернете, но ни один из примеров, которые я видел, не показывает вам, как вычислить контрольную сумму TCP. Я также просмотрел документ RFC , но у меня все еще возникают проблемы:

Ниже приведен код, который я использую для генерации контрольной суммы:

unsigned short checksum(unsigned short * buffer, int bytes)
{
    unsigned long sum = 0;
    unsigned short answer = 0;
    int i = bytes;
    while(i>0)
    {
            sum+=*buffer;
            buffer+=1;
            i-=2;
    }
    sum = (sum >> 16) + (sum & htonl(0x0000ffff));
    sum += (sum >> 16);
    return ~sum;
}

Эта функция работает для контрольной суммы IP.

Ниже приведена структура, которую я создал для своего TCP-заголовка:

struct tcp_header
{
    unsigned short tcp_sprt;
    unsigned short tcp_dprt;
    unsigned int tcp_seq;
    unsigned int tcp_ack;
    unsigned char tcp_res:4;
    unsigned char tcp_off:4;
    unsigned char tcp_flags;
    unsigned short tcp_win;
    unsigned short tcp_csum;
    unsigned short tcp_urp;
};

Я использовал Wireshark для тестирования этих пакетов, и единственное, что было неверно, - это контрольная сумма.

Наконец, вот структура псевдозаголовка, которую я загружаю с заголовком TCP и информацией из заголовка IP:

struct pseudoTcpHeader
{
    unsigned int ip_src;
    unsigned int ip_dst;
    unsigned char zero;//always zero
    unsigned char protocol;// = 6;//for tcp
    unsigned short tcp_len;
    struct tcp_header tcph;
};

Как только я загружаю эту структуру с правильной информацией, я затем использую функцию контрольной суммы для всей структуры псевдозаголовка и присвоить этому значению контрольную сумму TCP. Вы видите что-то неправильное в том, что я предоставил? Если проблема не здесь, это может быть небрежная ошибка, которую я не вижу.

6
задан Hudson Worden 13 January 2012 в 02:30
поделиться