Práctica 3 - Cliente y servidor#
En esta sesión vamos a profundizar en los conceptos de cliente y
servidor desde un punto de vista práctico y, al mismo tiempo, aprender
una utilidad llamada netcat (comando nc): una herramienta básica
que se utiliza, entre otros usos, para diagnosticar problemas en
redes.
El modelo de comunicación cliente-servidor se describe gráficamente en la siguiente figura:
Figura 3 Esquema básico de comunicación entre un cliente y un servidor#
El cliente realiza peticiones al servidor y el servidor responde a estas peticiones. Algunas consideraciones a tener en cuenta:
El servidor tiene un comportamiento reactivo, es decir, espera a que le lleguen peticiones para actuar en la comunicación.
El cliente tiene un comportamiento proactivo, es decir, realiza las peticiones al servidor cuando lo necesita y es quien inicia la comunicación.
Un nodo puede tener los 2 roles a la vez. Es posible que, dentro de un entorno más complejo, un mismo nodo pueda ser el cliente de un servidor y servidor de otros nodos diferentes. La separación de estos dos roles es lógica, no física.
netcat#
Para crear conexiones simples entre nodos utilizando el modelo
cliente-servidor una de las herramientas más sencillas es netcat. En
el terminal, se usa con el comando nc. Si no lo tienes instalado,
debes instalar el paquete netcat:
sudo apt install netcat
Casos prácticos#
Los siguientes casos prácticos están pensados para realizarse en el laboratorio por parejas (cada miembro de la pareja con su PC de laboratorio).
Nota
También sería posible practicar desde casa utilizando 2 máquinas virtuales lanzadas a la vez. Cada máquina virtual tendrá su IP y, por tanto, una puede actuar de servidor y otra de cliente. Sólo tienes que tener 2 máquinas virtuales importadas.
Un miembro de la pareja actuará de cliente y el otro actuará de servidor. Os recomendamos que se intercambien los roles en diferentes ejercicios para que ambos miembros hagáis de cliente y de servidor.
Para poder realizar la comunicación entre ellos es necesario conocer
las direcciones IP de ambos. Podemos conocer las direcciones
utilizando el comando ip:
ip addr
También es posible obtener las direcciones IP utilizando el comando
ifconfig aunque es preferible el primer método:
sudo ifconfig
Estos comandos nos muestran las direcciones IP de las que dispone
nuestra máquina. Tiene la forma de 4 bytes separados por puntos. Por
ejemplo: 192.168.1.120. Las direcciones IP van asociadas a las
interfaces de red de las que disponga el nodo. Como nuestra máquina
virtual sólo tiene una interfaz de red (simulada) sólo veremos una IP
válida.
Nota
Ambos comandos muestran una interfaz de red especial llamada
lo cuya IP es siempre 127.0.0.1. Esta interfaz corresponde a la
red local de la propia máquina y, de momento, la debemos ignorar.
Una vez tomada nota de qué IP corresponde con el cliente y cuál con el servidor, puedes comenzar con los siguientes ejercicios prácticos de comunicación entre ambos.
Chat entre cliente y servidor#
Teclea en el servidor el comando:
nc -l -p 5400
El servidor se pone a la escucha con la opción -l (listen) en el puerto
5400. Por defecto lo hace en TCP, aunque con la opción -u se
podría hacer para UDP.
Una vez el servidor esté a la escucha, teclea en el cliente:
nc <server-IP> 5400
Substituye <server-IP> por la IP del servidor a la que quieres
conectarte. Esto hará que nc abra una conexión TCP con el servidor.
Una vez conectados, el cliente se comunica con el servidor como si compartieran teclado y pantalla: cualquier texto que introduzca cualquiera de ellos será visto por ambos cada vez que se confirme con Enter.
Para abortar la comunicación basta con pulsar Ctrl c sobre cualquiera de los dos. Esto lo que hace es abortar el programa y cerrar cualquier comunicación que esté en proceso.
Enviar texto y almacenarlo#
Teclea en el servidor el comando:
nc -l -p 5400 > output.txt
Al igual que antes, el servidor se pone a la escucha en el puerto
5400. Ahora lo que reciba se redirigirá al fichero output.txt. En
cuanto se conecte el cliente y empiece a enviar datos, el fichero irá
adquiriendo contenido.
Una vez cerrada la conexión se puede ver el contenido del archivo con
cat. No olvides borrar el archivo con rm.
Cuando el servidor esté escuchando, teclea en el cliente el comando:
nc <server-IP> 5400
Escribe una frase de prueba como: You'll be free, hackers, you'll be free.
La tecla Enter no cierra la conexión, simplemente introduce un salto de línea. Cuando se acabe de introducir por teclado el texto, puedes cerrar la conexión con Ctrl c.
Ver el contenido recibido por el servidor#
Teclea en el servidor el comando:
nc -l -p 5400
El servidor se pone a la escucha en el puerto 5400. Ahora lo que
reciba se mostrará por pantalla.
Crea un archivo llamado file.txt con un contenido cualquiera, por
ejemplo: At our call, hackers, at our call.. Puedes utilizar
nano para crearlo.
nc <server-IP> 5400 < file.txt
No olvides borrar el archivo con rm al finalizar.
Envío de fichero por parte del cliente (subida)#
Teclea en el servidor el comando:
nc -l -p 5400 > book.pdf
El servidor se pone a la escucha en el puerto 5400 y lo que reciba
se almacenará en el fichero book.pdf.
Una vez finalizado, no olvides borrar el archivo con rm.
Descarga el libro de prácticas de la asignatura con wget. Substituye
en por es si quieres la versión en español:
wget https://uclm-esi.github.io/redes1-lab/en/redes1-lab-en.pdf
Ahora lo puedes enviar al servidor usando:
nc <server-IP> 5400 < redes1-lab-en.pdf
Una vez finalizado, no olvides borrar el PDF con rm.
Nota
Se puede ver el contenido del PDF abriendo el archivo con el comando
evince, que abrirá un programa gráfico para visualizar el PDF que se
pase por argumentos.
Debes cerrar el PDF para poder retomar el control del terminal, que se queda bloqueado mientras tanto. También puedes utilizar Ctrl c para finalizar el programa desde el terminal.
El nombre del archivo con que se guarda el PDF a cada lado de la comunicación puede ser el mismo o diferente. Cada extremo de la comunicación le asigna un nombre.
Almacenar datos que vienen del servidor#
Teclea en el servidor el comando:
nc -l -p 5400
El servidor se pone a la escucha en el puerto 5400, pero también
puede recibir entrada por teclado. Esta entrada la enviará al cliente
cuando se conecte.
Vamos a probar esto. Teclea una frase como por ejemplo: We'll kick out those dirty licenses.
Una vez se conecte el cliente, este irá recibiendo el texto que has introducido. Si sigues introduciendo texto el cliente lo seguirá recibiendo.
Espera a que el servidor haya introducido todo el texto. Cuando esté listo, ejecuta:
nc <server-IP> 5400 > file.txt
El fichero file.txt se actualizará con los datos que el servidor
vaya enviando. Puedes abrir otro terminal y con cat ver el contenido
del archivo.
No olvides borrar el archivo generado con rm.
Ver un fichero del servidor desde el cliente#
Crea un archivo llamado file.txt con un contenido cualquiera, por
ejemplo: Join us now and share the software. Puedes utilizar
nano para crearlo.
nc -l -p 5400 < file.txt
El servidor se pone a la escucha en el puerto 5400 y en cuanto se
conecte el cliente recibirá el contenido del archivo.
No olvides borrar el archivo creado con rm al finalizar.
Cuando el servidor esté listo, ejecuta:
nc <server-IP> 5400
Aparecerá por pantalla el contenido del archivo que el servidor ha puesto a disposición.
Envío de fichero por parte del servidor (descarga)#
Descarga el libro prácticas de la asignatura con wget. Substituye
en por es si quieres la versión en español:
wget https://uclm-esi.github.io/redes1-lab/en/redes1-lab-en.pdf
Esto creará el archivo redes1-lab-en.pdf en el directorio desde
donde se lanzó wget. Ahora comienza el servidor con:
nc -l -p 5400 < redes1-lab-en.pdf
El servidor se pone a la escucha en el puerto 5400 y en cuanto se
conecte el cliente recibirá el PDF.
No olvides borrar el archivo PDF con rm al finalizar.
Cuando el servidor esté listo, ejecuta:
nc <server-IP> 5400 > book.pdf
Cuando se conecte, el servidor enviará el PDF y el cliente lo almacenará en el archivo book.pdf.