viernes, 25 de noviembre de 2016

TCP/IP (5): TCP en profundidad


Entradas de la serie -> TCP/IP
ELEMENTOS DE LA CABECERA TCP

El campo de código de operación

En la cabecera, un conjunto de seis bits llamado code bits, indica el tipo de operación que realiza el segmento:
  • URG: Contiene datos urgentes (acelerados), debiendo atenderse al puntero de urgencia que contiene la cabecera.
  • ACK: Contiene asentimientos, debiendo atenderse al campo correspondiente.
  • PSH: Solicitud de operación push (volcado del buffer)
  • RST: Iniciación de la conexión
  • SYN: Sincronización de números de secuencia
  • FIN: Final del flujo de octetos

Datos urgentes o acelerados

Los datos urgentes, también llamados a veces fuera de banda, son aquellos que el programa destino debe atender aún sin haber consumido los octetos que ya están en el flujo (por ejemplo, la solicitud de interrupción de un programa).

El emisor activa el bit URG de la cabecera, e indica el lugar donde se envían los datos urgentes mediante un campo aparte. El software del receptor, al recibir este tipo de segmento, debe interrumpir al programa de usuario y ponerlo en modo urgente.

Tamaño máximo de segmento

Los dos extremos han de ponerse de acuerdo en el tamaño máximo de segmento (MMS) a utilizar. Para ello se usan los campos de opciones de la cabecera.

Si ambas máquinas residen en la misma red, se intentará usar el tamaño que se ajuste a los paquetes de esa red física, mientras que en máquinas de distintas redes se intentará computar la mínima MTU de las redes que hay que atravesar.

Por defecto se escoge un tamaño de 536 octetos, que es el resultado de restarle los encabezados al tamaño por defecto de los datagramas IP (576).

La elección de el MMS es difícil en un entorno de red de redes, resultando crucial para lograr una buena utilización del ancho de banda. Si es demasiado pequeño, el peso de los encabezados aumenta, desperdiciandose ancho de banda; si es demasiado grande, el segmento se puede ver fragmentado en su viaje por redes intermedias, aumentando el riesgo de pérdida.

Cómputo de la suma de verificación (checksum)

El cómputo de la suma de verificación es exactamente el mismo que para el protocolo UDP, con el uso de un pseudo-encabezado.

TEMPORIZACIÓN

Uno de los aspectos más complejos del protocolo TCP, que lo diferencia de muchos otros, es la forma en que maneja la temporización para retransmisión (time-out).

La razón por la que el algoritmo TCP es especial proviene del ambiente de red de redes para el que se ha diseñado. En este entorno, un segmento puede viajar a altísima velocidad (cuando atraviesa sólo una LAN) o bien pasar por varias redes intermedias, variando drásticamente el tiempo de llegada.

A esto ha que sumar el factor del tráfico, que puede provocar sustanciales diferencias incluso en la misma ruta en momentos diferentes.

Se llama tiempo de ida y vuelta (round trip time) de un segmento al tiempo que tarda en llegar a su destino más el que tarda su acuse de recibo en retornar al origen.

Algoritmo adaptable

Con estas premisas, se llega a la conclusión de que es necesario incorporar un tipo de algoritmo que se vaya adaptando dinámicamente a los cambios en los tiempos de ida y vuelta. A esto se le llama algoritmo adaptable de retransmisión.

La recolección de datos para este algoritmo se realiza registrando la hora en la que se envía cada segmento y en la que se recibe su asentimiento. Con estos dos datos, se extrae el denominado muestreo del tiempo de ida y vuelta (round trip sample).

TCP guarda un valor promedio del tiempo de ida y vuelta, que es usado como valor de estimación, y que se va ajustando con la llegada de nuevas muestras. El tipo de fórmula que se suele usar para esto se basa en los siguientes parámetros: La constante a, tomada en el intervalo [0,1), hace que la adaptación a nuevas situaciones se haga más o menos gradualmente. El tiempo estimado de ida y vuelta RTT no se usa directamente como valor de terminación del temporizador, sino que se multiplica por un factor fijo o variable b. El ajuste de este factor es muy importante para evitar retransmisiones innecesarias o retardos excesivos.

En la especificación original de TCP se recomendaba un valor de b=2, aunque con el tiempo se han ido desarrollando mejores estimaciones.

Cálculo de la desviación estimada

El uso de un factor fijo para la obtención del tiempo de expiración no permite una buena adaptación en entornos donde se hay un amplio rango de variación en los retardos.

Para mejorar el algoritmo, en la especificación de 1989 de TCP se propone el cálculo de la denominada desviación estimada que, sin aumentar excesivamente los cómputos a realizar, consigue una mejor estimación del tiempo de expiración.

Aquí, la desviación estimada se basa en unas constantes δρ y η indican qué tan rápidamente afectan las nuevas muestras al tiempo de ida y vuelta, la desviación y el tiempo de expiración estimados, respectivamente.

