Определение размера IP-заголовка.Почему это отличается от других? - PullRequest
4 голосов
/ 19 января 2012

Посмотрите на этот сегмент кода:

if(ip_header->protocol == IPPROTO_TCP)
 {
   tcp_header = (struct tcphdr*)(packet + sizeof(struct ethhdr) + ip_header->ihl*4);

    /* Print the Dest and Src ports */

   printf("Source Port: %d\n", ntohs(tcp_header->source));
   printf("Dest Port: %d\n", ntohs(tcp_header->dest));

  }

Что меня смущает, так это то, что в случае определения размера других заголовков, которые мы обычно делаем, sizeof(struct tcphdr) или sizeof(struct ethhdr), но для размера IP-заголовка мы не делаем sizeof, вместо этого мы делаем ip_header->ihl*4. Почему это так? И что это за 4?

Вот как выглядит объявление структуры хедера IP:

00116 struct iphdr {
00117 #if defined(__LITTLE_ENDIAN_BITFIELD)
00118         __u8    ihl:4,
00119                 version:4;
00120 #elif defined (__BIG_ENDIAN_BITFIELD)
00121         __u8    version:4,
00122                 ihl:4;
00123 #else
00124 #error  "Please fix <asm/byteorder.h>"
00125 #endif
00126         __u8    tos;
00127         __u16   tot_len;
00128         __u16   id;
00129         __u16   frag_off;
00130         __u8    ttl;
00131         __u8    protocol;
00132         __u16   check;
00133         __u32   saddr;
00134         __u32   daddr;
00135         /*The options start here. */
00136 };

1 Ответ

6 голосов
/ 19 января 2012

Это проблема разных единиц измерения.Поле IHL в заголовке IP определяется следующим образом:

Длина заголовка Интернета - это длина заголовка Интернета в 32-битных словах .

И этот размер не является фиксированным (из-за допустимых, но не рекомендуемых параметров IP).Таким образом, один пакет может иметь IHL = 5, следующий - IHL = 6 и т. Д.

...