У меня были проблемы с выполнением контрольной суммы для 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 этому значению.Вы видите что-то не так с тем, что я предоставил?Если проблема не в этом, это может быть неосторожная ошибка, которую я не вижу.