Transport Layer 3-1
Capítulo 3
Capa de Transporte
Transport Layer 3-2
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ícitamenteincluir # 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-3
rdt2.2: Fragmentos de transmisor y
receptor
Wait for call 0 from
above
sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt)
rdt_send(data)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) ||
isACK(rcvpkt,1))
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)
Wait for ACK
0 Fragmento transmisor FSM
Wait for 0 from below
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data) deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt) rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq1(rcvpkt)) udt_send(sndpkt)
Transport Layer 3-4
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 3-5
rdt3.0
Transmisor
sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt)
start_timer rdt_send(data)
Wait for ACK0
rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,1) )
Wait for call 1 from
above
sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt)
start_timer rdt_send(data)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)
rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,0) ) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,1)
stop_timer stop_timer
udt_send(sndpkt) start_timer timeout
udt_send(sndpkt) start_timer timeout
rdt_rcv(rcvpkt) Wait for call 0from
above
Wait for ACK1
Λ
rdt_rcv(rcvpkt)
Λ Λ
Λ
rdt3.0 en acción
a) Operación sinpérdidas
Transport Layer 3-7
rdt3.0 en acción
c) Pérdida de ACK d) Timeout prematuro
Transport Layer 3-8
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:
s
s
b
paquete
kb
R
L
T
transmitir8
μ
/
10
/
8
9
=
=
=
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!
bps
en
ón
transmisi
de
Tasa
:
bits
en
paquete
del
Largo
:
R
L
00027
.
0
008
.
30
008
.
0
/
/
=
=
+
=
R
L
RTT
R
L
U
transmisorTransport Layer 3-9
rdt3.0: Operación stop-and-wait
first packet bit transmitted, t = 0
transmisor receptor
RTT
last packet bit transmitted, t = L / R
Primer bit del paquete llega Ultimo bit del paquete llega, envía ACK
ACK llega, envía siguiente paquete, t = RTT + L / R
U sender = .008
30.008 = 0.00027 L / R
Transport Layer 3-10
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-11
Pipelining: incrementa la utilización
first packet bit transmitted, t = 0
transmisor receptor
RTT last bit transmitted, t = L / R
first packet bit arrives last packet bit arrives, send ACK
ACK arrives, send next packet, t = RTT + L / R
last bit of 2ndpacket arrives, send ACK
last bit of 3rdpacket arrives, send ACK
U sender = .024
30.008 = 0.0008 3 * L / R
RTT + L / R =
Incrementa la utilización en un factor de 3!
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
Transport Layer 3-13
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 hasta N, paquetes consecutivos con acuse de recibo pendiente
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
Próximo número de secuencia a usar Núm. Sec. más antiguo
sin ACK: Base
Tamaño de ventana N
Con ACK recibidos ACK
pendientes No usable
Usable, aún no enviados
Transport Layer 3-14
GBN: Extendido FSM del transmisor
Wait start_timerudt_send(sndpkt[base]) udt_send(sndpkt[base+1]) …
udt_send(sndpkt[nextseqnum-1]) timeout
rdt_send(data) 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)
base = getacknum(rcvpkt)+1 If (base == nextseqnum)
stop_timer else
start_timer rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt) base=1
nextseqnum=1
rdt_rcv(rcvpkt) && corrupt(rcvpkt)
Λ
Transport Layer 3-15
GBN: Extendido FSM del receptor
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
Wait udt_send(sndpkt)
default
rdt_rcv(rcvpkt) && notcurrupt(rcvpkt)
&& hasseqnum(rcvpkt,expectedseqnum) extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(expectedseqnum,ACK,chksum) udt_send(sndpkt)
expectedseqnum++ expectedseqnum=1
sndpkt =
make_pkt(expectedseqnum,ACK,chksum)
Transport Layer 3-16
GBN en
acción
Transport Layer 3-17
Selective Repeat (repetición
selectiva)
Receptor envía acuse de recibo
individuales
de
todos los paquetes recibidos
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
Selective repeat: Ventanas de Tx y Rx
Con ACKrecibidos ACK
pendientes No usable
Usable, aún no enviados
Esperado, aún no recibido
Fuera de orden (almacenados) con
ACK enviado
Aceptable (en ventana)
No usable
a) Vista del transmisor de los número de secuencia
Transport Layer 3-19
Selective repeat (repetición
selectiva)
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)
: Marcar paquete n como
recibido
Si n es el paquete más
antiguo sin ACK, avanzar la base de la ventana al próximo # de sec. sin ACK.
Transmisor
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
Fuera de la ventana:
ignóreloReceptor
Transport Layer 3-20
Repetición Selectiva en Acción
Transport Layer 3-21
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)
Transport Layer 3-22
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-23
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
TCP: Generalidades
RFCs: 793, 1122, 1323, 2018, 2581 Datos full duplex:
Flujo de datos bi-directional en la misma conexión
MSS: maximum segment size
orientado-a la conexión:
handshaking (intercambio de mensajes de control) init’s sender, estado del receptor antes del intercambio de datos
Flujo controlado:
Transmisor no saturará al receptor
point-to-point:
Un transmisor, un receptor
confiabilidad, byte steam en
orden:
pipelined:
Congestión TCP y control de flujo fijan el tamaño de la ventana
Buffers transmisor &
receptor
socket door
TCP TCP
socket door
application writes data
Transport Layer 3-25
Estructura del segmentoTCP
source port # dest port # 32 bits application data (variable length) sequence number acknowledgement number Receive window Urg data pnter checksum F S R P A U head
len usednot
Options (variable length) URG: datos urgente
(generalmente no usado) ACK: ACK #
valid PSH: push data now eneralmente no usado)
RST, SYN, FIN: connection estab (setup, teardown commands) # bytes rcvr willing to accept Cuenta por bytes de datos (no segmentos!)
Internet checksum (como en UDP)
Transport Layer 3-26
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 A Host B
Seq=42, ACK=79, d ata = ‘C’
Seq=79, A CK=43, d
ata = ‘C’
Seq=43, ACK=80
Usuario teclea ‘C’ host ACKs recepción del echoed ‘C’ host ACKs de recepción ‘C’, echoes back ‘C’ tiempo Escenario telnet simple
Transport Layer 3-27
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
SampleRTTvariará, quiere un estimado de RTT más pulido
Promediar algunas medidas
Transport Layer 3-28
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-29
Ejemplo de estimación de RTT:
RTT: gaia.cs.umass.edu to fantasia.eurecom.fr
100 150 200 250 300 350
1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106
time (seconnds)
R
TT
(m
illi
se
conds
)
SampleRTT Estimated RTT
TCP Round Trip Time y Timeout
Fijando el timeout
EstimtedRTTmá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:
TimeoutInterval = EstimatedRTT + 4*DevRTT DevRTT = (1-β)*DevRTT +
β*|SampleRTT-EstimatedRTT|
(tipicamente, β = 0.25)
Transport Layer 3-31
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