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
Download

1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1