Para hacer los cómputos eficientemente, se recomienda que las constantes δ y ρ tomen valores inversos a potencias de dos, habiendose encontrado que los valores δ=1/23, ρ=1/22 y η=3 consiguen buenos resultados.

Asentimientos ambiguos

La posible presencia de duplicados de segmentos complica el cálculo de las muestras de tiempo de ida y vuelta. Si el temporizador para un segmento expira y éste es retransmitido, será imposible asociar un acuse de recibo con una de las dos o más retransmisiones, produciendose el fenómeno llamado ambigüedad de asentimiento (acknowledgement ambiguity). El resultado es que la muestra de tiempo de ida y vuelta obtenida no es fiable.

No hay una regla que solucione este problema al 100%:

* Asociar siempre los asentimientos con la primera transmisión produce, en situaciones con pérdida frecuente de datagramas, que la estimación de tiempo aumente continuamente.
* Asociar los asentimientos con la última retransmisión puede hacer que la estimación disminuya varias veces por debajo del valor real, provocando retransmisiones inútiles.
Una solución más correcta es el llamado algoritmo de Karn, el cual consiste en simplemente desechar las muestras obtenidas de segmentos retransmitidos.

Es necesario, sin embargo, adaptar este algoritmo para evitar la situación en la que un aumento brusco en los retardos provoque una congelación del valor estimado, al generarse continuas retransmisiones. Para ello, se aplica una anulación de temporizador (timer backoff), consistente en que se aumenta la estimación en un factor g cada vez que hay una retransmisión.

Más detalladamente, el algoritmo de Karn se comporta de la siguiente manera:

* Si se produce una retransmisión, aplicarle un factor de anulación al tiempo de expiración, desvinculándolo del RTT estimado, que no varía.
* No usar las muestras obtenidas de retransmisiones para el cómputo del RTT.
* Sólo cuando se vuelva a obtener una muestra válida, retomar el RTT y recalcularlo extrayendo un nuevo tiempo de expiración.
Este algoritmo, que fue originalmente concebido para redes de radio-paquetes, ha demostrado muy buenos resultados incluso con redes muy inestables.

Temporización y congestionamiento

El congestionamiento es la saturación de datagramas en lugar de la red, normalmente en los gateways. Éstos tienen una capacidad de almacenamiento finita, lo que hace que vayan descartando datagramas en el momento en que se ven saturados.

Los puntos extremos de una comunicación, por lo general, no tienen conocimiento del congestionamiento que ocurre en las redes intermedias, no distinguiéndose del retraso producido por otros factores. Además, los sistemas no orientados a conexión, como IP, no pueden evitar el congestionamiento reservando con antelación espacio en los gateways para cada conexión.

El comportamiento de los protocolos de temporización y retransmisión, como TCP, empeoran las situaciones de congestionamiento, pues responden a los retrasos aumentando más y más el número de datagramas en la red, pudiéndose llegar a la situación denominada colapso por congestionamiento.

Las técnicas recomendadas por el estándar TCP para evitar el congestionamiento son dos:

* Disminución multiplicativa
Se mantiene un segundo tamaño de ventana, llamado ventana de congestionamiento, eligiendose como tamaño efectivo en cada momento el mínimo entre este tamaño y el solicitado por el receptor.

Cuando se pierde un segmento, se reduce a la mitad la ventana de congestionamiento, hasta el mínimo de un segmento.

Para aquellos segmentos que se mantengan dentro de la ventana efectiva, se aplicará una anulación exponencial al temporizador en cada pérdida.

El resultado de esto es que, a medida que aumenta el congestionamiento, se reduce rápidamente el volumen de tráfico, así como la velocidad a que se retransmiten los segmentos perdidos.

* Recuperación de arranque lento
Esta segunda técnica se aplica una vez se ha resuelto el congestionamiento. Para evitar que éste se reproduzca de nuevo rápidamente, el tamaño de la ventana de congestionamiento se va aumentando en sólo un segmento por cada asentimiento recibido correctamente.

Cuando se crea una nueva conexión o se pasa un periodo de congestionamiento, se establece el tamaño inicial de dicha ventana a un segmento, que irá aumentando uno a uno, como se ha explicado.

El desarrollo normal de este algoritmo llevaría, sin embargo, a un aumento exponencial, pues cada bloque de segmentos que se envía duplica en teoría la ventana (un segmento por cada asentimiento). Para que el arranque sea realmente tan lento como se espera, se aplica la siguiente regla:

Al llegar el tamaño de ventana a la mitad del que tenía antes del congestionamiento, el protocolo entra en fase de prevención de congestionamiento. Durante esta fase, se aumenta el tamaño en un solo segmento sólo si, para todos los segmentos de la ventana, se tiene acuses de recibo.

No hay comentarios:

Publicar un comentario

Expresa tu opinión respetando a los demás y a unas mínimas reglas del lenguaje castellano.