====== Struttura pacchetti Ip e Tcp in GNU/Linux ====== 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 . ===== Struttura di un pacchetto Ip ===== **/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 " #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. */ }; ... ===== Struttura di un pacchetto Ip ===== **/usr/include/netinet/tcp.h** \\ \\ Risorse utili: [[http://it.wikipedia.org/wiki/Transmission_Control_Protocol#Sequence_number_e_Acknowledgment_number|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 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*/ }; ...