Redes de Computadores Aula 6 Aula passada Camada de transporte Multiplexação Princípios de transmissão confiável Aula de hoje Eficiência Go Back N Selective Repeat Stop and wait
Eficiência do Stop-and-Wait Início da transmissão Fim da transmissão Recebe confirmação Pacote L bytes Taxa de transmissão R Propagação p Vazão máxima do canal? Utilização? Muito ruim! tempo tempo
Eficiência do Stop-and-Wait Pacote L bytes Taxa de transmissão R Propagação p Vazão = L / (L/R + 2p) Ex. L = 1000 bytes, R = 1Gbps, p = 10ms V = 400Kbps Apesar do enlace ser de 1Gbps! U = 0.4/1000 = 0.0004! Como melhorar eficiência?
Protocolos com Pipeline Pipeline: transmissor permite múltiplos pacotes em trânsito, antes de receber ACK Problemas que teremos que resolver? Significado do ACK, número de sequência, ordenação, bufferização
Vazão com Pipeline Rx ACK 1 Rx ACK 2 Rx ACK 3 Tx P1 Tx P2 Tx P3 Tx P4 Tx P5 Tx P6 Tx ACK 1 Tx ACK 2 Tx ACK 3 Supor pipeline de 3 pacotes Ganho na vazão? Ganho na utilização? Transmissão de 3 pacotes Vazão 3 vezes maior! tempo tempo
Protocolos com Pipeline (ou Janela) Go-back N Tx poder ter até N pacotes sem ACK no pipeline Rx transmite ACKs cumulativos Não envia ACK se tiver faltando na sequência Tx tem timer para pacote mais antigo sem ACK Retransmite todos os pacotes se timer expira Selective Repeat: Tx pode ter até N pacotes sem ACK no pipeline RX envia ACK individual para pacotes Tx mantém um timer para cada pacote Retransmite somente o pacote se timer expira
Go-Back-N Sender: k-bit seq # in pkt header window of up to N, consecutive unack ed pkts allowed ACK(n): ACKs all pkts up to, including seq # n - cumulative ACK may receive duplicate ACKs (see receiver) timer for each in-flight pkt timeout(n): retransmit pkt n and all higher seq # pkts in window
GBN: sender extended FSM rdt_send(data) Λ base=1 nextseqnum=1 rdt_rcv(rcvpkt) && corrupt(rcvpkt) 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 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
GBN: receiver extended FSM 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++ ACK-only: always send ACK for correctly-received pkt with highest in-order seq # may generate duplicate ACKs need only remember expectedseqnum out-of-order pkt: discard (don t buffer) -> no receiver buffering! Re-ACK pkt with highest in-order seq #
GBN in action
Selective Repeat receiver individually acknowledges all correctly received pkts buffers pkts, as needed, for eventual in-order delivery to upper layer sender only resends pkts for which ACK not received sender timer for each unacked pkt sender window N consecutive seq # s again limits seq #s of sent, unacked pkts
Selective repeat: sender, receiver windows
Selective repeat sender data from above : if next available seq # in window, send pkt timeout(n): resend pkt n, restart timer ACK(n) in [sendbase,sendbase+n]: mark pkt n as received if n smallest unacked pkt, advance window base to next unacked seq # pkt n in [rcvbase, rcvbase+n-1] send ACK(n) out-of-order: buffer in-order: deliver (also deliver buffered, in-order pkts), advance window to next not-yet-received pkt pkt n in [rcvbase-n,rcvbase-1] ACK(n) otherwise: receiver ignore
Selective repeat in action
Selective repeat: dilemma Example: seq # s: 0, 1, 2, 3 window size=3 receiver sees no difference in two scenarios! incorrectly passes duplicate data as new in (a) Q: what relationship between seq # size and window size?