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 octetsstruct icmp
De 28 octetsstruct icmphdr
De 8 octetsJe 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
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.