web-dev-qa-db-fra.com

Différence entre struct ip et struct iphdr

J'essaie de comprendre comment le réseau fonctionne, je fais un test, j'envoie un paquet ... de toute façon

Mon point est que je ne trouve pas la vraie différence entre "protocol" structure Et "protocol header" structure.

Pour la structure ip, ils ont tous deux une taille de 20 octets. mais par exemple:

  • struct ip Et struct iphdr De 20 octets
  • struct icmp De 28 octets
  • struct icmphdr De 8 octets

Je suppose que le struct icmp Comprend un struct ip/iphdr??

Et il y a le même genre de structure avec chaque protocole que j'ai vu. struct udp/struct udphdr,

Est-ce un lien vers IP_HDRINCL Activé avec setsockopt()?

Ma question est donc quelle est la vraie différence entre eux? Et quand utiliser le bon.

structure ip et iphdr :

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

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

Code de structure ICMP ici: https://www.cymru.com/Documents/ip_icmp.h

8
albttx

struct ip et struct iphdr sont deux définitions différentes de la même structure sous-jacente, importées de différents endroits.

struct ip est défini dans <netinet/ip.h>, qui est un en-tête raisonnablement standard sur les systèmes UNIX.

struct iphdr est défini dans <linux/ip.h>. Cet en-tête (et sa structure) sont spécifiques à Linux et ne seront pas présents dans d'autres systèmes d'exploitation.

Si vous ne savez pas lequel utiliser, utilisez struct ip; le code qui utilise cette structure est plus susceptible d'être portable sur des systèmes non Linux.


struct icmp et struct icmphdr sont une situation plus compliquée:

  • <netinet/icmp.h> définit les deuxstruct icmp et struct icmphdr.
  • <linux/icmp.h> définit également struct icmphdr, avec une structure similaire (mais, comme d'habitude, des noms de champs différents) que la définition de <netinet/icmp.h>.

Premièrement: ne pas inclure <linux/icmp.h> sauf si vous avez une très bonne raison. Vous ne pouvez pas inclure les deux en-têtes - ils entreront en conflit - et la plupart des logiciels s'attendront à la définition de netinet.

Seconde: struct icmphdr est, comme son nom l'indique, l'en-tête. struct icmp définit le contenu d'un message ICMP structuré, comme un message de destination inaccessible.

14