Make your own free website on Tripod.com
Protocolos de ventana deslizante

Los protocolos que hemos visto hasta ahora transmitían datos en una sola
dirección; el canal de retorno era utilizado únicamente para enviar tramas
de acuse de recibo (ACK) cuyo contenido era irrelevante. Si tuviéramos que
transmitir datos en ambas direcciones podríamos utilizar dos canales
semi-dúplex con los protocolos anteriores, pero sería mas eficiente
utilizar el canal semi-dúplex ya existente para enviar en cada sentido
tanto tramas de datos como de ACK; el campo kind nos permitirá diferenciar
unas de otras.

Aun más eficiente sería, en vez de generar una trama ACK de manera
automática cada vez que se recibe algo, esperar a enviarla cuando haya
información útil que enviar; en tal caso el ACK viajaría 'gratis' y se
ahorraría el envío de una trama. Esta técnica se conoce con el nombre de
piggybacking o piggyback acknowledgement; (en inglés piggyback significa
llevar a alguien o algo a hombros o a cuestas).

Ahora bien, para 'montar' el ACK en una trama de datos es preciso que esta
llegue pronto, o de lo contrario el emisor reenviará la trama, lo cual daría
al traste con el pretendido beneficio del piggybacking; como no es posible
saber de antemano cuando va a llegar el siguiente paquete de la capa de red,
generalmente se adopta una solución salomónica: se espera un determinado tiempo
y si no llega ningún paquete en ese tiempo se genera una trama ACK; en este
caso el tiempo de espera debe ser sensiblemente inferior al timer del emisor.
Protocolo full-dúplex con piggybacking (ventana deslizante de un bit)
En nuestro protocolo anterior las tramas se numeraban 0,1,0,1,… La numeración
sólo era utilizada en el receptor para verificar la trama recibida, no para
informar al emisor de a que trama se aplicaba el ACK. Esto producía algunos
problemas como hemos visto en el caso de un receptor lento y una trama que se
perdía. Si el receptor informa en la trama ACK de la trama de datos recibida
el problema de que el emisor tome un ACK como correspondiente al paquete
equivocado desaparece, el protocolo se hace más robusto ya que tanto emisor
como receptor llevan control de la trama recibida. En la Fig. 3-13 tenemos un
ejemplo de protocolo de este tipo donde además se utiliza piggybacking y
transmisión full-dúplex. Obsérvese que en este caso ya sólo aparece el código
C correspondiente a un lado, pues al ser transmisión full-dúplex el otro lado
sería idéntico. Se supone que a cada trama de datos enviada desde un extremo le
sucede otra trama de datos desde el otro extremo.

Cada trama enviada contiene el número de secuencia correspondiente (seq), el
número correspondiente al paquete recién recibido del otro lado (ack) y los
datos a enviar. Para que el protocolo funcione correctamente es preciso convenir
en que uno de los lados inicie la comunicación, y el otro le siga. De lo contrario
podría ocurrir que ambos lados iniciaran la comunicación a la vez, donde cada
trama es enviada dos veces; también se enviarían duplicados en caso de tener los
timers demasiado bajos. Sin embargo, los duplicados serían correctamente detectados
a partir de la información de secuencia y la información transmitida a la capa
de red sería correcta.

Protocolo de retroceso n Antes decíamos que los protocolos ARQ (Automatic Repeat reQuest) son aquellos
en que se espera confirmación para cada dato enviado. Se suelen distinguir dos
tipos de ARQ, el RQ 'ocioso' (idle RQ), que corresponde a los protocolos de
parada y espera, o de ventana deslizante de un bit, y el RQ continuo (continuous
RQ) que se utiliza en los protocolos de ventana deslizante de más de un bit
(protocolo que no veremos).

Cuando se utiliza un protocolo de ventana deslizante de más de un bit el emisor
no actúa de forma sincronizada con el receptor; cuando el receptor detecta una
trama defectuosa hay varias posteriores ya en camino, que llegarán
irremediablemente a él, aún cuando reporte el problema inmediatamente.
Existen dos posibles estrategias en este caso:

El receptor ignora las tramas recibidas a partir de la errónea (inclusive) y
solicita al emisor retransmisión de todas las tramas subsiguientes. Esta técnica
se denomina retroceso n y corresponde a una ventana deslizante de tamaño uno en
el receptor.
El receptor descarta la trama errónea y pide retransmisión de ésta, pero acepta
las tramas posteriores que hayan llegado correctamente. Esto se conoce como
repetición selectiva y corresponde a una ventana deslizante mayor de 1 en el
receptor (normalmente de igual tamaño que la ventana del emisor).
En el caso de retroceso n el receptor se asegura que las tramas se procesarán
en secuencia, por lo que no tiene que reservar espacio en el buffer para más
de una trama. En el caso de repetición selectiva el receptor ha de disponer de
espacio en el buffer para almacenar todas las tramas de la ventana, ya que en
caso de pedir retransmisión tendrá que intercalar en su sitio la trama
retransmitida antes de pasar las siguientes a la capa de red (recordemos que la
capa de red debe recibir los paquetes estrictamente en orden).

