Transcript cap 3 p. 1
Capítulo 3: Camada de Transporte
Metas do capítulo:
compreender os
princípios atrás dos
serviços da camada
de transporte:
multiplexação/
demultiplexação
transferência
confiável de dados
controle de fluxo
controle de
congestionamento
aprender os
protocolos da camada
de transporte da
Internet:
UDP: transporte sem
conexão
TCP: transporte
orientado a conexões
Controle de
congestionamento do
TCP
3: Camada de Transporte
3a-1
Conteúdo do Capítulo 3
3.1 Serviços da camada
de transporte
3.2 Multiplexação e
demultiplexação
3.3 UDP: Transporte
não orientado a
conexão
3.4 Princípios da
transferência
confiável de dados
3.5 Transporte
orientado a conexão:
TCP
transferência confiável
controle de fluxo
gerenciamento de
conexões
3.6 Princípios de
controle de
congestionamento
3.7 Controle de
congestionamento do
TCP
3: Camada de Transporte
3a-2
Serviços e protocolos de transporte
provê
comunicação lógica entre
processos de aplicação
executando em hospedeiros
diferentes
protocolos de transporte
executam em sistemas finais:
lado transmissor: quebra as
mensagens das aplicações em
segmentos, repassa-os para a
camada de rede
lado receptor: remonta as
mensagens a partir dos
segmentos, repassa-as para a
camada de aplicação
existem mais de um protocolo de
transporte disponível para as
aplicações
aplicação
transporte
rede
enlace
física
rede
enlace
física
rede
enlace
física
rede
enlace
física
rede
enlace
física
rede
enlace
física
aplicação
transporte
rede
enlace
física
Internet: TCP e UDP
3: Camada de Transporte
3a-3
Camadas deTransporte x rede
camada de rede:
comunicação lógica
entre hospedeiros
camada de transporte:
comunicação lógica
entre processos
depende de, estende
serviços da camada de
rede
Analogia doméstica:
12 crianças enviando cartas
para 12 crianças
processos = crianças
mensagens da apl. = cartas
nos envelopes
hospedeiros = casas
protocolo de transporte =
Ann e Bill
protocolo da camada de
rede = serviço postal
3: Camada de Transporte
3a-4
Protocolos da camada de transporte Internet
entrega confiável, ordenada
(TCP)
controle de
congestionamento
controle de fluxo
estabelecimento de conexão
(“setup”)
entrega não confiável, não
ordenada: UDP
extensão sem “frescuras”
do “melhor esforço” do IP
serviços não disponíveis:
aplicação
transporte
rede
enlace
física
rede
enlace
física
rede
enlace
física
rede
enlace
física
rede
enlace
física
rede
enlace
física
aplicação
transporte
rede
enlace
física
garantias de atraso
garantias de largura de
banda
3: Camada de Transporte
3a-5
Conteúdo do Capítulo 3
3.1 Serviços da camada
de transporte
3.2 Multiplexação e
demultiplexação
3.3 UDP: Transporte
não orientado a
conexão
3.4 Princípios da
transferência
confiável de dados
3.5 Transporte
orientado a conexão:
TCP
transferência confiável
controle de fluxo
gerenciamento de
conexões
3.6 Princípios de
controle de
congestionamento
3.7 Controle de
congestionamento do
TCP
3: Camada de Transporte
3a-6
Multiplexação/demultiplexação
Multiplexação no transm.:
reúne dados de muitos
sockets, envelopa os dados
com o cabeçalho (usado
posteriormente para a
demultiplexação)
Demultiplexação no receptor:
Entrega dos segmentos
recebidos ao socket correto
= socket
aplicação
transporte
rede
= processo
P3
P1
P1
aplicação
transporte
P2
P4
aplicação
transporte
rede
rede
enlace
enlace
enlace
física
física
física
host 1
host 2
host 3
3: Camada de Transporte
3a-7
Como funciona a demultiplexação
host recebe os datagramas IP
cada datagrama possui os
endereços IP da origem e
do destino
cada datagrama
transporta 1 segmento da
camada de transporte
cada segmento possui
números das portas origem
e destino (lembre: números
de portas bem conhecidas
para aplicações
específicas)
host usa os endereços IP e os
números das portas para
direcionar o segmento ao
socket apropriado
32 bits
porta remetente porta receptor
outros campos
do cabeçalho
dados da
aplicação
(mensagem)
formato de segmento
TCP/UDP
3: Camada de Transporte
3a-8
Demultiplexação sem Conexões
Crie sockets com
números de porta:
DatagramSocket mySocket1 =
new DatagramSocket(99111);
DatagramSocket mySocket2 =
new DatagramSocket(99222);
Quando host recebe
segmento UDP:
verifica no. da porta de
destino no segmento
encaminha o segmento
UDP para o socket com
aquele no. de porta
socket UDP identificado Datagramas IP com
diferentes endereços IP
pela dupla:
origem e/ou números de
(end IP dest, no. da porta destino)
porta origem são
encaminhados para o
mesmo socket
3: Camada de Transporte
3a-9
Demultiplexação sem Conexões
(cont)
DatagramSocket serverSocket = new DatagramSocket(6428);
P2
P1
P1
P3
SP: 6428
SP: 6428
DP: 9157
DP: 5775
SP: 9157
cliente
IP: A
DP: 6428
SP: 5775
servidor
IP: C
DP: 6428
Cliente
IP:B
SP (source port) provê “endereço de retorno”
3: Camada de Transporte 3a-10
Demultiplexação Orientada a
Conexões
Socket TCP
identificado pela 4dupla:
endereço IP origem
número da porta origem
endereço IP destino
número da porta destino
receptor usa todos os
quatro valores para
direcionar o segmento
para o socket
apropriado
Servidor pode dar
suporte a muitos sockets
TCP simultâneos:
cada socket é identificado
pela sua própria 4-dupla
Servidores Web têm
sockets diferentes para
cada conexão cliente
HTTP não persistente terá
sockets diferentes para
cada pedido
3: Camada de Transporte 3a-11
Demultiplexação Orientada a
Conexões (cont)
P1
P4
P5
P2
P6
P1P3
SP: 5775
DP: 80
S-IP: B
D-IP:C
SP: 9157
cliente
IP: A
DP: 80
S-IP: A
D-IP:C
SP: 9157
servidor
IP: C
DP: 80
S-IP: B
D-IP:C
Cliente
IP:B
3: Camada de Transporte 3a-12
Demultiplexação Orientada a Conexões:
Servidor Web com Threads
P1
P2
P4
P1P3
SP: 5775
DP: 80
S-IP: B
D-IP:C
SP: 9157
cliente
IP: A
DP: 80
S-IP: A
D-IP:C
SP: 9157
servidor
IP: C
DP: 80
S-IP: B
D-IP:C
Cliente
IP:B
3: Camada de Transporte 3a-13
Conteúdo do Capítulo 3
3.1 Serviços da camada
de transporte
3.2 Multiplexação e
demultiplexação
3.3 UDP: Transporte
não orientado a
conexão
3.4 Princípios da
transferência
confiável de dados
3.5 Transporte
orientado a conexão:
TCP
transferência confiável
controle de fluxo
gerenciamento de
conexões
3.6 Princípios de
controle de
congestionamento
3.7 Controle de
congestionamento do
TCP
3: Camada de Transporte 3a-14
UDP: User Datagram Protocol [RFC 768]
Protocolo de transporte da
Internet mínimo, “sem
frescura”,
Serviço “melhor esforço”,
segmentos UDP podem ser:
perdidos
entregues à aplicação fora
de ordem do remesso
sem conexão:
não há “setup” UDP entre
remetente, receptor
tratamento independente
de cada segmento UDP
Por quê existe um UDP?
elimina estabelecimento de
conexão (o que pode causar
retardo)
simples: não se mantém
“estado” da conexão no
remetente/receptor
pequeno cabeçalho de
segmento
sem controle de
congestionamento: UDP
pode transmitir o mais
rápido possível
3: Camada de Transporte 3a-15
Mais sobre UDP
Comprimento em
bytes do
segmento UDP,
muito utilizado para apls. de
incluindo
meios contínuos (voz, vídeo)
cabeçalho
tolerantes de perdas
sensíveis à taxa de
transmissão
outros usos de UDP (por
32 bits
porta origem
porta dest.
comprimento
checksum
quê?):
DNS (nomes)
SNMP (gerenciamento)
transferência confiável com
UDP: incluir confiabilidade na
camada de aplicação
recuperação de erro
específica à apl.!
Dados de
aplicação
(mensagem)
Formato do segmento UDP
3: Camada de Transporte 3a-16
Checksum UDP
Meta: detectar “erro” (e.g., bits invertidos) no
segmento transmitido
Remetente:
trata conteúdo do
segmento como seqüência
de inteiros de 16-bits
campo checksum zerado
checksum: soma (adição
usando complemento de 1)
do conteúdo do segmento
remetente coloca
complemento do valor da
soma no campo checksum
Receptor:
calcula checksum do
segmento recebido
verifica se checksum
computado é zero:
NÃO - erro detectado
SIM - nenhum erro
detectado. Mas ainda
pode ter erros? Veja
depois ….
de UDP
3: Camada de Transporte 3a-17
Exemplo do Checksum Internet
Note
Ao adicionar números, o transbordo do bit mais
significativo deve ser adicionado o resultado
Exemplo: adição de dois inteiros de 16-bits
1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
transbordo 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1
soma 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0
checksum 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1
3: Camada de Transporte 3a-18
Conteúdo do Capítulo 3
3.1 Serviços da camada
de transporte
3.2 Multiplexação e
demultiplexação
3.3 UDP: Transporte
não orientado a
conexão
3.4 Princípios da
transferência
confiável de dados
3.5 Transporte
orientado a conexão:
TCP
transferência confiável
controle de fluxo
gerenciamento de
conexões
3.6 Princípios de
controle de
congestionamento
3.7 Controle de
congestionamento do
TCP
3: Camada de Transporte 3a-19
Princípios de Transferência confiável de
dados (rdt)
importante nas camadas de transporte, enlace
na lista dos 10 tópicos mais importantes em redes!
características do canal não confiável determinam a complexidade
de um protocolo de transferência confiável de dados (rdt)
3: Camada de Transporte 3a-20
Transferência confiável de dados (rdt):
como começar
rdt_send(): chamada de cima,
(p.ex.,pela apl.). Dados recebidos p/
entregar à camada sup. do receptor
send
side
udt_send(): chamada por
rdt, p/ transferir pacote pelo
canal ñ confiável ao receptor
deliver_data(): chamada
por rdt p/ entregar dados
p/ camada superior
receive
side
rdt_rcv(): chamada quando
pacote chega no lado receptor do
canal
3: Camada de Transporte 3a-21
Transferência confiável de dados (rdt):
como começar
Iremos:
desenvolver incrementalmente os lados
remetente, receptor do protocolo RDT
considerar apenas fluxo unidirecional de dados
mas info de controle flui em ambos os sentidos!
Usar máquinas de estados finitos (FSM) p/
especificar remetente, receptor
evento causador da transição de estado
ações executadas ao mudar de estado
estado: neste “estado”
o próximo estado é
determinado
unicamente pelo
próximo evento
estado
1
evento
ações
estado
2
3: Camada de Transporte 3a-22
Rdt1.0: transferência confiável usando um canal
confiável
canal subjacente perfeitamente confiável
não tem erros de bits
não tem perda de pacotes
FSMs separadas para remetente e receptor:
remetente envia dados pelo canal subjacente
receptor recebe dados do canal subjacente
Wait for
call from
above
rdt_send(data)
packet = make_pkt(data)
udt_send(packet)
transmissor
Wait for
call from
below
rdt_rcv(packet)
receptor
3: Camada de Transporte 3a-23
Rdt2.0: canal com erros de bits
canal subjacente pode inverter bits no pacote
lembre-se: checksum UDP pode detectar erros de bits
a questão: como recuperar dos erros?
reconhecimentos (ACKs): receptor avisa explicitamente ao
reconhecimentos negativos (NAKs): receptor avisa
remetente que pacote chegou bem
explicitamente ao remetente que pacote tinha erros
remetente retransmite pacote ao receber um NAK
cenários humanos usando ACKs, NAKs?
novos mecanismos em rdt2.0 (em relação ao rdt1.0):
detecção de erros
realimentação pelo receptor: msgs de controle (ACK,NAK)
receptor->remetente
3: Camada de Transporte 3a-24
rdt2.0: especificação da FSM
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
transmissor
receptor
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
3: Camada de Transporte 3a-25
rdt2.0: operação sem erros
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
3: Camada de Transporte 3a-26
rdt2.0: cenário com erros
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
3: Camada de Transporte 3a-27
rdt2.0 tem uma falha fatal!
O que acontece se
ACK/NAK com erro?
Remetente não sabe o que
se passou no receptor!
não se pode apenas
retransmitir: possibilidade
de pacotes duplicados
O que fazer?
Lidando c/ duplicação:
remetente inclui
número de
seqüência p/ cada pacote
remetente retransmite
pacote atual se ACK/NAK
recebido com erro
receptor descarta (não
entrega) pacote duplicado
remetente usa ACKs/NAKs
p/ ACK/NAK do receptor?
E se perder ACK/NAK do
remetente?
retransmitir, mas pode
causar retransmissão de
pacote recebido certo!
pára e espera
Remetente envia um pacote,
e então aguarda resposta
do receptor
3: Camada de Transporte 3a-28
rdt2.1: remetente, trata ACK/NAKs c/ erro
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait
for
Wait for
isNAK(rcvpkt) )
ACK or
call 0 from
udt_send(sndpkt)
NAK 0
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
udt_send(sndpkt)
L
Wait for
ACK or
NAK 1
Wait for
call 1 from
above
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
3: Camada de Transporte 3a-29
rdt2.1: receptor, trata ACK/NAKs com erro
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq1(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
Wait for
0 from
below
Wait for
1 from
below
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq0(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
3: Camada de Transporte 3a-30
rdt2.1: discussão
Remetente:
no. de seq no pacote
bastam dois nos. de
seq. (0,1). Por quê?
deve checar se
ACK/NAK recebido
tinha erro
duplicou o no. de
estados
Receptor:
deve checar se pacote
recebido é duplicado
estado indica se no. de
seq. esperado é 0 ou 1
note: receptor não tem
como saber se último
ACK/NAK foi recebido
bem pelo remetente
estado deve “lembrar”
se pacote “corrente”
tem no. de seq. 0 ou 1
3: Camada de Transporte 3a-31
rdt2.2: um protocolo sem NAKs
mesma funcionalidade que rdt2.1, só com
ACKs
ao invés de NAK, receptor envia ACK p/
último pacote recebido bem
receptor deve incluir explicitamente no. de seq
do pacote reconhecido
ACK duplicado no remetente resulta na
mesma ação que o NAK: retransmite pacote
atual
3: Camada de Transporte 3a-32
rdt2.2: fragmentos do transmissor e
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
da FSM do
transmissor
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq1(rcvpkt))
udt_send(sndpkt)
Wait for
0 from
below
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
Fragmento da FSM
do receptor
L
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
3: Camada de Transporte 3a-33
udt_send(sndpkt)
rdt3.0: canais com erros e perdas
Nova suposição: canal
subjacente também
pode perder pacotes
(dados ou ACKs)
Abordagem: remetente
aguarda um tempo
“razoável” pelo ACK
retransmite se nenhum ACK
for recebido neste intervalo
se pacote (ou ACK) apenas
atrasado (e não perdido):
retransmissão será
duplicada, mas uso de no.
P: como lidar com perdas?
de seq. já cuida disto
remetente espera até ter
receptor deve especificar
certeza que se perdeu
no. de seq do pacote sendo
pacote ou ACK, e então
reconhecido
retransmite
requer temporizador
eca!: desvantagens?
checksum, no. de seq.,
ACKs, retransmissões
podem ajudar, mas não
serão suficientes
3: Camada de Transporte 3a-34
rdt3.0: remetente
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
L
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,0) )
timeout
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
stop_timer
stop_timer
timeout
udt_send(sndpkt)
start_timer
L
Wait
for
ACK0
Wait for
call 0from
above
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,1) )
Wait
for
ACK1
Wait for
call 1 from
above
rdt_rcv(rcvpkt)
L
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
start_timer
3: Camada de Transporte 3a-35
rdt3.0 em ação
3: Camada de Transporte 3a-36
rdt3.0 em ação
3: Camada de Transporte 3a-37
Desempenho de rdt3.0
rdt3.0 funciona, porém seu
desempenho é muito ruim
exemplo: enlace de 1 Gbps,
retardo fim a fim de 15 ms,
pacote de 1KB:
Ttransmitir=
U
sender
=
8kb/pacote
= 8 microseg
10**9 b/seg
L/R
RTT + L / R
=
.008
30.008
= 0.00027
microsec
onds
pac. de 1KB a cada 30 mseg -> vazão de 33kB/seg num enlace
de 1 Gbps
protocolo limita uso dos recursos físicos!
3: Camada de Transporte 3a-38
rdt3.0: stop-and-wait operation
transmissor
receptor
transm. do 1º bit do pacote, t = 0
tx último bit do pacote, t = L / R
RTT
chegada do 1º bit do pacote
chegada do último bit, envia
ACK
chegada do ACK, envia próximo
pacote, t = RTT + L / R
L/ R
0,008
U tx
0,00027
RT T L / R 30,008
3: Camada de Transporte 3a-39
Protocolos “com paralelismo”
(pipelined)
Paralelismo (pipelining): remetente admite múltiplos
pacotes “em trânsito”, ainda não reconhecidos
faixa de números de seqüência deve ser aumentada
buffers no remetente e/ou no receptor
Duas formas genéricas de protocolos com paralelismo:
Go-back-N, retransmissão seletiva
3: Camada de Transporte 3a-40
Paralelismo: maior utilização
transmissor
receptor
transm. do 1º bit do pacote, t = 0
tx do último bit, t = L / R
RTT
chegada do primeiro bit
chegada do último bit, envia ACK
cheg. do último bit do 2o pct., envia ACK
cheg. do último bit do 3o pct., envia ACK
chegada do ACK, envia próximo
pacote, t = RTT + L / R
Aumenta a utilização
por um fator de 3!
3 L / R
0,024
U tx
0,0008
RT T L / R 30,008
3: Camada de Transporte 3a-41
Go-back-N (GBN)
Remetente:
no. de seq. de k-bits no cabeçalho do pacote
admite “janela” de até N pacotes consecutivos não reconhecidos
ACK(n): reconhece todos pacotes, até e inclusive no. de seq n -
“ACK cumulativo”
pode receber ACKs duplicados (veja receptor)
temporizador para cada pacote em trânsito
timeout(n): retransmite pacote n e todos os pacotes com no. de
seq maiores na janela
3: Camada de Transporte 3a-42
GBN: FSM estendida do remetente
3: Camada de Transporte 3a-43
GBN: FSM estendida do receptor
expectedseqnum=expectedseqnum+1
receptor simples:
usa apenas ACK: sempre envia ACK para pacote
recebido bem com o maior no. de seq. em-ordem
pode gerar ACKs duplicados
só precisa se lembrar do expectedseqnum
pacote fora de ordem:
descarta (não armazena) -> receptor não usa buffers!
manda ACK de pacote com maior no. de seq em-ordem
3: Camada de Transporte 3a-44
GBN
em ação
3: Camada de Transporte 3a-45
Retransmissão seletiva
receptor reconhece
individualmente todos os
pacotes recebidos corretamente
armazena pacotes no buffer, conforme necessário, para
posterior entrega em-ordem à camada superior
remetente apenas re-envia pacotes para os quais
ACK não recebido
temporizador de remetente para cada pacote sem ACK
janela do remetente
N nos. de seq consecutivos
outra vez limita nos. de seq de pacotes enviados, mas
ainda não reconhecidos
3: Camada de Transporte 3a-46
Retransmissão seletiva: janelas de
remetente, receptor
3: Camada de Transporte 3a-47
Retransmissão seletiva
remetente
dados de cima:
se próx. no. de seq na
janela, envia pacote
timeout(n):
reenvia pacote n, reiniciar
temporizador
ACK(n) em
[sendbase,sendbase+N]:
marca pacote n “recebido”
se n for menor pacote não
reconhecido, avança base
da janela ao próx. no. de
seq não reconhecido
receptor
pacote n em
[rcvbase, rcvbase+N-1]
envia ACK(n)
fora de ordem: buffer
em ordem: entrega (tb.
entrega pacotes em ordem
no buffer), avança janela
p/ próxima pacote ainda
não recebido
pacote n em
[rcvbase-N,rcvbase-1]
ACK(n)
senão:
ignora
3: Camada de Transporte 3a-48
Retransmissão seletiva em ação
3: Camada de Transporte 3a-49
Retransmissão
seletiva: dilema
Exemplo:
nos. de seq : 0, 1, 2, 3
tam. de janela =3
receptor não vê
diferença entre os
dois cenários!
incorretamente passa
dados duplicados como
novos em (a)
Q: qual a relação entre
tamanho de no. de seq
e tamanho de janela?
3: Camada de Transporte 3a-50