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.