# Ventana deslizante

Una ventana deslizante, en informática, es un mecanismo dirigido al control de flujo de datos que existe entre un emisor y un receptor pertenecientes a una red de computadoras.
El Protocolo de Ventana Deslizante es un protocolo de transmisión de datos bidireccional de la capa del nivel de enlace (modelo OSI). También se usa en TCP, en general en todos los protocolos confiables de intercambio de información y comunicaciones.
La ventana deslizante es un dispositivo de control de flujo de tipo software, es decir, el control del flujo se lleva a cabo mediante el intercambio específico de caracteres o tramas de control, con los que el receptor indica al emisor cuál es su estado de disponibilidad para recibir datos.
Este dispositivo es necesario para no inundar al receptor con envíos de tramas de datos. El receptor al recibir datos debe procesarlo, si no lo realiza a la misma velocidad que el transmisor los envía se verá saturado de datos, y parte de ellos se pueden perder. Para evitar tal situación la ventana deslizante controla este ritmo de envíos del emisor al receptor.
Con este dispositivo se resuelven dos grandes problemas: el control de flujo de datos y la eficiencia en la transmisión.

## Funcionamiento de la ventana de transmisión

El protocolo de ventana deslizante permite al emisor transmitir múltiples segmentos de información antes de comenzar la espera para que el receptor le confirme la recepción de los segmentos. Tal confirmación se llama validación, y consiste en el envío de mensajes denominados ACK del receptor al emisor. La validación se realiza desde el receptor al emisor y contiene el número de la siguiente trama que espera recibir el receptor, o el de la última trama recibida con éxito, ACK n (siendo n el número de la trama indicada). Con esta indicación el emisor es capaz de distinguir el número de los envíos realizados con éxito, los envíos perdidos y envíos que se esperan recibir.
Los segmentos se denominaran Unacknowledge si han sido enviados pero no han sido validados.
Técnicamente el número de segmentos que pueden ser Unacknowledge en un momento dado está limitado por el tamaño de la ventana, un número pequeño y fijo, se denomina el ancho de ventana.
Por ejemplo, en una ventana deslizante de tamaño 8, el emisor puede transmitir hasta 8 segmentos sin recibir validación de ninguno de ellos. Figura 1.a). Entonces esperará una confirmación de recepción procedente del receptor sin enviar ningún paquete más. Una vez el emisor reciba una validación del primer paquete que envió, perteneciente al número 1 de 8 de la ventana deslizante, la ventana se deslizará abarcando 8 posiciones (su ancho de ventana definido), pero en este caso desde la 2 hasta la 9 y enviará la trama número 9 continuando a la espera de recibir más confirmaciones para poder seguir deslizándose y enviando las tramas siguientes. Figura 1.b).
Si el protocolo esperase una validación por cada trama enviada, no se enviarían más segmentos hasta recibir el reconocimiento del último paquete enviado. El concepto de ventana deslizante hace que exista una continua transmisión de información, mejorando el desempeño de la red. Figura 2.
El transmisor deberá guardar en un buffer todas aquellas tramas enviadas y no validadas (Unacknowledge packets), por si necesitase retransmitirlas. Sólo puede borrarlas del buffer al recibir su validación procedente del receptor, y deslizar así la ventana una unidad más. El número más pequeño de la ventana deslizante corresponde al primer paquete de la secuencia que no ha sido validado. El tamaño del buffer debe ser igual o mayor al tamaño de la ventana. El número máximo de tramas enviadas sin validar es igual al ancho de la ventana. De esta forma el buffer podrá almacenar temporalmente todas las tramas enviadas sin validar.
A cada uno de los segmentos pertenecientes al buffer (aquellos enviados y no validados), se les asigna un temporizador. El temporizador es el límite de tiempo de espera para recibir la validación de un determinado paquete. Si el paquete se pierde en el envío, el emisor nunca recibiría validación. El paquete nunca llegaría al receptor, este continuaría a la espera de recibir el paquete perdido. De esta manera el temporizador expiraría, tomando la decisión de reenviar la trama asignada al temporizador consumido. A este proceso se le conoce como "Stop and Wait". Fig 3.
Existen situaciones distintas a la anterior en las que el emisor es consciente que debe retransmitir tramas sin que el temporizador llegue a expirar, explicadas adelante.

## Funcionamiento de la ventana de recepción

El receptor posee una ventana de recepción, similar a la de transmisión, pero con una finalidad totalmente distinta. Su funcionalidad permite al receptor recibir un conjunto de tramas que le llegan desordenadas. La ventana de recepción es la lista que tiene el receptor con los números de la secuencia consecutivos de las tramas que puede aceptar. Almacena las tramas temporalmente en un buffer hasta el momento que posea todas las tramas esperadas, la secuencia de tramas esperada al completo, y así ordenarlas. El receptor debe disponer de un buffer de igual tamaño que su ventana de recepción para almacenar temporalmente las tramas hasta ordenarlas.
Existen 2 modos de trabajo en función del tamaño de su ventana:
* Tamaño ventana recepción=1. con lo cual la ventana de recepción dispone de un buffer. Sólo puede almacenar la trama que le llega en cada instante, es decir, debe recibir las tramas en la secuencia correcta, ya que no dispone de recursos para ordenarlas después. Impone al emisor la condición de transmitir siempre las tramas en secuencia.
* Tamaño ventana recepción>1. La ventana de recepción dispone de N buffers (N=tamaño ventana de recepción) que le permiten recibir hasta N tramas desordenadas, almacenarlas y proceder a su ordenamiento posterior. Le permite al emisor transmitir tramas desordenadas, tantas como quepan en los buffers del receptor.

## Recuperación de errores

El receptor es capaz de reconocer una trama errónea mediante los códigos de Control de redundancia cíclica. El receptor cuando detecta que una trama no es correcta, porque se han producido errores en la transmisión, la descarta siempre.
Existen 2 estrategias diferentes para la recuperación de errores:
* Estrategia de rechazo simple (retroceso N, vuelta atrás, pullback NACK).
Tamaño ventana recepción=1. El receptor rechaza todas las tramas recibidas a partir de detectar una trama con error en el número de secuencia. Al detectar la trama errónea envía una señal REJ n (señal propia para este tipo de estrategia, n=n.º trama errónea), o NACK n, (trama n no validada, n=n.º trama errónea), al emisor para indicarle la situación. En ese instante el emisor comienza con la retransmisión de todas las tramas descartadas por el receptor, tanto la trama errónea como las tramas enviadas después de la trama errónea. Estas tramas retransmitidas por el transmisor se encontraban en el buffer del transmisor a espera de validación (Unacknowledge packets). No es un método efectivo, pierde mucho tiempo en la retransmisión. Fig 4.b).
* Estrategia de rechazo selectivo (repetición selectiva, selective repeat).
Tamaño ventana recepción>1. El receptor descarta únicamente la trama errónea y acepta las que llegan detrás almacenándolas en el buffer de recepción. En esta situación falta una trama en la secuencia (tramas desordenadas). Al detectar la trama errónea envía una señal SREJ n (señal propia para este tipo de estrategia, n=n.º trama errónea), o NACK n, (trama n no validada, n=n.º trama errónea), al emisor para indicarle la situación. procediendo el emisor a reenviarle únicamente esta trama errónea. Esta trama errónea se encontraría en el buffer del emisor a la espera de ser validada. El receptor al recibir la retransmisión correcta de la anterior trama errónea la almacena en el buffer con el resto de tramas recibidas y las ordena, para posteriores tratamientos. Con ello ha recibido la secuencia de tramas en orden correcto y válido. Fig 4.c).