Diferencia entre estructura ip y estructura iphdr

3 minutos de lectura

avatar de usuario de albttx
albttx

Estoy tratando de entender cómo funciona la red, estoy haciendo algunas pruebas, enviando un paquete… de todos modos

Mi punto es que no puedo encontrar la diferencia real entre "protocol" structure y "protocol header" structure.

Para la estructura ip, ambos tienen un tamaño de 20 bytes. pero por ejemplo:

  • struct ip y struct iphdr tamaño 20 bytes
  • struct icmp tamaño 28 bytes
  • struct icmphdr tamaño 8 bytes

Supongo que el struct icmp Incluir un struct ip/iphdr? ?

Y existe el mismo tipo de estructura con cada protocolo que he visto.
struct udp / struct udphdr,

¿Es un enlace a IP_HDRINCL encendido con setsockopt() ?

Entonces mi pregunta es ¿Cuál es la diferencia real entre ellos? Y cuando use el bueno.

ip y iphdr estructura:

struct iphdr {
    #if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8    ihl:4,
                version:4;
    #elif defined (__BIG_ENDIAN_BITFIELD)
        __u8    version:4,
                ihl:4;
    #else
        #error  "Please fix <asm/byteorder.h>"
    #endif
         __u8   tos;
         __u16  tot_len;
         __u16  id;
         __u16  frag_off;
         __u8   ttl;
         __u8   protocol;
         __u16  check;
         __u32  saddr;
         __u32  daddr;
         /*The options start here. */
};

Y HDR IP

struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN 
    u_char  ip_hl:4,        /* header length */
        ip_v:4;         /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN 
    u_char  ip_v:4,         /* version */
        ip_hl:4;        /* header length */
#endif
    u_char  ip_tos;         /* type of service */
    short   ip_len;         /* total length */
    u_short ip_id;          /* identification */
    short   ip_off;         /* fragment offset field */
#define IP_DF 0x4000            /* dont fragment flag */
#define IP_MF 0x2000            /* more fragments flag */
    u_char  ip_ttl;         /* time to live */
    u_char  ip_p;           /* protocol */
    u_short ip_sum;         /* checksum */
    struct  in_addr ip_src,ip_dst;  /* source and dest address */
};

Código de estructura ICMP aquí: https://www.cymru.com/Documentos/ip_icmp.h

  • ¿Por qué los 2 códigos no usan los mismos nombres de tipo? Tenga en cuenta que los tipos de campos de bits que no sean _Bool, int, signed int, unsigned intcomo el anterior, es un comportamiento definido por la implementación.

    – chux – Reincorporar a Monica

    16 de marzo de 2017 a las 17:29


  • chux, yo no creé la estructura, ambos están definidos en netinet/ip.h,

    – albttx

    16/03/2017 a las 17:31

  • El tamaño mínimo del encabezado IPv4 es de 20 octetos, pero las opciones pueden aumentarlo. ICMP es un protocolo que se encapsula como la carga útil de IP y su encabezado no es el encabezado de IP.

    –Ron Maupin

    16 de marzo de 2017 a las 17:43

  • IP pseudoencabezado Google es tu amigo.

    – salvaje

    16 de marzo de 2017 a las 17:53

  • @wildplasser ¡Gracias! no sabia eso!

    – albttx

    16 de marzo de 2017 a las 18:02


struct ip y struct iphdr son dos definiciones diferentes de la misma estructura subyacente, traídas de diferentes lugares.

struct ip se define en <netinet/ip.h>que es un encabezado razonablemente estándar en los sistemas UNIX.

struct iphdr se define en <linux/ip.h>. Este encabezado (y estructura) son específicos de Linux y no estarán presentes en otros sistemas operativos.

Si no está seguro de cuál usar, use struct ip; es más probable que el código que usa esta estructura sea portátil a sistemas que no sean Linux.


struct icmp y struct icmphdr son una situación más complicada:

  • <netinet/icmp.h> define ambos struct icmp y struct icmphdr.
  • <linux/icmp.h> también define struct icmphdrcon una estructura similar (pero, como siempre, diferentes nombres de campo) como la definición de <netinet/icmp.h>.

Primero: no incluir <linux/icmp.h> a menos que tengas una muy buena razón. Tú no puedo incluya ambos encabezados, entrarán en conflicto, y la mayoría del software esperará la definición de netinet.

Segundo: struct icmphdr es, como su nombre lo indica, el encabezado. struct icmp define el contenido de un mensaje ICMP estructurado, como un mensaje de destino inalcanzable.

  • Gracias ! Entonces, ¿qué pasa con icmp / icmphdr ?

    – albttx

    16/03/2017 a las 18:30

  • Más 1 por el aviso de portabilidad de struct ip fuera de los sistemas Linux.

    – Desarrollo agnóstico

    02/09/2018 a las 22:57


¿Ha sido útil esta solución?