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

Documentos relacionados