# TCP y UDP.

## Introducción.

TCP y UDP Son la capa de transporte, es la primera que une dos entidades (procesos), en vez de dos hosts.
Suele ser la primera capa visible para los programadores de aplicaciones, IP se puede considerar la fronteraentre los administradores y los programadores.

## UDP.

User Datagram Protocol. Sus funciones son:

- Entregar un datagrama entre el emisor y receptor (procesos).
- Detección de errores.

### Formato de una trama UDP.

| Bits 0-15 | Bits 16-31
0 | Source Port | Destination Port
32 | Length | Checksum
64 | Data | Data

### Características de UDP.

Los datagramas pueden llegar en un orden diferente al enviado (si IP elige rutas distintas para ellos.) El emisor no tiene la seguridad de que los datagramas llegan al receptor. Por tanto, no tiene conexiones i es confiable. Cada datagrama se envía de forma independiente.

## TCP.

Transmission Control Protocol. Asegura que la transmisión se realiza por un medio fiable. Garantiza la recepción de los mensajes en orden correcto. Garantiza al emisor que los mensajes llegan correctamente al receptor. Por tanto, es orientado a conexión y confiable.

### Ventana y correción de errores.

TCP necesita confirmación de cada mensaje enviado, para garantizar la confiabilidad.
Opciones:

- Parada y espera: Cada mensaje necesita confirmación.
- Piggybacking: La configuración puede retrasarse algunos mensajes (ventana).

la parada y espera es más simple, pero desaprovecha ancho de banda. Ejemplo de parada y espera: Ejemplo de piggybacking con ventana.

## Sequence number y Acknowledgment number.

TCP intenta que la comunicación se asemeje a un flujo de bytes.
`Todos los bytes que entran por un extemo ... deben salir por el otro lado.`
En cada paquete se envía:

- El número de secuencia del primer byte transmitido en el paquete.
- El número de secuencia del siguiente byte que se espera.

### Estado de la conexión.

Cada extremo de la comunicación debe saber:

- Cuál es su siguiente bytr a enviar (sequence number).
- Cuál es su siguiente byte a recibir (acknowledgment number).

Además, también lleva la cuenta de su opinión acerca del sequence numbery del acknowledgment numberdel otro extremo.

## Corrección de errores.

Si se recibe un sequence number posterior a nuestro acknowledgment number
Es un paquete posterior al que esperamos.

- Se puede guardar en la capa TCP hasta que lleguen los anteriores.
- O se puede ignorar, y reclamar los paquetes perdidos enviando un acknowledgment number menor que el que esperaba el otro.

El otro lado reenviará los paquetes necesarios.
Si se recibe un sequence number anterior a nuestro acknowledgment number.

- Es un paquete ya recibido (se habrá duplicado). Por tanto, se ignorá.

Si llega un acknowledgment number menor que los bytes enviados.

- Reenviaré a partir de dicho acknowledgment number.

Si no tengo confirmación de un paquete enviado tras un timeout.

- Reenviaré el paquete

## Mensajes TCP.

### Establecimiento de conexión.

- Un servidor escucha en un puerto.
- Un cliente envía una solicitud de conexión.
- El servidor responde con una aceptación de la conexión.
- El cliente acepta la aceptación.

## Estados TCP.

Los pirncipales estados son:

- Closed Ninguna conexión.
- ListeningUn servidor está esperando en un puerto a ser conectado.
- Estableshed Un cliente ha conectado con un servidor.
- Time wait Esperando a que la conexión termine.

Todos los estados en: http://www.medianet.kent.edu/techreports/TR2005-07-22-tcp-EFSM.pdf

## Puertos.

Se llama puerto a la dirección de nivel de transporte en:

- TCP
- UDP

La asignación de puertos se realiza según el RFC 1700

### Asignación de puertos.

- Servidor. El proceso escucha en un puerto conocido.
  Ejemplos: 80 para HTTP, 25 SMTP,...
  Los puertos conocidos se encuentran en el fichero /etc/services
- cliente: El cliente inicia una conexión con un servidor. El sistema le asigna un puerto cualquiera sin usar.
  Generalmente, un puerto dinámico, el cliente también puede solicitar un puerto, pero es poco frecuente.

### Comando netstat

Informa de:

- Las conexiones TCP y UDP activas.
- Los programas escuchando en puertos TCP y UDP.

| Linux | Windows
Conexiones TCP | -t | -p tcp
Conexiones UDP | -u | -p udp
Proceso | -p | -o
No traducir direcciones | -n | -n
Escuchando | -l |
Escuchando y establecidas | -a | -a

### Comando nc

Netstat permite realizar conexiones TCP/UDP y redirigir su entrada/salida. Usos:

Simular de forma rápida un cliente para probar un servidor. Simular un servidor para probar un cliente. Comprobar si el firewall permite conexiones. Transferir información por red.
Versión Windows: https://eternallybored.org/misc/netcat/ Otras versiones para Windows:
- Máquina virtual con linux.
- powercat
- Windows Subsystem for Linux.

## Direcciones de escucha.

Cuando un procesos escucha en un puerto, también elige en qué dirección de red escucha. La dirección IP se puede utilizar como un firewall rudimentario.

Dirección | Efecto
0.0.0.0 | Escucha en tocas las direcciones IP accesibles.
127.X.X.X | Escucha en una dirección local
X.X.X.X | Escucha en una interfaz de red concreta

No todas las combinaciones son posibles.
Es posible escuchar en el mismo puerto en 127.X.X.X y en X.X.X.X
0.0.0.0 no es compatible con ningún otro.

### Posibilidades.

El servidor está accesible a todo el mundo.
El servidor solo está disponible desde la máquina local (por ejemplo email local).
El servidor solo está disponible por una de las interfaces de red.
Diferentes servidores en diferentes interfaces de red.

### ¿Más de un proceso escuchando en el miso puerto?

Dependiendo de la versión de Linux/Windows, más de un proceso puede escuchar en el mismo puerto.
Se hace para repartir mejor múltiples conexiones de clientes entre las CPU del servidor.

## TCP vs UDP

#### TCP

Es un medio de transmisión asegurado, las aplicaciones que usan TCP no envían paquetes, sino bytes. TCP decide cuando enviar un paquete (las apicaciones pueden opinar).
Consume más CPU y memoria, por la ventana de emisión y los reenvíos.

#### UDP

Es más eficiente, no necesita mantener conexión, ni reordenar paquetes, ni retransmitir paquetes, las aplicaciones son conscientesde que se envían paquetes, no bytes. En redes con pocos errores, puede ser adecuado.
Interesante cuando se necesita mucho ancho de banda pero no importa perder algún paquete(voz, vídeo).