Я использовал необработанные сокеты для создания пользовательских пакетов 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);
}