Я пытался отправить пакет ICMP, поэтому я написал следующий код:
IP *construct_ip_hdr(struct sockaddr_in *src, struct sockaddr_in *dst)
{
IP *iph = malloc(sizeof(IP));
if (!iph)
{
perror("malloc");
return NULL;
}
memset(iph, 0, sizeof(IP));
iph->version |= IP_VERSION;
iph->version |= DEFAULT_IHL;
iph->tos = TOS;
iph->tot_len = htons(DEFAULT_TOTAL_LEN + ICMP_SIZE);
iph->id = htons(ID);
iph->frag_off |= (1 << 14);
iph->ttl = DEFAULT_TTL;
iph->proto = DEFAULT_PROTO;
iph->src = src->sin_addr.s_addr;
iph->dst = dst->sin_addr.s_addr;
iph->chksum = htons(calculate_ip_chksum(iph));
return iph;
}
Я попытался отправить пакет, но это не удалось. Я проверил пакет в Wireshark. Он показал, что поле flags заголовка IP (которое я объединил с полем смещения фрагмента) было полностью обнулено. Позже я сделал ошибку, написав и заменив 1 << 14
на 2 << 6
. Когда я проверил пакет, отправленный в Wireshark, он показал, что я правильно отправил пакет ICMP. Однако я не понимаю, почему 2 << 6
работает и почему 1 << 14
не работает при установке поля флагов в заголовке IP.
Может кто-нибудь объяснить это?