====== 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*/
};
...