Confundido con el reordenamiento de paquetes

Aug 15 2020

Estaba leyendo un libro de texto que dice sobre el protocolo TCP "Repetición selectiva":

Hemos asumido que los paquetes no se pueden reordenar dentro del canal entre el remitente y el receptor. Esto es generalmente una suposición razonable cuando el remitente y el receptor están conectados por un solo cable físico. Sin embargo, cuando el "canal" que conecta los dos es una red, se puede producir un reordenamiento de paquetes. El enfoque adoptado en la práctica es garantizar que un número de secuencia no se reutilice hasta que el remitente esté "seguro" de que los paquetes enviados anteriormente con el número de secuencia x ya no están en la red. Esto se hace asumiendo que un paquete no puede “vivir” en la red por más de una cantidad de tiempo máxima fija.

Estoy confundido y a continuación están mis dos preguntas.

P1-¿Qué significa "el canal puede considerarse esencialmente como un búfer de paquetes y emitiendo espontáneamente estos paquetes en cualquier momento en el futuro?". ¿media? ¿Por qué necesitamos almacenar en búfer un paquete antiguo? ¿No es mejor que el receptor simplemente lo ignore?

P2-Digamos que el tamaño de la ventana es 2 y el número de secuencia disponible es 0,1,2,3. El remitente envía primero el paquete 0, el paquete 1, mientras que el paquete 0 se golpea de alguna manera y tarda mucho en llegar, por lo que se agota el tiempo; el remitente tiene que enviar el paquete 0 nuevamente, pero esta vez el paquete 0 (nuevo) llega a tiempo. Luego, el remitente envía el paquete 2, el paquete 3, todos recibidos por el receptor. Y luego el remitente está a punto de enviar el paquete 0 (nuevo) y el paquete 1 (nuevo), pero el paquete antiguo 0 llega ahora al receptor, por lo que el receptor no puede saber que este paquete es el paquete antiguo o el paquete nuevo. Entonces, ¿cómo se puede solucionar este problema "asumiendo que un paquete no puede" vivir "en la red durante más tiempo del máximo fijo"? ¿Significa que el encabezado del paquete contiene la hora a la que se envió?

Respuestas

2 Zac67 Aug 16 2020 at 07:31

¿Qué significa "el canal puede considerarse esencialmente como almacenamiento en búfer de paquetes y emitiendo espontáneamente estos paquetes en cualquier momento en el futuro?". ¿media? ¿Por qué necesitamos almacenar en búfer un paquete antiguo? ¿No es mejor que el receptor simplemente lo ignore?

Esa es la naturaleza de la cola y el almacenamiento en búfer, que es una parte esencial de la conmutación de paquetes: los paquetes recibidos se colocan en cola / búfer al ingresar y se eliminan de la cola una vez que se han reenviado. El almacenamiento en búfer es necesario ya que, de lo contrario, el enlace de salida siempre debería estar libre cada vez que se recibe un paquete; eso no es posible para las redes de conmutación de paquetes, solo para las de conmutación de circuitos.

Digamos que el tamaño de la ventana es 2 y el número de secuencia disponible es 0,1,2,3.

La ventana no cuenta paquetes / datagramas sino bytes . Además, el número de secuencia solo se repite cuando su campo de 32 bits se desborda, lo que ocurre solo después de 4 GiB de datos. Sin embargo, ese límite significa que nunca puede haber más de 4 Gib de datos "en vuelo" para evitar la ambigüedad. Dado que la ventana más grande posible es (cercana a) 1 GiB, eso no es un problema.

Tenga en cuenta que con ACK simples y acumulativos, el receptor no puede ACK selectivamente segmentos posteriores cuando todavía falta un segmento anterior. Un ACK significa que se han recibido todos los datos anteriores.

Por ejemplo, con un tamaño de segmento de 1,000 y un tamaño de ventana de 10,000, el remitente envía los datagramas D00-D09 (secuencia 0-9,999). Se reciben D00 y D02-D09, pero D01 se pierde. El receptor aún ACKs 1,000 (la siguiente secuencia de datos esperada) lo que hace que el remitente mueva D0 fuera de la ventana, lo avance a 1,000-10,999 y envíe D10.

Mientras tanto, el receptor ha decidido que hay un problema, por lo que ACKs 1000 nuevamente para indicar eso. El remitente recibe el doble ACK y reenvía D01 (modo reacio) o todos los datos a partir de D01 (modo agresivo). El receptor ya tiene D10 (10,000-10,999), por lo que ACKs 11,000 lo que a su vez mueve la ventana del remitente a 11,000-20,999 (y aborta las retransmisiones aún pendientes, para el modo agresivo).

(He simplificado un poco el proceso, en realidad hay más superposición paralela y un retraso entre el envío y la recepción, por supuesto).

EDITAR: Como Jeff ha señalado correctamente (¡gracias!), El soporte para reconocimientos selectivos (SACK) es casi un hecho hoy. Usando esa opción, el receptor también podría SACK 2,000-9,999 (de D02-D09) de inmediato, por lo que el remitente no comenzaría a retransmitirlos. También podría comenzar a transmitir 11,000-20,999 antes.