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:

../_images/client-server.png

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.