Barra laterale

programmazione:c:stuttura_pacchetti_ip-tcp

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

Struttura di un pacchetto Ip

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

programmazione/c/stuttura_pacchetti_ip-tcp.txt · Ultima modifica: 18/04/2018 - 15:49 (modifica esterna)