Full transcript
0:00Hola, hoy vamos a ver otras formas de establecer una comunicación confiable.
0:04Hasta ahora vimos que TCP puede mantener una comunicación confiable usando Stop & Wait.
0:09Sin embargo, Stop & Wait es sumamente ineficiente.
0:12Alternativas como Go-Back N y Selective Repeat son mucho más eficientes.
0:17Ambas formas de enviar datos utilizan lo que se llaman “ventanas deslizantes” o sliding windows.
0:22Para entender este concepto, imaginemos que queremos mandar un mensaje,
0:25el cual está dividido en varios segmentos, de esta manera.
0:29Al usar ventanas deslizantes manejamos estos segmentos por grupos o ventanas de un cierto tamaño N.
0:34Por ejemplo, podríamos tener que el emisor maneja una ventana de tamaño 3 y envía estos 3 segmentos uno tras otro
0:42sin tener que esperar los ACKs como ocurría en Stop & Wait.
0:46Conforme el emisor va recibiendo los ACKs, esta ventana se va moviendo y se van enviando nuevos segmentos,
0:52de ahí el nombre “ventana deslizante” o “sliding window”.
0:56Debemos notar que esta ventana deslizante se puede usar tanto en el emisor como en el receptor.
1:02En esta sección vamos a aumentar el número de secuencia de acuerdo a la posición del segmento luego de dividir el mensaje.
1:09En particular, dada una ventana de tamaño N, vamos a tener que las posiciones van a ir de 0 a 2N-1.
1:16Si N = 3 vamos a tener estas ubicaciones.
1:20Con esto, los números de secuencia van a estar siempre entre “Y” e “Y + 2N -1”,
1:25donde Y es el número de secuencia almacenado al comenzar el envío de datos.
1:30Pero, ¿por qué este cambio?
1:32Porque si buscan en Internet la mayoría del material usa este formato.
1:37Con esto veamos cómo funciona Go-back N con nuestra versión “simplificada” de TCP.
1:44Go-back N usa una ventana en el lado del emisor.
1:47Coloca un timer luego de enviar el primer segmento.
1:49El receptor solo acepta segmentos consecutivos.
1:53Si se cumple el timeout se reenvía toda la ventana.
1:55Y la ventana del emisor avanza todo lo que puede conforme llegan los ACKs*.
2:00Veamos un ejemplo.
2:01Supongamos una ventana de tamaño 3.
2:04Partimos mandando los primeros 3 segmentos en orden y ponemos un timer luego de enviar el primer segmento dentro de la ventana.
2:11Al llegar el primer segmento, el receptor verifica si el número de secuencia es válido.
2:16Si lo es envía el ACK correspondiente y aumenta el número de secuencia esperado en 1.
2:21Esto se repite para cada segmento que le va llegando al receptor.
2:25Al llegar el ACK del primer segmento, el emisor avanza su ventana,
2:28envía el segmento que acaba de entrar a la ventana y resetea su timer.
2:32Conforme van llegando estos ACKs, vamos repitiendo este proceso.
2:36Por el lado del receptor vemos que el número de secuencia esperado sigue aumentando.
2:41Como N=3, el número de secuencia aumentará hasta llegar a Y+5 y luego volverá a esperar un número de secuencia igual a Y.
2:49Ahora, ¿qué ocurre si hay **pérdida**?
2:51Supongamos que se pierde el segundo segmento de nuestra ventana.
2:54En este caso el emisor recibe el primer segmento y responde ACK.
2:59Como se pierde el segundo segmento, lo siguiente que le llega es el tercer segmento,
3:03pero este trae un número de secuencia MAYOR al número que está esperando, así que lo descarta.
3:08En el emisor, como el primer ACK llegó bien, el emisor avanzó su ventana y envió el cuarto segmento,
3:14sin embargo, este también tiene un número de secuencia mayor al que espera el receptor y este también se descarta.
3:21Eventualmente, el último timer que puso el emisor cumple su timeout.
3:25Al llegar el timeout el emisor reenvía toda la ventana,
3:29la cual en este caso contiene los segmentos 2, 3 y 4.
3:34Si todo sale bien, el proceso continúa como habíamos visto anteriormente.
3:39Ahora, ¿Qué ocurre si se pierde el segundo ACK en vez del segundo segmento?
3:43Si solo se pierde el segundo ACK vamos a ver que el emisor recibe el primer ACK, mueve su ventana,
3:48envía el siguiente segmento y luego recibe el tercer ACK.
3:52Por cómo funciona Go-Back N, sabemos que el receptor enviará un ACK solo si ya recibió los segmentos anteriores con éxito.
3:59De esta forma, cuando el emisor recibe el tercer ACK sabe que tanto el segundo como el tercer segmento llegaron con éxito,
4:05incluso si no le llegó el segundo ACK.
4:07Luego avanza su ventana en 2 y continúa los envíos.
4:12Con Go-Back N todavía no hacemos un uso tan eficiente de los recursos,
4:18pues al cumplirse el timeout volvemos a enviar toda la ventana.
4:22Aquí es donde entra Selective Repeat.
4:24En el caso de Selective Repeat manejamos una ventana en el emisor y una en el receptor.
4:29Como su nombre sugiere, aquí sólo reenviamos los segmentos cuyo ACK no llegó luego de un tiempo.
4:35Para ello, cada segmento tiene su propio timeout.
4:38Y las ventanas avanzan tanto como pueden cada vez que puedan.
4:41Veamos cómo funciona.
4:43Supongamos que tenemos una ventana nuevamente de tamaño 3.
4:46Partimos mandando los primeros 3 segmentos en orden y ponemos un timer para cada segmento enviado.
4:52Ahora notemos que el receptor también tiene una ventana.
4:56Esta ventana espera que le lleguen números de secuencia entre Y e Y+2.
5:00Conforme van llegando los segmentos se verifica el número de secuencia, se añaden a la ventana del receptor,
5:06se envía el ACK correspondiente y se mueve la ventana tanto como se pueda.
5:11Al mover la ventana, se mueven los números de secuencia que el receptor está esperando.
5:15Aquí nos llegan 3 elementos consecutivos de forma exitosa, por lo que la ventana del receptor avanza 3 espacios, uno tras otro.
5:23Por el lado del emisor, conforme llegan los ACK los vamos almacenando y vamos avanzando la ventana lo más que podamos.
5:28Cada vez que entra un nuevo elemento a la ventana del emisor, lo enviamos al receptor y reseteamos el timeout.
5:35Esta secuencia continúa hasta que se reciba todo el mensaje.
5:41Supongamos que se pierde el primer segmento de la ventana.
5:44Aquí vemos que el receptor recibe el segundo y el tercer segmento, los almacena y envía sus ACKs.
5:50Sin embargo, como no ha llegado el primer elemento de la ventana, esta no puede avanzar.
5:54Lo mismo ocurre con el emisor, le llegan los ACKs del segundo y el tercer segmento, por lo que se detienen sus timers y se almacenan sus ACKs.
6:01Pero al no haber llegado el ACK del primer segmento no puede avanzar su ventana y, por lo tanto, no puede enviar más segmentos.
6:09Cuando se cumple el timeout del primer segmento, este se vuelve a enviar.
6:13Al ser recibido por el receptor, este envía su ACK y avanza su ventana 3 espacios.
6:18Ahora el emisor recibe el ACK del primer segmento y logra avanzar su ventana en 3* espacios.
6:25Veamos qué ocurre si llegan bien los segmentos, pero se pierde el primer ACK.
6:30Aquí el emisor recibe todo bien, por lo que avanza su ventana en 3.
6:35Sin embargo, al perderse el primer ACK, el emisor no puede avanzar su ventana.
6:40Al cumplirse el timeout del primer segmento, el emisor reenvía este segmento.
6:45Sin embargo, ¡el receptor ya recibió dicho segmento!
6:48Aquí vemos que el segmento tiene un número de secuencia que cae fuera del rango que espera, por lo que se descarta el segmento.
6:55Como en este caso el número de secuencia que recibe es menor que su rango esperado,
6:59el receptor reenvía el ACK asociado al número de secuencia que acaba de recibir.
7:03De esta forma, el emisor ahora sí recibe el ACK del segmento 1 y logra avanzar su ventana en 2 espacios.
7:09De esta forma, Selective Repeat evita reenviar segmentos de forma innecesaria (en la mayoría de los casos)
7:16En esta clase hemos visto:
7:17Sliding window
7:18Go-back N
7:19Y Selective Repeat
7:20Cualquier duda o consulta, ¡no duden en contactar al equipo docente!