Unterschied zwischen struct ip und struct iphdr

Lesezeit: 3 Minuten

Benutzeravatar von albttx
albttx

Ich versuche zu verstehen, wie das Netzwerk funktioniert, ich mache einige Tests, sende ein Paket … jedenfalls

Mein Punkt ist, dass ich den wirklichen Unterschied zwischen nicht finden kann "protocol" structure Und "protocol header" structure.

Für die IP-Struktur hatten beide eine Größe von 20 Byte. aber zum Beispiel:

  • struct ip Und struct iphdr Größe 20 Byte
  • struct icmp Größe 28 Byte
  • struct icmphdr Größe 8 Byte

Ich vermute, dass das struct icmp umfassen a struct ip/iphdr? ?

Und es gibt bei jedem Protokoll, das ich gesehen habe, die gleiche Struktur.
struct udp / struct udphdr,

Ist es ein Link zu IP_HDRINCL weitermachen mit setsockopt() ?

Meine Frage lautet also: Was ist der wirkliche Unterschied zwischen ihnen? Und wenn man das Gute benutzt.

ip und iphdr Struktur:

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. */
};

Und IP HDR

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 */
};

ICMP-Strukturcode hier: https://www.cymru.com/Documents/ip_icmp.h

  • Warum verwenden die beiden Codes nicht dieselben Typnamen? Beachten Sie, dass andere Bitfeldtypen als _Bool, int, signed int, unsigned intist, wie oben beschrieben, ein durch die Implementierung definiertes Verhalten.

    – chux – Monica wieder einsetzen

    16. März 2017 um 17:29


  • Chux, ich habe die Struktur nicht erstellt, sie sind beide in netinet/ip.h definiert,

    – albttx

    16. März 2017 um 17:31 Uhr

  • Die minimale IPv4-Headergröße beträgt 20 Oktette, kann aber durch Optionen vergrößert werden. ICMP ist ein Protokoll, das als IP-Nutzlast gekapselt ist und dessen Header nicht der IP-Header ist.

    – Ron Maupin

    16. März 2017 um 17:43 Uhr

  • IP Pseudo-Header Google ist dein Freund.

    – wildplasser

    16. März 2017 um 17:53

  • @wildplasser Danke! Das wusste ich nicht!

    – albttx

    16. März 2017 um 18:02 Uhr


struct ip Und struct iphdr sind zwei unterschiedliche Definitionen derselben zugrunde liegenden Struktur, die von verschiedenen Orten stammen.

struct ip ist definiert in <netinet/ip.h>ein einigermaßen standardmäßiger Header auf UNIX-Systemen.

struct iphdr ist definiert in <linux/ip.h>. Dieser Header (und diese Struktur) sind Linux-spezifisch und in anderen Betriebssystemen nicht vorhanden.

Wenn Sie nicht sicher sind, welches Sie verwenden sollen, verwenden Sie struct ip; Code, der diese Struktur verwendet, ist eher auf Nicht-Linux-Systeme portierbar.


struct icmp Und struct icmphdr sind eine chaotischere Situation:

  • <netinet/icmp.h> definiert beide struct icmp Und struct icmphdr.
  • <linux/icmp.h> definiert auch struct icmphdrmit einer ähnlichen Struktur (aber wie üblich andere Feldnamen) wie die Definition von <netinet/icmp.h>.

Erstens: Nicht einbeziehen <linux/icmp.h> es sei denn, Sie haben einen sehr guten Grund. Du kann nicht Fügen Sie beide Header ein – es kommt zu Konflikten – und die meisten Softwareprogramme erwarten die Netinet-Definition.

Zweite: struct icmphdr ist, wie der Name schon sagt, der Header. struct icmp Definiert den Inhalt einer strukturierten ICMP-Nachricht, z. B. einer Nachricht über ein nicht erreichbares Ziel.

  • Danke ! Was ist also mit icmp / icmphdr ?

    – albttx

    16. März 2017 um 18:30 Uhr

  • Plus 1 für den Portabilitätshinweis von struct ip außerhalb von Linux-Systemen.

    – AgnosticDev

    2. September 2018 um 22:57 Uhr


1451590cookie-checkUnterschied zwischen struct ip und struct iphdr

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy