RDT
TRANSFERENCIA FIABLE DE DATOS
Principios de transferencia de datos fiable
• Importante en las capas de aplicación, transporte y enlace
• En la lista de los 10 tópicos más importantes de redes!
ECP
• Las características del canal no fiable determinan la complejidad del protocolo RDT
2
Transferencia de datos fiable: comenzando
rdt_send(): llamado de arriba, (e.g., por
una aplicación). Pasa datos para entregar a
la capa superior del receptor
deliver_data(): llamado por rdt para
entregar datos a la capa superior
udt_send(): llamado por rdt, para transferir
un paquete sobre un canal no fiable al
receptor
ECP
rdt_rcv(): llamado cuando llega un paquete
al lado receptor del canal
3
Transferencia de datos fiable: comenzando
¿Qué haremos? :
• Desarrollar incrementalmente los extremos emisor y receptor del protocolo de
transferencia de datos fiable (rdt)
• Considerar solo la transferencia de datos unidireccional
Pero la información de control fluirá en ambas direcciones!
• Usar máquinas de estado finito (FSM) para especificar el emisor y el receptor
Evento que causa el cambio de estado
Acciones tomadas al cambiar el estado
estado: estando en este
“estado”, el siguiente
estado se determina estado estado
unívocamente por el 1 evento
2
acción
ECP
siguiente evento
4
Rdt1.0: Transferencia fiable sobre un canal fiable
• Canal subyascente perfectamente fiable
No hay errores de bit
No hay pérdida de paquetes
• FSMs separados para emisor, receptor:
Emisor envia datos al canal subyascente
Receptor lee datos del canal subyascente
ECP
emisor receptor
5
Rdt2.0: canal con errores de bit
• Canal subyascente puede invertir los bits en un paquete
checksum para detectar errores de bit
• La pregunta: como recuperarse de errores:
confirmación (ACKs): el receptor explícitamente le dice al emisor que un paquete se
recibio bien
Confirmación negativa (NAKs): el receptor explícitamente le dice al emisor que el
paquete tuvo errores
El emisor retransmite el paquete al recibir un NAK
• Nuevos mecanismos en rdt2.0 (sobre rdt1.0):
Detección de errores
Retroalimentación del receptor: mensajes de control (ACK, NAK) del receptor al
emisor
ECP
6
rdt2.0: Especificación FSM
emisor receptor
ECP
7
rdt2.0: operación sin errores
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
Espera Espera isNAK(rcvpkt) rdt_rcv(rcvpkt) &&
llamada ACK o corrupt(rcvpkt)
udt_send(sndpkt)
de arriba NAK udt_send(NAK)
rdt_rcv(rcvpkt) && Espera
isACK(rcvpkt) llamada
de abajo
L
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
ECP
deliver_data(data)
udt_send(ACK)
8
rdt2.0: Escenario con error
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
Espera Espera rdt_rcv(rcvpkt) && corrupt(rcvpkt)
llamada ACK o isNAK(rcvpkt)
de arriba NAK udt_send(NAK)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && Espera
isACK(rcvpkt) llamada
L de abajo
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
ECP
deliver_data(data)
udt_send(ACK)
9
rdt2.0 tiene una falla fatal!
¿Qué ocurre si los ACK/NAK se Manejar duplicados:
corrompen?
• El emisor retransmite el paquete actual si
el ACK/NAK está dañado
• El emisor agrega un número de
• El emisor no sabe que ocurrió en el
receptor! secuencia a cada paquete
• El receptor descarta (no entrega hacia
• No puede retransmitir simplemente:
posible duplicado arriba) el paquete duplicado
Parada y espera (Stop and wait)
ECP
El emisor envia un paquete y espera la respuesta del receptor
10
rdt2.1: El emisor maneja ACK/NAKs dañados
ECP
11
rdt2.1: el receptor maneja ACK/NAKs dañados
ECP
12
rdt2.1: Discusión
Emisor: Receptor:
• #sec agregado al paquete • Debe verificar si el paquete
recibido es duplicado
• Dos #sec (0,1) serán suficientes. El estado indica si el #sec
¿Porqué? esperado es 0 o 1
• Debe verificar si el ACK/NAK • Nota: el receptor no puede
recibido esta dañado saber si su último ACK/NAK
• Dos veces mas estados fue recibido correctamente en
Un estado debe “recordar” si el paquete
el emisor
“actual” tiene #sec 0 o 1
ECP
13
rdt2.2: Un protocolo libre de NAK
• La misma funcionalidad que rdt2.1, usando solo ACKs
• En vez de un NAK, el receptor envía un ACK por el último paquete
recibido OK
El receptor debe incluir explícitamente el #sec del paquete confirmado
• Un ACK duplicado en el emisor resulta en la misma acción que un NAK:
se retransmite el paquete actual
ECP
14
rdt2.2: Emisor
ECP
15
rdt2.2: Receptor
ECP
16
rdt3.0: Canal con errores y pérdida
Nueva presunción: Enfoque: el emisor espera por un tiempo
“razonable” un ACK
El canal subyacente puede
• Retransmite si no se recibe ningún ACK en ese
también perder paquetes de tiempo
datos o ACKs
• Si el paquete (o ACK) solo se retrasó (no se
Suma de verificación, #sec, ACKs y perdió) :
retransmisiones son de ayuda, pero
La retransmisión generará un duplicado, pero
no suficientes el uso de #sec resuelve este problema
El receptor debe especificar #sec del paquete
confirmado
• Requiere de un contador descendente
ECP
17
rdt3.0 emisor
ECP
18
rdt3.0 en acción
ECP
19
rdt3.0 en acción
ECP
20
Desempeño de rdt3.0
• rdt3.0 funciona, pero el desempeño es bajo
• Ejemplo:
En un enlace de 1 Gbps, con retardo de propagación de 15 ms, y
tamaño de paquete de 8000 bits:
𝐿 8000𝑏
𝑑𝑡𝑟𝑎𝑛𝑠 = = 9 = 8µ𝑠
𝑅 10 𝑏𝑝𝑠
Utilización del emisor
Uemisor : Fracción de tiempo que el emisor está ocupado enviando
RTT : Tiempo de ida y vuelta (Round Trip Time)
ECP
21
rdt3.0: operación de parada y espera
𝐿ൗ 0.008𝑚𝑠
𝑈𝑒𝑚𝑖𝑠𝑜𝑟 = 𝑅 = = 0.00027
𝐿
𝑅𝑇𝑇 + ൗ𝑅 30.008𝑚𝑠
ECP
1 PDU de 1KB cada 30 ms → 33KBps (267Kbps) aún sobre un enlace de 1Gbps
El protocolo de red limita el uso de los recursos físicos!
22
Protocolos entubados (encauzados)
Encauzamiento: el emisor permite múltiples paquetes, “en camino”, por confirmar
El rango de números de secuencia debe incrementarse
Buffers en el emisor y receptor
• Dos formas genéricas de protocolos encauzados: regresar a N, repetición selectiva
ECP
23
Encauzamiento: utilización mejorada
Incrementa la
utilización
en un factor de 3!
3 × 𝐿ൗ𝑅 0.024
𝑈𝑒𝑚𝑖𝑠𝑜𝑟 = = = 0.0008
𝐿
ECP
𝑅𝑇𝑇 + ൗ𝑅 30.008
24
Protocolos encauzados
Regresar a N: Repetición selectiva:
• El emisor puede tener hasta N paquetes sin • El emisor puede tener hasta N
confirmar en el cauce paquetes sin confirmar en el cauce
• El receptor solo envía ACKs acumulativos • El receptor confirma paquetes
No confirma un paquete si existe un espacio individuales
• El emisor tiene un temporizador para el • El emisor mantiene un temporizador
paquete mas viejo sin confirmar por cada paquete sin confirmar
Si el temporizador expira, retransmite todos Cuando expira el temporizador,
los paquetes no confirmados retransmite solo el paquete no
confirmado
ECP
25
Regresar a N
Emisor:
• #sec de k bits en encabezado de paquete
• “Ventana” de hasta N, paquetes consecutivos sin confirmar permitidos
ACK(n): Confirma todos los paquetes hasta #sec n inclusive – “ACK acumulativo”
Puede recibir ACKs duplicados (ver receptor)
Timer para cada paquete en camino
timeout(n): Retransmite el paquete n y todos los paquetes con #sec mayor en la ventana
ECP
26
Regresar a N: FSM extendido del emisor
ECP
27
Regresar a N: FSM extendido del receptor
ACK-only: siempre envía un ACK por
paquete correctamente recibido con el
mayor #sec en orden
Puede generar ACKs duplicados
Solo necesita recordar expectedseqnum
• Paquetes fuera de orden:
descartar (no poner en buffer) -> no
requiere buffer en el receptor!
Reconfirmar el paquete con el mayor #sec
en orden
ECP
28
Regresar a N en acción
ECP
29
Repetición selectiva
• El receptor confirma individualmente todos los paquetes correctamente
recibidos
Pone en buffer los paquetes, según se requiera, para su eventual entrega ordenada a
la capa superior
• El emisor solo reenvía los paquetes para los cuales no se recibió un ACK
Un timer por cada paquete no confirmado en el emisor
• Ventana del emisor
N #sec consecutivos
Limita los #sec de paquetes enviados sin confirmar
ECP
30
Repetición selectiva: ventanas de emisor y receptor
ECP
31
Repetición selectiva
Emisor Receptor
Paquete n en [rcvbase, rcvbase+N-1]
Datos desde arriba :
enviar ACK(n)
• Si el siguiente #sec disponible esta en la Fuera de orden: buffer
ventana, enviar paquete En orden: entregar (también entregar
paquetes ordenados en buffer),
Timeout(n):
avanzar la ventana al siguiente
• Reenviar paquete n, reiniciar timer paquete por recibir
Paquete n en [rcvbase-N,rcvbase-1]
ACK(n) en [sendbase,sendbase+N]:
Paquete duplicado. Enviar ACK(n)
• Marcar paquete n como recibido En otro caso:
• Si n es el paquete menor sin confirmar, Ignorar paquete
avanzar la base de la ventana al
siguiente #sec sin confirmar
ECP
32
Repetición selectiva en acción
ECP
33
Repetición selectiva: dilema
Ejemplo:
• #’s sec: 0, 1, 2, 3
• Tamaño de ventana=3
• El receptor no ve ninguna diferencia en los dos
escenarios!
• Erroneamente pasa datos duplicados como
nuevos en (a)
Preg: ¿Que relación existe entre el tamaño de
#sec y el tamaño de la ventana?
ECP
34