1 Capítulo 3 Capa de Transporte
Transcripción
1 Capítulo 3 Capa de Transporte
Capítulo 3 Capa de Transporte Transport Layer 3-1 rdt2.2: un protocolo libre de NAK La misma funcionalidad que rdt2.1, usando sólo ACKs En lugar de NAK, el receptor envía ACK por el último paquete recibido OK Receptor debe explícitamente incluir # de secuencia del paquete siendo confirmado con el ACK ACK duplicados en el Tx resulta en la misma acción que NAK: retransmitir paquete actual Transport Layer 3-2 rdt2.2: Fragmentos de transmisor y receptor rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || Wait for Wait for isACK(rcvpkt,1) ) ACK call 0 from 0 udt_send(sndpkt) above Fragmento transmisor FSM rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || has_seq1(rcvpkt)) udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0) Wait for 0 from below Fragmento receptor FSM Λ rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(ACK1, chksum) udt_send(sndpkt) Transport Layer 3-3 1 rdt3.0: Canales con errores y pérdidas Suposición nueva: canal subyacente también puede perder paquetes (de datos o ACKs) checksum, # de secuencias, ACKs, y retransmisiones ayudan pero no son suficientes Estrategia: transmisor espera un tiempo “razonable” por el ACK Retransmitir si no se recibe ACK en este tiempo Si el paquete (o ACK) está retardado (no perdido): La retransmisión será un duplicado, pero el uso de #’s de secuencia ya maneja esto Receptor debe especificar el # de secuencia del paquete siendo confirmado en el ACK Se requiere un temporizador de cuenta regresiva Transport Layer rdt3.0 Transmisor rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,1) ) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) Λ rdt_send(data) Λ Wait for ACK0 Wait for call 0from above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,1) 3-4 timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0) stop_timer stop_timer timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,0) ) Λ Wait for ACK1 Wait for call 1 from above rdt_rcv(rcvpkt) Λ rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer Transport Layer 3-5 rdt3.0 en acción a) Operación sin pérdidas b) Operación con pérdidas Transport Layer 3-6 2 rdt3.0 en acción c) Pérdida de ACK d) Timeout prematuro Transport Layer 3-7 Desempeño de rdt3.0 rdt3.0 funciona, pero su desempeño es malo Ejemplo: enlace de 1 Gbps, 15 ms de retardo ext. a ext, paquetes de 1KB: Ttransmitir = L 8kb / paquete = = 8μs R 109 b / s U transmisor = L : Largo del paquete en bits R : Tasa de transmisión en bps L/ R 0.008 = = 0.00027 RTT + L / R 30.008 U transmisor: utilización del transmisor o canal = fracción de tiempo que el transmisor/canal está ocupado transmitiendo 1 paquete de 1KB cada ~30 ms -> 33kB/s throughput en enlace de 1 Gbps Protocolo de red limita el uso de los recursos físicos! Transport Layer 3-8 rdt3.0: Operación stop-and-wait transmisor receptor first packet bit transmitted, t = 0 last packet bit transmitted, t = L / R Primer bit del paquete llega Ultimo bit del paquete llega, envía ACK RTT ACK llega, envía siguiente paquete, t = RTT + L / R U sender = L/R RTT + L / R = .008 30.008 = 0.00027 Transport Layer 3-9 3 Protocolos con Pipeline Con Pipeline: Transmisor permite múltiples paquetes en tránsito con acuse de recibo pendiente El rango de los números de secuencia debe ser aumentado Se requiere buffers en el Tx y/o Rx Hay dos formas genéricas de protocolos con pipeline: go-Back-N, selective repeat (repetición selectiva) Transport Layer 3-10 Pipelining: incrementa la utilización transmisor receptor first packet bit transmitted, t = 0 last bit transmitted, t = L / R first packet bit arrives last packet bit arrives, send ACK last bit of 2nd packet arrives, send ACK last bit of 3rd packet arrives, send ACK RTT ACK arrives, send next packet, t = RTT + L / R Incrementa la utilización en un factor de 3! U sender = 3*L/R RTT + L / R = .024 30.008 = 0.0008 Transport Layer 3-11 Protocolos de Pipelining Go-back-N: Transmisor puede tener hasta N paquetes unacked en el pipeline Rcvr solo envía acks acumulativos No hace un ack del paquete si hay una interrupción Transmisor tiene un timer para los paquetes viejos unacked Si el timer expira, se retransmite todos los paquetes unacked Selective Repeat: Transmisor puede tener hasta N paquetes unacked en el pipeline Rcvr acks paquetes individuales Transmisor mantiene un timer para cada uno de los paquetes unacked Cuando el timer expira, retransmite unicamente el paquete unack Transport Layer 3-12 4 Go-Back-N Transmisor: # de secuencia de k-bits en el encabezado del paquete Si k bits son reservados para el numero de secuencia entonces el rango va desde 0 hasta (modulo counter) “ventana” de hastaPróximo N, paquetes consecutivos con acuse de recibo pendiente número de Núm.Sec. más antiguo secuencia a usar Con ACK Usable, aún sin ACK: Base recibidos no enviados ACK pendientes No usable Tamaño de ventana N ACK(n): da acuse de recibo a todos los paquetes hasta el con # de secuencia n; corresponde a un “acuse de recibo acumulado” Podría recibir ACKs duplicados Usa un timer por cada paquete en tránsito timeout(n): retransmitir paquete n y todos los paquetes que han sido enviados después de este pero no se ha recibido ack Transport Layer 3-13 GBN: Extendido FSM del transmisor rdt_send(data) Λ base=1 nextseqnum=1 if (nextseqnum < base+N) { sndpkt[nextseqnum] = make_pkt(nextseqnum,data,chksum) udt_send(sndpkt[nextseqnum]) if (base == nextseqnum) start_timer nextseqnum++ } else refuse_data(data) Wait rdt_rcv(rcvpkt) && corrupt(rcvpkt) timeout start_timer udt_send(sndpkt[base]) udt_send(sndpkt[base+1]) … udt_send(sndpkt[nextseqnum-1]) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) base = getacknum(rcvpkt)+1 If (base == nextseqnum) stop_timer else start_timer Transport Layer 3-14 GBN: Extendido FSM del receptor default udt_send(sndpkt) Λ Wait expectedseqnum=1 sndpkt = make_pkt(expectedseqnum,ACK,chksum) rdt_rcv(rcvpkt) && notcurrupt(rcvpkt) && hasseqnum(rcvpkt,expectedseqnum) extract(rcvpkt,data) deliver_data(data) sndpkt = make_pkt(expectedseqnum,ACK,chksum) udt_send(sndpkt) expectedseqnum++ Sólo ACK: siempre envía ACK de paquete correctamente recibido con el # de secuencia Puede generar ACKs duplicados Sólo necesita recordar expectedseqnum Paquetes fuera de orden: descartarlos (no almacenar en buffer) => no requiere buffer en receptor! Re-envía ACK del más reciente paquete en orden recibido Transport Layer 3-15 5 GBN en acción Transport Layer 3-16 Selective Repeat (repetición selectiva) Receptor envía acuse de recibo todos los paquetes recibidos individuales de Almacena paquetes en buffer, según necesidad para su entrega en orden a la capa superior Transmisor sólo re-envía los paquetes sin ACK recibido Transmisor usa un timer por cada paquete sin ACK Ventana del Transmisor N # de secuencia consecutivos Nuevamente limita los #s de secuencia de paquetes enviados sin ACK Transport Layer 3-17 Selective repeat: Ventanas de Tx y Rx Con ACK recibidos ACK pendientes Usable, aún no enviados No usable a) Vista del transmisor de los número de secuencia Fuera de orden (almacenados) con ACK enviado Esperado, aún no recibido Aceptable (en ventana) No usable b) Vista del receptor de los número de secuencia Transport Layer 3-18 6 Selective repeat (repetición selectiva) Receptor Transmisor Llega datos desde arriba: Si el próximo # de sec. está en ventana, enviar paquete timeout(n): Re-enviar paquete n, re- iniciar timer ACK(n) : Llega paquete n , Enviar ACK(n) Si está fuera de orden: almacenar en buffer en-orden: entregar a capa superior (también entregar paquetes en orden del buffer), avanzar ventana al paquete próximo aún no recibido Marcar paquete n como recibido Fuera de la ventana: antiguo sin ACK, avanzar la base de la ventana al próximo # de sec. sin ACK. ignórelo Si n es el paquete más Transport Layer 3-19 Transport Layer 3-20 Transport Layer 3-21 Repetición Selectiva en Acción Dilema de la repetición Selectiva Ejemplo: #s de sec.: 0, 1, 2, 3 Tamaño de ventana=3 Rx no ve diferencia en los dos escenarios! Pasa incorrectamente datos como nuevos en (a) Q: ¿Qué relación debe existir entre el # de sec. y el tamaño de ventana? 7 Q: ¿Qué relación debe existir entre el # de sec. y el tamaño de ventana? La clave para evitar este problema es impedir que se pueda producir el escenario de la figura adjunta. Los tamaños de las ventanas del receptor y el transmisor deben ser: Donde k es el número de bit usados para definir la secuencia Transport Layer 3-22 Capítulo 3: Continuación 3.1 Servicios de la 3.5 Transporte capa transporte 3.2 Multiplexing y demultiplexing 3.3 Transporte sin conexión: UDP 3.4 Principios de transferencia confiable de datos orientado a la conexión: TCP Estructura de un segmento Transferencia confiable de datos Control de flujo Gestión de la conexión 3.6 Principios del control de congestión 3.7 Control de congestión en TCP Transport Layer TCP: Generalidades 3-23 RFCs: 793, 1122, 1323, 2018, 2581 point-to-point: Datos full duplex: Un transmisor, un receptor confiabilidad, orden: pipelined: byte steam en Congestión TCP y control de flujo fijan el tamaño de la ventana Flujo de datos bidirectional en la misma conexión MSS: maximum segment size orientado-a la conexión: Buffers transmisor & receptor handshaking (intercambio de mensajes de control) init’s sender, estado del receptor antes del intercambio de datos Flujo controlado: socket door application writes data application reads data TCP send buffer TCP receive buffer segment socket door Transmisor no saturará al receptor Transport Layer 3-24 8 Estructura del segmentoTCP 32 bits URG: datos urgente (generalmente no usado) ACK: ACK # valid PSH: push data now eneralmente no usado) RST, SYN, FIN: connection estab (setup, teardown commands) source port # Cuenta por bytes de datos (no segmentos!) dest port # sequence number acknowledgement number head not UA P R S F len used Receive window checksum # bytes rcvr willing to accept Urg data pnter Options (variable length) application data (variable length) Internet checksum (como en UDP) Transport Layer 3-25 TCP número de secuencia y ACKs #’s secuencia: “numero” del flujo de bytes definido por el primer byte en el segmento de datos ACKs: # secuencia del siguiente byte esperado por el otro lado ACK acumulativo Q: Como el receptor maneja los segmentos fuera de orden A: Los RFC no los mencionan, se lo dejan al programador Host B Host A Usuario teclea Seq =42, A CK=7 ‘C’ 9, da ta = ‘C ’ Seq= host ACKs recepción del echoed ‘C’ 79, A Seq=43 CK=4 ta = 3, da ‘C’ host ACKs de recepción ‘C’, echoes back ‘C’ , ACK =80 Escenario telnet simple Transport Layer tiempo 3-26 TCP Round Trip Time y el Timeout Q: Como se puede fijar el valor de TCP timeout ? Más largo que RTT pero RTT varia Muy corto: timeout prematuro Retransmisiones no necesarias Muy largo: reacción lerda a la pérdida de segmentos Q: Como se estima RTT? SampleRTT: tiempo medido desde la transmisión del segmento hasta la recepción del ACK Ignorar las retransmisiones SampleRTT variará, quiere un estimado de RTT más pulido Promediar algunas medidas recientes no solamente la actual SampleRTT Transport Layer 3-27 9 TCP Round Trip Time yTimeout EstimatedRTT = (1- α)*EstimatedRTT + α*SampleRTT Movimiento exponencial Influencia de las muestras pasadas decrementa rápidamente el exponencial Valor típico: α = 0.125 Transport Layer 3-28 Ejemplo de estimación de RTT: RTT: gaia.cs.umass.edu to fantasia.eurecom.fr 350 RTT (milliseconds) 300 250 200 150 100 1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 time (seconnds) SampleRTT Estimated RTT Transport Layer 3-29 TCP Round Trip Time y Timeout Fijando el timeout EstimtedRTT más “margen de seguridad” Variaciones largas en el EstimatedRTT -> margen de seguridad más largo DevRTT es un estimado de cuanto el SampleRTT se desvía del EstimatedRTT: DevRTT = (1-β)*DevRTT + β*|SampleRTT-EstimatedRTT| (tipicamente, β = 0.25) Luego fijar el intervalo de timeout: TimeoutInterval = EstimatedRTT + 4*DevRTT Transport Layer 3-30 10 Capítulo 3: Continuación 3.1 Servicios de la capa transporte 3.2 Multiplexing y demultiplexing 3.3 Transporte sin conexión: UDP 3.4 Principios de transferencia confiable de datos 3.5 Transporte orientado a la conexión: TCP Estructura de un segmento Transferencia confiable de datos Control de flujo Gestión de la conexión 3.6 Principios del control de congestión 3.7 Control de congestión en TCP Transport Layer 3-31 11