Autore: Fabio Di Matteo
Ultima revisione: 07/09/2008
…in stesura…
Nei sistemi Gnu/Linux i file che contengono le definizioni delle strutture dei pacchetti Ip e Tcp si trovano nella directory /usr/include/netinet/
e sono ip.h
e tcp.h
.
Utilizzando queste strutture è possibile creare dei pacchetti ip o tcp “personalizzati”, con i quali si possono implementare nuovi protocolli .
/usr/include/netinet/ip.h
Di seguito la struttura contenente la definizione del pacchetto ip.
... struct iphdr { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ihl:4; /*Lunghezza header*/ unsigned int version:4; /*Versione*/ #elif __BYTE_ORDER == __BIG_ENDIAN unsigned int version:4; unsigned int ihl:4; #else # error "Please fix <bits/endian.h>" #endif u_int8_t tos; /*Priorità*/ u_int16_t tot_len; /*Lunghezza pacchetto*/ u_int16_t id; /*ID*/ u_int16_t frag_off; /*Offset*/ u_int8_t ttl; /*Tempo di vita*/ u_int8_t protocol; /*Protocollo di trasporto*/ u_int16_t check; /*Checksum */ u_int32_t saddr; /*Indirizzo origine*/ u_int32_t daddr; /*Indirizzo di destinazione*/ /*The options start here. */ }; ...
/usr/include/netinet/tcp.h
Risorse utili: Transmission Control Protocol
Di seguito la struttura contenente la definizione del pacchetto tcp.
... struct tcphdr { u_int16_t source; /*Porta sorgente*/ u_int16_t dest; /*Porta destinazione*/ u_int32_t seq; /*Numero di sequenza*/ u_int32_t ack_seq; /*Numero di ack*/ # if __BYTE_ORDER == __LITTLE_ENDIAN u_int16_t res1:4; u_int16_t doff:4; u_int16_t fin:1; /*Flag fin, se settato a 1 vuol dire che il mittente vuole chiudere la connessione con il destinatario*/ u_int16_t syn:1; /*Flag syn, se settato a 1 il mittente vuole aprire una connessione con il destinatario, nel campo seq deve esserci il valore iniziale della sequenza*/ u_int16_t rst:1; /*Flag rst*/ u_int16_t psh:1; /*Flag psh*/ u_int16_t ack:1; /*Flag ack, se settato a 1 indica che il campo Acknowledgment number è valido;*/ u_int16_t urg:1; /*Flag urg*/ u_int16_t res2:2; # elif __BYTE_ORDER == __BIG_ENDIAN u_int16_t doff:4; u_int16_t res1:4; u_int16_t res2:2; u_int16_t urg:1; u_int16_t ack:1; u_int16_t psh:1; u_int16_t rst:1; u_int16_t syn:1; u_int16_t fin:1; # else # error "Adjust your <bits/endian.h> defines" # endif u_int16_t window; /*finestra tcp*/ u_int16_t check; /*Checksum*/ u_int16_t urg_ptr; /*Se impostato a 1 il pacchetto contiene dati urgenti*/ }; ...