Acceso Remoto Usando el UDP
Vicente González Ruiz
February 27, 2017
Contents
El UDP le añade una funcionalidad mínima al IP. Transmite paquetes de datos entre
procesos ,
que por supuesto pueden estar en hosts diferentes (direccionamiento de procesos).
En el contexto del UDP los paquetes de datos se llaman datagramas UDP.
Por supuesto, ya que el IP no es fiable, el UDP tampoco lo es, ni tampoco
trata de recuperarse de los posibles errores de transmisión. Finalmente, es
interesante conocer que actualmente el ratio de errores en redes cableadas es
muy bajo, aunque no tanto en las redes vía radio (WiFi, por ejemplo). Y
que cuando los errores aparecen, casi siempre los paquetes son descartados
(destruidos sin intento de recuperación) o por los routers (cuando el error se
detecta a nivel del IP) o por los hosts (cuando se detecta a nivel de la capa de
transporte).
1 El emisor
A continuación se presenta el código de un emisor de datos que utiliza el UDP. Los
datos son leídos de la entrada estándar, enviados por la red, y escritos sobre la
salida estándar (con esto conseguimos seguir disponiendo de los datos). Este emisor
acepta los siguientes parámetros:
- El tamaño del payload del datagrama. El IP limita el tamaño
de un datagrama IP a 64 Kbytes y, por tanto, el UDP tiene también
este límite. Los payloads suelen tener un tamaño cercano a 1000 bytes
porque de esta manera son suficientemente grandes como para mantener
bajo el overhead producido por las cabeceras y suficientemente pequeños
como para evitar la fragmentación producida por el IPv4 cuando los
datagramas atravienan redes con MTUs (Maximun Transfer Unit) más
pequeños.
- El host destino de los datagramas. Nótese que se puede usar el DNS.
- El puerto (proceso) destino de los datagramas. Tiene que ser un
valor comprendido entre 1 y 65535, aunque típicamente será superior
al 1024 (los primeros 1024 puertos se dedican a los servicios (procesos)
“conocidos” que sólo pueden usarse con privilegios de administrador).
- El Time-To-Live (TTL). Indica el número máximo de saltos (pasos
por router) que realizarán los datagramas. Este valor se utiliza para
evitar que los datagramas lleguen demasiado lejos, y en general, para evitar
datagramas eternos que estando mal enrrutados podrían consumir ancho
de banda en Internet de forma innecesaria.
A continuación se muestra el programa udp_send.c, que puede descargarse
de http://www.ace.ual.es/\~vruiz/redes_industriales/udp_send.c:
2 El receptor
A continuación se muestra el correspondiente receptor de datagramas UDP. Este
acepta los siguientes parámetros:
- El tamaño del payload del datagrama. Debe coincidir con el
tamaño que se especifica en el emisor. Si es menor, el payload de los
datagrmas entrantes será escrito en un bloque de memoria no reservado
para tal propósito y el programa abortará (típicamente indicando
que se ha producido un fallo de segmentación de memoria). Y si es
mayor, desperdiciaremos algunos bytes y además en la salida estándar
aparecerá periódicamente cierta “basurilla”, aquella que se encuentra en
la zona de memoria que no ha sido escrita por el payload.
- El puerto de escucha. Sólo aquellos datagramas UDP que llegen a ese
puerto serán recibidos por nuestro receptor. Evidéntemente, debería
coincidir con el puerto de destino usado por el emisor.
Este es el programa udp_receive.c que puede descargarse desde
http://www.ace.ual.es/\~vruiz/redes_industriales/udp_receive.c:
Taller 1: Con los programas que hemos implementado es sencillo
transferir un archivo entre dos hosts:
usuario@receiver:~$ ls udp_receive.c
udp_receive.c
usuario@receiver:~$ make udp_receive
cc udp_receive.c -o udp_receive
usuario@receiver:~$ ./udp_receive -H
Usage: udp_receive [OPTION...]
-s payload_size
-p listening_port
Receives data from the listening_port and copies the data to the stdout
usuario@receiver:~$ ./udp_receive > file
./udp_receive: payload size = "512"
./udp_receive: listening port = "6666"
# Ahora el receptor est\’a esperando a que le lleguen datos ...
usuario@sender:~$ ls udp_send.c
udp_send.c
usuario@sender:~$ make udp_send
cc udp_send.c -o udp_send
usuario@sender:~$ ./udp_send -H
Usage: udp_send [OPTION...]
-s payload_size
-h receiver_host
-p receiver_port
-t TTL
Copies the stdin to the stdout and a UDP socket
usuario@sender:~$ ./udp_send < udp_send.c > /dev/null
# Cuando la transmisi\’on se haya producido (esto ha ocurrido
# cuando dejan de aparecer caracteres "rw" en el receptor),
# se puede detener el receptor pulsando CTRL+C.
Ejercicio 1: ¿Se le ocurre alguna forma de evitar tener que pulsar
CTRL+C en el receptor cuando la transmisión haya finalizado?