Capa de transporte de una red - Protocolos TCP y UDP

En las capas de una arquitectura de red de computadoras, la **capa de transporte** es la encargada de la transferencia de errores entre emsor y receptor, así como del matenimiento de flujo de la red. Básicamente encapsula los mensajes de la aplicación en un segmento o datagrama, los envía y los entrega a la aplicación correspondiente en el otro extremo. En esta capa, cuando de una arquitectura TCP/IP se trata, existen dos posibles protocolos a utilizar: TCP y UDP.

## El modelo cliente-servidor. Sockets y puertos

El **servidor** es una aplicación, proceso o servicio que está a la espera de recibir solicitudes de conexión o intercambio de datos de los clientes.

El **cliente** es una aplicación que solicita e inicia una conexión o intercambio de datos con un servidor.

### Puertos

A todo proceso usando la red el SO le asigna un número de **puerto** único de 16 bits en ese equipo. Para comunicarse con cierto proceso hay que saber su número de puerto. Los distintos tipos de servidores suelen usar un número de puerto bien conocido (FTP 21, SSH 22, telnet 23, SMTP 25, DNS 53, HTTP 80, POP3 110) listados en /etc/services. Los puertos <1024 requieren privilegios.

### Sockets

Se llama **sockets** a los extremos de un canal de comunicación entre cliente y servidor. Se identifican mediante dirección IP, número de puerto y protocolo (TCP o UDP). El canal se identifica con ambos sockets (que tienen el mismo protocolo). Esto es importante porque los servidores suelen atender concurrentemente a varios clientes y tienen que identificarlos.

## Protocolo UDP (User Datagram Protocol)

El protocolo de datagramas de usuario UDP es un protocolo sin conexión que no garantiza la llegada de los paquetes en orden, sin duplicados ni la recuperación de los paquetes perdidos o erróneos.

El formato de los datagramas UDP es: 2 puertos de origen y destino de 2B cada uno, 2B de longitud en bytes del paquete, 2B de comprobación y los datos.

UDP no informa de errores, excepto si el paquete llega pero el puerto está cerrado, en cuyo caso se enviará un paquete ICMP destination unreachable con el código de puerto cerrado.

## Protocolo TCP (Transmission Control Protocol)

El protocolo de control de transmisión TCP es un protocolo orientado a conexión que garantiza la llegada de los paquetes o segmentos en orden y libres de errores.

La llegada de los segmentos se confirma (con el nº del byte que se espera recibir a continuación), si después de cierto tiempo (que depende dinámicamente de los retardos observados en la red) no se recibe confirmación se vuelven a enviar los paquetes desde el primero sin confirmar. Si hay muchos datos sin confirmar se deja de enviar para no saturar al receptor.

El formato de los datagramas TCP es: 2 puertos de origen y destino de 2B cada uno, 4B de número de secuencia (posición de estos datos en el mensaje total), 4B de número de confirmación, 4b de longitud de cabecera, 6b reservados, 1b de urgencia (URG), 1b de confirmación de paquetes anteriores (ACK, en el primer segmento está desactivado, en el resto no), 1b para flushear el buffer (PSH), 1b para abortar conexión (RST), 1b para sincronizar los números de secuencia al principio (SYN), 1b para terminar la conexión (FIN), 2B para indicar el máximo número de bytes que el receptor puede recibir sin confirmar, 2B de comprobación, 2B para indicar hasta donde es el segmento urgente, opciones con parámetros de conexión (tamaño máximo de segmentos, timestamp, confirmación desordenada, ...) y por último una cantidad par de bytes de datos.

Para iniciar la conexión el cliente envía un segmento con bit SYN=1 y ACK=0, y un número de secuencia aleatorio

x

{\displaystyle x}

 (por seguridad). El servidor contesta con los bits SYN=ACK=1, un número de secuencia aleatorio y el número de confirmación igual a

x
1

{\displaystyle x + 1}

.

   Para la desconexión, cuando uno de los dos no tiene más datos que enviar envía un segmento con el bit FIN=1 y el otro envía un segmento de confirmación. O más abruptamente se envía un paquete con el bit RST=1 y el otro no envía confirmación.