Vous êtes sur la page 1sur 5

C a p t u l o 4

Sockets RAW

A diferencia de la API de sockets TCP/IP que est dirigida a cualquier programador
promedio que desee desarrollar aplicaciones de comunicacin en redes, la API de sockets
crudos o RA no est destinada a !stos de"ido a su in#erente comple$idad, puesto que
requieren de la declaracin, asignacin % clculo de los &alores de cada campo del protocolo de
red que se est! tra"a$ando en crudo 'de ah su nombre()
Por lo tanto, la programacin de sockets RA requiere que el programador tenga
conocimientos profundos de los estndares TCP/IP % una e*periencia considera"le en los
protocolos de red "a$o los que est! implementando su aplicacin) +tili,ar la API de sockets
RA para desarrollar aplicaciones cotidianas ser-a anlogo a estar rein&entando la rueda,
de"ido a que se estar-a #aciendo lo simple a tra&!s de los medios ms comple$os disponi"les)
.l o"$eti&o de este tipo de sockets es la in&estigacin, el anlisis % auditor-a de
protocolos de red pre&iamente estandari,ados, as- como el desarrollo de nue&os protocolos)
A continuacin aprenderemos a desarrollar aplicaciones de red tra"a$ando en crudo
con sus protocolos su"%acentes % para ello, iremos en un orden ascendente, desde los ms
"sicos % simples #asta los ms comple$os, dando una concisa nocin de cada uno de los
campos de ca"ecera que conforman cada estndar protocolar determinado)
A"ordaremos los siguientes protocolos/ ETHERNET, ARP, IP, ICMP, UDP, TCP)

Para comprender la esencia de los protocolos que conforman el comple$o de
comunicaciones TCP/IP de"emos estar al tanto del 0odelo de Referencia 12I % sus 3 capas de
organi,acin $errquica)







ETHERNET
.t#ernet es el protocolo de red ms "a$o en la escala $errquica de comunicaciones,
pues es el encargado de encapsular lo que sea que se est! transmitiendo en la red % lle&arlo a
su destino local final, garanti,ando su entrega e integridad en el proceso)
Como iremos &iendo a medida que nos in&olucremos ms de lleno con la
programacin de sockets RA, de"emos conocer las ca"eceras de los protocolos que
deseamos implementar en crudo para #acer aplicaciones compati"les con las otras instancias
del protocolo e$ecutndose en otros nodos) Comen,aremos con .t#ernet que es el protocolo
fundamental para la transmisin de datos, a continuacin se muestra su ca"ecera/
4ig) 5)6/ Ca"ecera .t#ernet)
Prembulo
.l prem"ulo est compuesto de una secuencia "inaria de 3 octetos '"%tes( esta"lecidos
en 78787878 con el fin de sincroni,arse con el dispositi&o de red para que reci"a una trama
.t#ernet)
Delmta!or !e I"co !e Trama #Start $rame Delmter%
.l delimitador de inicio de trama est compuesto por una secuencia "inaria de slo 7
octeto '7 "%te( esta"lecido en 78787877, con el fin de delimitar el comien,o de una nue&a
trama entrante, tras la sincroni,acin del dispositi&o de red con los datos a tra&!s del
prem"ulo)
N&TA' .stos campos no forman parte propiamente dic#o de la ca"ecera del protocolo
.t#ernet, puesto que slo tienen significado de control para el dri&er del adaptador de red %
no contienen informacin o datos rele&antes del mensa$e) Por esta ra,n, a la #ora de
programar implementaciones de .t#ernet con sockets RA no #acemos uso de !stos)
Drecc(" MAC Dest"o
9a direccin de Control de Acceso al 0edio '0AC( del destino es la direccin f-sica del
dispositi&o de red que de"e reci"ir la trama) :sta es una direccin de 5; "its '< "%tes(
e*presada generalmente en formato #e*adecimal) 9as direcciones 0AC son =nicas para cada
dispositi&o de red del mundo, de"ido a que es asignada estticamente en la tar$eta por el
fa"ricante)
Cuando una trama est destinada a todos los nodos presentes en la red local '"roadcast(
se utili,a la direccin 0AC de "roadcast '44/44/44/44/44/44(, % cuando no est destinada a
ninguno, se utili,a la direccin 0AC nula por defecto '88/88/88/88/88/88()


Drecc(" MAC &r)e"
9a direccin de Control de Acceso al 0edio '0AC( del origen es la propia direccin f-sica
del dispositi&o de red que transmite la trama)
Et*erT+pe
.ste campo determina qu! protocolo lle&a encapsulado la trama .t#ernet en su pa%load al
esta"lecer un cdigo de .t#ert%pe) A continuacin se muestra una lista con los cdigos de los
protocolos de red ms comunes/

4ig) 5)>/ Cdigos de .t#erT%pe)
Pa+loa!
.l pa%load o carga, es el campo de tama?o &aria"le de .t#ernet donde &a encapsulado el
mensa$e transmitido) .l tama?o de carga m-nimo requerido para poder ser transmitida al
medio es de 5< "%tes, mientras que el tama?o de carga m*imo permitido por .t#ernet es de
7@88 "%tes)
Para mensa$es de red peque?os cu%a longitud no cu"re el l-mite m-nimo de 5< "%tes,
.t#ernet a?ade "%tes nulos '8*88( al final del pa%load en un proceso denominado padding o
relleno, #asta conseguir los 5< "%tes del tama?o m-nimo requerido para la transmisin)
,er-cac(" !e Secue"ca !e Trama #$rame C*eck Se.ue"ce%
.s un clculo de &erificacin de redundancia c-clica de >6 "its cu%o o"$eti&o es determinar
la integridad de la trama al momento de ser reci"ida) .l nodo receptor reali,a el clculo so"re
los campos de ca"ecera de .t#ernet propiamente dic#os, 0AC de origen % destino, el
.t#erT%pe % el Pa%load % luego compara el resultado con el &alor esta"lecido en este campo) 2i
los &alores coinciden, significa que la trama no sufri alteraciones o corrupciones durante la
transmisin % es procesada por el dispositi&o, de lo contrario, la trama se descarta)
Al igual que los campos de prem"ulo % 24A, el 4C2 tiene significado =nicamente para el
dri&er del dispositi&o de red % no contiene informacin rele&ante del mensa$e reci"ido, por lo
que durante la implementacin de sockets RA no se #ace uso de !stos)
Ba"iendo conocido %a un poco la constitucin del protocolo a implementar, desarrollemos
una aplicacin que transmita un mensa$e "sico encapsulado en una trama .t#ernet, #aciendo
uso de la API de sockets RA)

