Невозможно проверить контрольную сумму TCP - PullRequest
0 голосов
/ 28 апреля 2020

Я использовал необработанные сокеты для создания пользовательских пакетов TCP в C. Для проверки я отправил их в интерфейс обратной связи, и когда я проверял полученные пакеты с помощью TCPDUMP, контрольная сумма не совпадала для пакета TCP. Вот поля в заголовке TCP:

        tcp->th_sport = htons(temp_port);
        tcp->th_dport = htons(atoi(argv[2]));
        tcp->th_seq = htonl(random_id()%1000);
        tcp->th_ack = htonl(random_id()%1000);
        tcp->th_off = 5;
        tcp->th_flags = TH_SYN;
        tcp->th_win = htons(random_id());
        tcp->th_sum = 0;
        tcp->th_urp = htons(0);
        tcp->th_sum = htons(csum((unsigned short *) (buffer + sizeof(struct ip)), sizeof(struct tcphdr)));

Это функция random_id:

int random_id()
{
    int lower = 1, upper = 65535,number;
    number = (rand() % (upper - lower + 1)) + lower;
    return number;
}

И контрольная сумма вычисляется функцией,

unsigned short csum(unsigned short *buf, int len)
{
    unsigned long sum;
    for(sum=0; len>0; len--)
        sum += *buf++;
    sum = (sum >> 16) + (sum &0xffff);
    sum += (sum >> 16);
    return (unsigned short)(~sum);
}
...