En cualquiera de los dos casos el emisor deberá almacenar en su buffer todas las
tramas que se encuentren dentro de la ventana, ya que en cualquier momento el
receptor puede solicitar la retransmisión de alguna de ellas.

Destacaremos que un número de secuencia de n bits permite tener como máximo una
ventana de 2n-1 tramas, y no de 2n. Por ejemplo, con un número de secuencia de
tres bits el emisor puede enviar como máximo siete tramas (no ocho) sin esperar
contestación. La razón es que así se garantiza que el número de trama recibido en
dos ACK sucesivos siempre será distinto, y no habrá duda posible en la detección
de duplicados que pudieran producirse por ejemplo por expiración prematura de timers;
en caso contrario se podrían producir conflictos.

Protocolo con repetición selectiva
La repetición selectiva consiste en aprovechar aquellas tramas correctas que
lleguen después de la errónea, y pedir al emisor que retransmita únicamente esta
trama. Su funcionamiento corresponde al de una ventana deslizante de igual tamaño
en el emisor que en el receptor. Como a la capa de red se le requiere que transfiera
os paquetes a la capa de red en orden, para que esta estrategia funcione correctamente
el receptor deberá mantener en su buffer todas las tramas posteriores hasta que reciba
correctamente la trama errónea; en la práctica esto supone tener un buffer lo
suficientemente grande para almacenar un número de tramas igual al tamaño de ventana
que este utilizando, ya que por ejemplo con una ventana de tamaño 7 podría ocurrir que
la trama se perdiera en el camino y se recibieran correctamente las tramas 1 a 6 antes
de recibir la 0.

La posibilidad de una recepción no secuencial de tramas plantea algunos problemas
nuevos. Por ejemplo, supongamos que el emisor envía las tramas 0 a 6, las cuales
son recibidas correctamente. Entonces el receptor realiza las siguientes acciones:

las transmite a la capa de red,
libera los buffers correspondientes
avanza la ventana para poder recibir siete tramas más, cuyos números de secuencia
podrán ser 7,0,1,2,3,4,5
envía un ACK para las tramas 0 a 6 recibidas
Imaginemos ahora que el ACK no llega al emisor. Éste supondrá que ninguna de las
tramas ha llegado, por lo que reenviará las tramas 0 a 6 de nuevo. De estas las
tramas 0 a 5 se encuentran dentro de la ventana del receptor. En procesamiento
secuencial el receptor no aceptaría estas tramas si no recibe antes la trama 7
pendiente, pero con retransmisión selectiva se aceptarían y se pediría
retransmisión de la trama 7; una vez recibida ésta se pasaría a la capa de red
seguida de las tramas 0 a 5 antes recibidas, que serían duplicados de las
anteriores. En este caso el receptor pasará tramas duplicadas al nivel de red,
con lo que el protocolo es erróneo.

La solución a este conflicto está en evitar que un mismo número de secuencia pueda
aparecer en dos ventanas consecutivas. Por ejemplo si el tamaño de ventana es de 7
el número de secuencia podría ser de 4 bits (módulo 16, numeración 0-15) con lo que
la ventana del receptor sería 0-6, 7-13, 14-4, etc. Al no coincidir números de
secuencia en ventanas contiguas se puede efectuar el proceso no secuencial de tramas
sin conflicto. Con un número de secuencia de 4 bits el tamaño de ventana se podría
ampliar a 8 sin conflicto, ya que en tal caso la ventana permitida oscilaría en el
rango 0-7 y 8-15. El valor máximo de la ventana para un protocolo de repetición
selectiva en el caso general sería (MAX_SEQ+1)/2.

Aunque el número de secuencia se ha duplicado respecto al caso anterior, el número de
tramas que hay que mantener en el buffer no necesita ser superior al tamaño de ventana,
ya que este será el número máximo de tramas que habrá que manejar en cualquier circunstancia.

Como es lógico la técnica de repetición selectiva da lugar a protocolos más complejos
que la de retroceso n, y requiere mayor espacio de buffers en el receptor (pues hemos
pasado de almacenar una trama a almacenar tantas como lo requiera el tamaño de ventana).
Sin embargo, cuando las líneas de transmisión tienen una tasa de errores elevada da un mejor
rendimiento, ya que permite aprovechar todas las tramas correctamente transmitidas.
La decisión de cual utilizar se toma valorando en cada caso la importancia de estos factores:
complejidad, espacio en buffers, tasa de errores y eficiencia.