Sockets TCP y UDP

Este año una de las asignaturas más interesantes es “Redes”. En ella estamos programando utilidades de red sencillas como un cliente y un servidor de eco y un servidor web básico. Como a los novatos el asunto de Sockets nos puede sonar un poco a chino, quiero intentar dar unas nociones que, sin gran profundidad, faciliten la realización de estas prácticas; pero hasta ahora no había encontrado una analogía apropiada para explicar lo más importante: ¿Qué es un socket?

Antes de dar respuesta a esta pregunta, pensemos en el ordenador como una máquina que presta diferentes servicios a otra. Supongamos que ambas están conectadas, tienen una IP y queremos que desde la segunda podamos hacer peticiones de eco a la primera. Esto significa que nuestro servidor recibirá una información del exterior y la tiene que devolver a su remitente. Para que esto funcione, las dos computadoras tienen que estar de acuerdo acerca de un puerto sobre el cual operar. Los puertos (desde 0 a 65535) son buzones que el ordenador designa para las aplicaciones.
Por ejemplo, asignaremos nuestro servicio de eco al puerto 5000, porque se encuentra libre (los primeros 1024 están reservados para servicios importantes, como la navegación web, recibir/enviar correo, ssh, etc.). Toda la información que llegue al PC y esté etiquetada como perteneciente a ese puerto, será entregada a la aplicación de eco.

Hasta aquí podría parecer suficiente: dos ordenadores, que saben en donde está su buffer para enviar/recibir información correspondiente a este servicio. Sin embargo, falta definir algunos aspectos de la conexión: TCP y UDP son las siglas de dos protocolos que definen qué forma deben tener los paquetes a través de los cuales viaja la información, y cómo debe comportarse un servicio de cada tipo.
Por ejemplo, si enviamos un paquete de información UDP no podemos esperar recibir confirmación de entrega; mientras que en el caso de TCP, un paquete no se considera entregado mientras no exista tal confirmación. Sin embargo, los paquetes de información UDP están definidos cómo una unidad de información más pequeña que los paquetes TCP; por lo que permiten intercambios de datos más rápidos. Las cabeceras TCP son mucho más amplias.
¿Que debemos esperar enviar o recibir entonces? La información que circule entre nuestro cliente y servidor de eco debe tener una forma concreta para que el ordenador la interprete correctamente.

Aquí viene una analogía con la que comprender perfectamente todos estos conceptos.
Digamos que nuestro ordenador es una gran discoteca con 65535 entradas (puertos). En cada entrada hay dos porteros (protocolos). Uno de ellos solo deja entrar por esa puerta a quienes se identifiquen como amigos de TCP; mientras que el otro deja pasar a los amigos de UDP. Nuestra discoteca tiene barras donde se preparan cócteles (servicio TCP) y roperos donde dejar los abrigos (servicio UDP).
Si un amigo de TCP llega a una puerta, el portero comprobará si hay algún servicio TCP para esa puerta. Si hay barra de cócteles puede pasar, en caso contrario, es rechazado. Lo mismo sucede para los amigos de UDP si hay ropero o no.
Así que cabe pensar que incluso en una puerta podemos poner una barra y un ropero y atender ambos tipos de peticiones a la vez y, efectivamente, esto es así.
En el PC, podemos tener dos aplicaciones corriendo en el mismo puerto siempre y cuando una siga el protocolo TCP y la otra el UDP. Si ambas quisiesen usar el mismo protocolo, el sistema operativo solo le permitiría operar a una de las dos y a la otra le mostraría el puerto como “ocupado”.

De modo que un socket es el conjunto de:
– Ambas direcciones IP
– El puerto en el cual la información se envía y se recibe (técnicamente pueden ser diferentes)
– El protocolo escogido para intercambiar la información (TCP o UDP)
Por supuesto para que la información se pueda intercambiar también se necesitan aplicaciones que entiendan la información recibida, pero eso es otra historia…

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s