albttx
Estoy tratando de entender cómo funciona la red, estoy haciendo algunas pruebas, enviando un paquete… de todos modos
Mi punto es que no puedo encontrar la diferencia real entre "protocol" structure
y "protocol header" structure
.
Para la estructura ip, ambos tienen un tamaño de 20 bytes. pero por ejemplo:
struct ip
ystruct iphdr
tamaño 20 bytesstruct icmp
tamaño 28 bytesstruct icmphdr
tamaño 8 bytes
Supongo que el struct icmp
Incluir un struct ip/iphdr?
?
Y existe el mismo tipo de estructura con cada protocolo que he visto.
struct udp
/ struct udphdr
,
¿Es un enlace a IP_HDRINCL
encendido con setsockopt()
?
Entonces mi pregunta es ¿Cuál es la diferencia real entre ellos? Y cuando use el bueno.
ip y iphdr estructura:
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. */
};
Y HDR IP
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 */
};
Código de estructura ICMP aquí: https://www.cymru.com/Documentos/ip_icmp.h
struct ip
y struct iphdr
son dos definiciones diferentes de la misma estructura subyacente, traídas de diferentes lugares.
struct ip
se define en <netinet/ip.h>
que es un encabezado razonablemente estándar en los sistemas UNIX.
struct iphdr
se define en <linux/ip.h>
. Este encabezado (y estructura) son específicos de Linux y no estarán presentes en otros sistemas operativos.
Si no está seguro de cuál usar, use struct ip
; es más probable que el código que usa esta estructura sea portátil a sistemas que no sean Linux.
struct icmp
y struct icmphdr
son una situación más complicada:
<netinet/icmp.h>
define ambosstruct icmp
ystruct icmphdr
.<linux/icmp.h>
también definestruct icmphdr
con una estructura similar (pero, como siempre, diferentes nombres de campo) como la definición de<netinet/icmp.h>
.
Primero: no incluir <linux/icmp.h>
a menos que tengas una muy buena razón. Tú no puedo incluya ambos encabezados, entrarán en conflicto, y la mayoría del software esperará la definición de netinet.
Segundo: struct icmphdr
es, como su nombre lo indica, el encabezado. struct icmp
define el contenido de un mensaje ICMP estructurado, como un mensaje de destino inalcanzable.
-
Gracias ! Entonces, ¿qué pasa con
icmp
/icmphdr
?– albttx
16/03/2017 a las 18:30
-
Más 1 por el aviso de portabilidad de
struct ip
fuera de los sistemas Linux.– Desarrollo agnóstico
02/09/2018 a las 22:57
¿Por qué los 2 códigos no usan los mismos nombres de tipo? Tenga en cuenta que los tipos de campos de bits que no sean
_Bool, int, signed int, unsigned int
como el anterior, es un comportamiento definido por la implementación.– chux – Reincorporar a Monica
16 de marzo de 2017 a las 17:29
chux, yo no creé la estructura, ambos están definidos en netinet/ip.h,
– albttx
16/03/2017 a las 17:31
El tamaño mínimo del encabezado IPv4 es de 20 octetos, pero las opciones pueden aumentarlo. ICMP es un protocolo que se encapsula como la carga útil de IP y su encabezado no es el encabezado de IP.
–Ron Maupin
16 de marzo de 2017 a las 17:43
IP pseudoencabezado Google es tu amigo.
– salvaje
16 de marzo de 2017 a las 17:53
@wildplasser ¡Gracias! no sabia eso!
– albttx
16 de marzo de 2017 a las 18:02