Liber 000 - Astrum Argentum

Liber 000 - Astrum Argentum Liber 000 - Astrum Argentum

astrumargentum.org
from astrumargentum.org More from this publisher
01.01.2013 Views

} sum += *w++; nleft -= 2; /* mop up an odd byte, if necessary */ if (nleft == 1) { *(u_char *)(&answer) = *(u_char *)w ; sum += answer; } /* add back carry outs from top 16 bits to low 16 bits */ */ */ } sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 sum += (sum >> 16); /* add carry */ answer = ~sum; /* truncate to 16 bits return(answer); Este algorítmo é utilizado para a determinação do checksum, para o controle propriamente dito, não se preocupe neste momento em entendê-lo, basta dizer que o mesmo será muito útil daqui para a frente. Raio X das Estruturas dos Protocolos : Vamos mostrar abaixo como é a estrutura de vários protocolos para o melhor entendiemnto de nosso estudo. Vamos a eles : a) Cabeçalho UDP : #include /* Parte do cabecalho udp.h que declara a estrutura udphdr */ struct udphdr { u_int16_t source; u_int16_t dest; u_int16_t len; u_int16_t check; }; b) Cabeçalho IP : #include /* Parte do cabecalho ip.h que declara a estrutura iphdr */ struct iphdr { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ihl:4; unsigned int version:4; #elif __BYTE_ORDER == __BIG_ENDIAN unsigned int version:4; unsigned int ihl:4; #else 50

# error "Please fix " #endif u_int8_t tos; u_int16_t tot_len; u_int16_t id; u_int16_t frag_off; u_int8_t ttl; u_int8_t protocol; u_int16_t check; u_int32_t saddr; u_int32_t daddr; /*The options start here. */ }; Não tem nada de familiar acima, com o cabeçalho do datagrama IP ? Se vocês já repararam são as estrturas exatas do mesmo, para serem manipuladas pelo programador ! c) Cabeçalho ICMP : #include /* Parte do cabecalho ipicmp.h que declara a estrutura icmphdr */ struct icmphdr { u_int8_t type; /* message type */ u_int8_t code; /* type sub-code */ u_int16_t checksum; union { struct { u_int16_t id; u_int16_t sequence; } echo; /* echo datagram */ u_int32_t gateway; /* gateway address */ struct { u_int16_t __unused; u_int16_t mtu; } frag; /* path mtu discovery */ } un; }; Dos três, este é o mais complexo de todos, mas é que permite uma série de recursos interessantes. Implementação de Um Gerador de Pacotes UDP Viemos ao longo destas modestas lições sobre sockets mostrar um pouco da programação em C. Uma coisa que eu vi durante o curso foi que muitas pessoas queriam compilar estas aplicações no Windows, que eu infelizmente não pude auxiliar, já que todo o nosso curso foi voltado 51

}<br />

sum += *w++;<br />

nleft -= 2;<br />

/* mop up an odd byte, if necessary */<br />

if (nleft == 1) {<br />

*(u_char *)(&answer) = *(u_char *)w ;<br />

sum += answer;<br />

}<br />

/* add back carry outs from top 16 bits to low 16 bits */<br />

*/<br />

*/<br />

}<br />

sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16<br />

sum += (sum >> 16); /* add carry */<br />

answer = ~sum; /* truncate to 16 bits<br />

return(answer);<br />

Este algorítmo é utilizado para a determinação do checksum, para o<br />

controle propriamente dito, não se preocupe neste momento em<br />

entendê-lo, basta dizer que o mesmo será muito útil daqui para a frente.<br />

Raio X das Estruturas dos Protocolos :<br />

Vamos mostrar abaixo como é a estrutura de vários protocolos para o<br />

melhor entendiemnto de nosso estudo. Vamos a eles :<br />

a) Cabeçalho UDP :<br />

#include <br />

/* Parte do cabecalho udp.h que declara a estrutura udphdr */<br />

struct udphdr {<br />

u_int16_t source;<br />

u_int16_t dest;<br />

u_int16_t len;<br />

u_int16_t check;<br />

};<br />

b) Cabeçalho IP :<br />

#include <br />

/* Parte do cabecalho ip.h que declara a estrutura iphdr */<br />

struct iphdr<br />

{<br />

#if __BYTE_ORDER == __LITTLE_ENDIAN<br />

unsigned int ihl:4;<br />

unsigned int version:4;<br />

#elif __BYTE_ORDER == __BIG_ENDIAN<br />

unsigned int version:4;<br />

unsigned int ihl:4;<br />

#else<br />

50

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!