Et*er"et RAW / Impleme"tac(" !e E"0o !e Trama
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ether.h>
#include <netinet/if_ether.h>
#define MSGBOX Hello, Ethernet world!
int main(int argc, char *argv[])
{
if(argc !=3)
{
printf(Uso: %s <dst_mac> <src_mac>\n, argv[0]);
exit(-1);
}

int s, bytes;
struct sockaddr *sockaddr;

struct trama{
struct ether_header ethernet;
unsigned char payload[46]; /* Tamao mnimo requerido. */
} trama;

bzero(&trama, sizeof(struct trama));

ether_aton_r(argv[1], (struct ether_addr *)&trama.ethernet.ether_dhost);
ether_aton_r(argv[2], (struct ether_addr *)&trama.ethernet.ether_shost);
trama.ethernet.ether_type = htons(0x9000); /* Ethernet Loopback. */
sprintf(trama.payload, MSGBOX, strlen(MSGBOX));

if((s = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL))) < 0)
{
perror(socket());
exit(-1);
}

if((bytes = sendto(s, &trama, sizeof(trama), 0, sockaddr, sizeof(struct sockaddr))) < 0)
{
perror(sendto());
exit(-1);
}

printf(Trama Ethernet enviada.\n);
printf(payload encapsulado: %s\n, trama.payload);

close(s);
return(0);
/*NOTREACHED*/
}
Descrpc("'
Al inicio del cdigo % tras incluir las ca"eceras apropiadas, definimos una &aria"le
02CD1E que contiene una cadena con un mensa$e determinado 'Bello, .t#ernet orldF()
Aespu!s de las rutinas de control de argumentos e*ternos, declaramos las &aria"les a
utili,ar % formamos la estructura trama, compuesta por la estructura de la ca"ecera de
.t#ernet 'struct et#erG#eader( % una &aria"le pa%load con un tama?o que cumple con el
m-nimo requerido por .t#ernet para transmitir la trama al medio '5< "%tes()





affasdf

Vous aimerez peut-être aussi