Différence entre struct ip et struct iphdr

J’essaie de comprendre comment le réseau fonctionne, je fais des tests, j’envoie des paquets … de toute façon

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

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

  • struct ip et struct iphdr taille 20 octets
  • struct icmp taille 28 octets
  • struct icmphdr taille 8 octets

Je suppose que la struct icmp inclut une struct ip/iphdr? ?

Et il existe le même type de structure avec chaque protocole que j’ai vu. struct udp / struct udphdr ,

Est-ce que le lien vers IP_HDRINCL est setsockopt() avec setsockopt() ?

Ma question est donc Quelle est la différence réelle entre eux? Et quand utiliser le bon.

ip et iphdr struct:

 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 " #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

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

struct ip est défini dans , un en-tête raisonnablement standard sur les systèmes UNIX.

struct iphdr est défini dans . 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 vers des systèmes non-Linux.


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

  • définit à la fois struct icmp et struct icmphdr .
  • définit également la struct icmphdr , avec une structure similaire (mais, comme d’habitude, des noms de champs différents) comme définition de .

Premièrement: n’incluez pas 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.

Deuxièmement: 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.