Capítulo 3: Camada de Transporte
Metas do capítulo: Sumário do capítulo:
apresentar os serviços da camada de transporte
serviços da camada multiplexação/demultiplexação
de transporte: transporte sem conexão: UDP
multiplexação/ princípios de transferência confiável
demultiplexação de dados
transferência
transporte orientado à conexão: TCP
confiável de dados
transferência confiável
controle de fluxo
controle de fluxo
controle de
congestionamento gerenciamento de conexões
princípios de controle de
descrever a congestionamento
implementação dos controle de congestionamento em TCP
serviços na Internet
3: Camada de Transporte 3a-1
3a-2
Serviços da Camada de Transporte
protocolos de transporte Host A
executam em hosts (sistemas aplicação
finais) transporte
rede
enlace rede
física enlace
fornecem comunicação lógica
rede
enlace física
entre processos de física
rede
aplicação executando em enlace
física
hosts diferentes rede
enlace
física
rede
camada de transporte enlace
física
versus camada de rede:
camada de rede: dados são aplicação
transporte
transferidos entre hosts rede
enlace
camada de transporte: física
dados são transferidos Host B
entre processos de
aplicação
➢ depende de serviços da
camada de rede
3: Camada de Transporte 3a-3
Serviços de Camada de Transporte - exemplo
LAN 1 LAN 2
3: Camada de Transporte 3a-4
Camada de Transporte vs. Camada de Rede
3: Camada de Transporte 3a-5
Camada de Transporte vs. Camada de Rede
Camada Camada
de Transporte de Transporte
Camada Camada
de Rede de Rede
camada de transporte: fornece comunicação lógica entre
processos de aplicação
serviço de entrega processo-a-processo
depende do serviço de entrega entre hosts prestado pela camada
de rede
camada de rede: fornece comunicação lógica entre hosts
serviço de entrega host-a-host
usa o modelo de serviço “melhor esforço”
3: Camada de Transporte 3a-6
Comunicação física entre camadas
3: Camada de Transporte 3a-7
Camadas: tipos de comunicação lógica
3: Camada de Transporte 3a-8
Visão geral da camada de transporte na Internet
Alguns serviços da camada de
transporte na Internet:
aplicação
transporte
entrega confiável, ordenada, rede
enlace rede
ponto a ponto (TCP) física
rede enlace
enlace física
orientado à conexão física
transferência confiável de rede
enlace
dados física
rede
enlace
controle de fluxo física
rede
controle de congestionamento enlace
física
entrega não confiável, (“melhor
aplicação
esforço”), não ordenada, ponto a transporte
rede
ponto ou multiponto (UDP) enlace
física
serviços não disponíveis:
atraso fim a fim limitado
garantia de vazão
3: Camada de Transporte 3a-9
Multiplexação/Demultiplexação
serviço fundamental da camada de transporte: é uma ampliação
do serviço de entrega host-a-host da camada de rede para um
serviço de entrega processo-a-processo da camada de transporte
Camadas Host A Host B
Aplicação
Transporte
Rede
3: Camada de Transporte 3a-10
Multiplexação/Demultiplexação
Multiplexação (remetente): Demultiplexação (receptor):
manipula mensagens geradas
usa o cabeçalho do segmento
por diferentes processos de
para entregar a mensagem ao
aplicação, acrescentando um
processo de aplicação
cabeçalho e formando um
destinatário correto
segmento
destinatário
dados da camada P3 P4
de aplicação M M’
remetente 1 remetente 2
cabeçalho aplicação P2
do segmento P1 transporte M’
M rede aplicação
aplicação enlace
segmento transporte
Ht M transporte física rede
datagrama Hn segmento rede
enlace
enlace
física
física
cabeçalho
host 2 host 3
do datagrama host 1 3: Camada de Transporte 3a-11
Multiplexação/Demultiplexação
Como ocorre a demultiplexação: Formato básico de um segmento:
cada datagrama contém campos
com o endereço IP de origem e 32 bits
o endereço IP de destino
porta de origem porta de destino
cada datagrama transporta um
segmento da camada de
transporte outros campos
cada segmento contém campos do cabeçalho
com o número da porta de
origem e o número da porta de
destino (RFC 1700)
a mensagem com dados da mensagem
aplicação é repassada ao
processo de aplicação
identificado pelo número de
porta de destino
3: Camada de Transporte 3a-12
Exemplo: inversão dos número de portas de origem e
de destino no segmento de resposta
3: Camada de Transporte 3a-13
Multiplexação e Demultiplexação Não Orientadas p/ Conexão
❑ um socket UDP é totalmente identificado por dois
valores:
➢ endereço IP de destino
➢ número da porta de destino
❑ quando o hospedeiro recebe o segmento UDP, ele:
➢ verifica o número da porta de destino no segmento
➢ direciona o segmento UDP para o socket com este número de
porta
❑ todo segmento recebido na camada de transporte
e destinado a uma dada porta UDP será entregue ao
processo correspondente, não importando o endereço
IP do host de origem, bem como o número da porta
do processo remetente
➢ característica do serviço não orientado para conexão
3: Camada de Transporte 3a-14
Exemplo: demultiplexação UDP no destino
datagrama
recebido 3: Camada de Transporte 3a-15
Multiplexação e Demultiplexação Orientadas para Conexão
❑ um socket de conexão TCP é identificado por quatro elementos:
endereço IP do host origem
número da porta origem
endereço IP do host de destino
número da porta de destino
❑ a camada de transporte no host destinatário usa todos os quatro
elementos para direcionar (demultiplexar) o segmento TCP para o
socket apropriado
❑ dois segmentos TCP oriundos de hosts diferentes ou com números
de porta diferentes serão encaminhados para sockets diferentes
❑ um host servidor pode suportar vários sockets TCP simultâneos,
sendo cada um deles identificado pelos seus próprios quatro
elementos
❑ o estabelecimento de conexão usa o "Welcoming Socket", enquanto o
transporte de dados usa o socket da conexão TCP estabelecida
3: Camada de Transporte 3a-16
Exemplo: demultiplexação no serviço orientados à conexão
3: Camada de Transporte 3a-17
Multiplexação e Demultiplexação Orientadas para Conexão
3: Camada de Transporte 3a-18
UDP: User Datagram Protocol [RFC 768]
fornece comunicação processo
a processo
Por quê existe UDP?
elimina estabelecimento de
protocolo mínimo de
transporte na Internet conexão, que causa atraso
fornece multiplexação / simples: não mantém estado
demultiplexação de conexão no
serviço do tipo “melhor
remetente/receptor
esforço", segmentos UDP cabeçalho do segmento
podem ser: UDP de tamanho reduzido
perdidos (overhead pequeno)
entregues à aplicação fora
sem controle de
de ordem
congestionamento: UDP
não orientado à conexão: pode transmitir mais
não há fase de “setup” rapidamente, pois a taxa de
envio não é regulada
tratamento independente
para cada segmento UDP 3: Camada de Transporte 3a-19
Mais sobre UDP
muito utilizado pelas aplicações Estrutura do segmento UDP:
de fluxo contínuo (voz, vídeo)
tolerantes a perdas
comprimento do
segmento UDP,
sensíveis à vazão da rede incluindo cabeçalho
outros usos do UDP (por quê?): 32 bits
DNS (nomes) porta origem porta destino
SNMP (gerenciamento) comprimento checksum
HTTP/3 (draft)
transferência confiável com
UDP: dados da
deve ser implementada na
aplicação
própria aplicação (mensagem)
protocolo de overhead reduzido
3: Camada de Transporte 3a-20
UDP Checksum: ideia básica
3: Camada de Transporte 3a-21
UDP Checksum
Meta: detectar “erros” no segmento UDP recebido
Remetente: Destinatário:
trata o conteúdo do todas as palavras de 16 bits do
segmento UDP como segmento UDP recebido são
sequência de palavras de 16 somadas, inclusive o próprio
bits checksum
soma de todas as
palavras de 16 bits no todos os bits do resultado da soma
segmento anterior são iguais a “1”?
NÃO -> erro detectado
obtém o complemento de 1 SIM -> nenhum erro detectado
do resultado da soma e o
coloca no campo
checksum do cabeçalho do
segmento UDP
3: Camada de Transporte 3a-22
UDP Checksum
exemplo: adição de duas palavras 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
1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1
1
1
soma: 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
soma+Checksum: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
note que o “vai um” no bit mais significativo precisa ser adicionado ao
resultado ("wraparound") 3: Camada de Transporte 3a-23
UDP Checksum: falha na proteção
exemplo
erros
aos
pares
não
muda!
3: Camada de Transporte 3a-24
Princípios da transferência confiável de dados
importante nas camadas de transporte e de enlace
está na lista dos 10 tópicos mais importantes em redes!
modelo do serviço de transferência confiável de dados:
3: Camada de Transporte 3a-25
Princípios da transferência confiável de dados
implementação do serviço de transferência confiável de dados
3: Camada de Transporte 3a-26
Princípios da transferência confiável de dados
3: Camada de Transporte 3a-27
Princípios da transferência confiável de dados
rdt_send(): chamada de cima para deliver_data(): chamada
passar dados a serem entregues ao para entregar dados para a
processo de aplicação destinatário camada superior
remetente destinatário
udt_send(): chamada para rdt_rcv(): chamada que ocorre
transferir pacotes para o lado quando o pacote chega no lado
receptor pelo canal subjacente receptor
3: Camada de Transporte 3a-28
Transferência confiável de dados: como começar
Iremos:
desenvolver incrementalmente os lados remetente e receptor do
protocolo rdt (reliable data transfer )
considerar apenas fluxo unidirecional de dados
porém, a informação de controle flui nos dois sentidos!
usar máquinas de estados finitos, em inglês, "finite state machines"
(FSM) p/ especificar remetente e receptor
evento que causa a transição
ação(ões) que ocorre(m) na transição
estado:
o próximo “estado” é estado
determinado evento estado
1 2
unicamente pelo ação
próximo evento
3: Camada de Transporte 3a-29
rdt1.0: Transferência confiável usando canal confiável
canal subjacente é perfeitamente confiável
não apresenta erros de bits
não apresenta perda de pacotes
FSMs separadas para remetente e receptor:
remetente envia dados pelo canal confiável
receptor recebe dados do canal confiável
3: Camada de Transporte 3a-30
rdt2.0: Transferência confiável de dados sobre um
canal com erros de bits
canal subjacente pode inverter bits no pacote
lembrete: checksum UDP pode detectar erros de bits
a questão: como recuperar dos erros detectados?
reconhecimento positivo (ACK): receptor avisa explicitamente
ao remetente que pacote chegou OK
reconhecimento negativo (NAK): receptor avisa explicitamente
ao remetente que pacote recebido continha erros
➢ remetente retransmite pacote ao receber um NAK
protocolos ARQ (Automatic Repeat reQuest)
novos mecanismos em rdt2.0 (além do rdt1.0):
detecção de erros
realimentação realizada pelo receptor por meio de mensagens
de controle (ACK e NAK) enviadas ao remetente
retransmissão de pacotes recebidos com erro
3: Camada de Transporte 3a-31
rdt2.0: elementos básicos do ARQ
acknowledgements (ACKs)
ACK
3: Camada de Transporte 3a-32
rdt2.0: elementos básicos do ARQ
negative acknowledgements (NAKs)
Packet received
with error bit
NAK
3: Camada de Transporte 3a-33
rdt2.0: especificação da FSM
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt) FSM do destinatário
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) && isACK(rcvpkt)
Wait for
L
call from
below
FSM do remetente rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
3: Camada de Transporte 3a-34
rdt2.0: em ação (sem erros)
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt) FSM do destinatário
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) && isACK(rcvpkt)
Wait for
L call from
below
FSM do remetente rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
3: Camada de Transporte 3a-35
rdt2.0: em ação (Cenário de Erro)
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt) FSM do destinatário
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) && isACK(rcvpkt)
Wait for
L call from
below
FSM do remetente rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
3: Camada de Transporte 3a-36
rdt2.0: tem uma falha fatal!
O que pode acontecer se Enfrentando as duplicações
um ACK ou NAK estiver o remetente deve adicionar o
corrompido? campo número de sequência ao
cabeçalho de cada pacote
neste caso, o remetente não tem transmitido
como saber se o destinatário
recebeu os dados transmitidos
o destinatário deve descartar
(i.e., não entregar à camada
superior) cada pacote detectado
O que fazer? como duplicado
o remetente deve reenviar o
pacote de dados Stop-and-Wait
todavia, este procedimento remetente envia um pacote e,
poderá causar a retransmissão então, aguarda a resposta do
de um pacote recebido OK, destinatário
provocando a duplicação dos
pacote de dados 3: Camada de Transporte 3a-37
rdt2.1 remetente: ACK ou NAK com erro
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt) rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
Wait for Wait for isNAK(rcvpkt) )
call 0 from ACK or
NAK 0 udt_send(sndpkt)
above
rdt_rcv(rcvpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) &&
&& notcorrupt(rcvpkt)
isACK(rcvpkt)
&& isACK(rcvpkt)
L
L
Wait for Wait for
ACK or call 1 from
rdt_rcv(rcvpkt) NAK 1 above
&& (corrupt(rcvpkt) ||
isNAK(rcvpkt) ) rdt_send(data)
udt_send(sndpkt) sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
3: Camada de Transporte 3a-38
rdt2.1 receptor: ACK ou NAK com erro
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum) sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt) udt_send(sndpkt)
Wait for Wait for
rdt_rcv(rcvpkt) && 0 from 1 from rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) && below below not corrupt(rcvpkt) &&
has_seq1(rcvpkt) has_seq0(rcvpkt)
sndpkt = make_pkt(ACK, chksum) sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt) udt_send(sndpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
3: Camada de Transporte 3a-39
rdt2.1: discussão
Remetente Receptor
usa número de sequência no deve “checar” se pacote
pacote recebido foi duplicado
estado indica se o
bastam dois números de
número de sequência
sequência (0 e 1). Por que?
esperado é 0 ou 1
o número de estados é
não tem como saber se último
duplicado
ACK/NAK foi recebido OK pelo
estado permite “lembrar”
remetente
se pacote corrente tem
número de sequência 0 ou 1
deve “checar” se ACK/NAK
recebido tem erro
3: Camada de Transporte 3a-40
rdt2.1: discussão
3: Camada de Transporte 3a-41
rdt2.2: um protocolo sem NAKs
só com ACKs, mas com a mesma funcionalidade do
protocolo rdt2.1
ao invés de enviar um NAK, o receptor envia, em seu
lugar, uma cópia do ACK que foi enviado para o último
pacote recebido OK, ou seja, um ACK duplicado é
enviado
ACK duplicado: no remetente resulta na mesma ação
que o NAK: “retransmissão do pacote atual”
3: Camada de Transporte 3a-42
rdt2.2: um protocolo sem NAKs
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait for Wait for
ACK isACK(rcvpkt,1) )
call 0 from
above 0 udt_send(sndpkt)
sender FSM
fragment rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
rdt_rcv(rcvpkt) && && isACK(rcvpkt,0)
(corrupt(rcvpkt) || L
has_seq1(rcvpkt)) Wait for receiver FSM
0 from
below fragment
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt)
3: Camada de Transporte 3a-43
rdt3.0: canal com erros e perdas
Nova suposição: canal Abordagem: remetente
subjacente também aguarda um tempo
pode, adicionalmente, “razoável” pelo ACK
perder pacotes (dados retransmite se nenhum ACK é
ou ACKs) recebido neste intervalo
checksum, no de sequência, se pacote (ou ACK) está apenas
ACKs, retransmissões podem atrasado (e não perdido):
ajudar, mas não são retransmissão causa
suficientes duplicação, mas uso de no de
sequência já cuida disso
P: Como lidar com perdas?
receptor deve especificar no
remetente espera até ter
“certeza” que pacote ou de sequência do pacote que
ACK se perdeu e, então, está sendo reconhecido
retransmite o pacote requer temporizador de
quanto tempo esperar? contagem regressiva (“timeout”)
3: Camada de Transporte 3a-44
rdt3.0 remetente
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
start_timer
Wait for Wait
call 0 from for
above ACK0
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt,1) && notcorrupt(rcvpkt)
stop_timer && isACK(rcvpkt,0)
stop_timer
Wait Wait for
for call 1 from
ACK1 above
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
start_timer
3: Camada de Transporte 3a-45
rdt3.0 remetente
rdt_send(data)
rdt_rcv(rcvpkt) &&
sndpkt = make_pkt(0, data, checksum) ( corrupt(rcvpkt) ||
udt_send(sndpkt) isACK(rcvpkt,1) )
rdt_rcv(rcvpkt) start_timer L
L Wait for Wait
for timeout
call 0 from
ACK0 udt_send(sndpkt)
above
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt,1) && notcorrupt(rcvpkt)
stop_timer && isACK(rcvpkt,0)
stop_timer
Wait Wait for
timeout for call 1 from
udt_send(sndpkt) ACK1 above
start_timer rdt_rcv(rcvpkt)
rdt_send(data) L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) || sndpkt = make_pkt(1, data, checksum)
isACK(rcvpkt,0) ) udt_send(sndpkt)
start_timer
L
3: Camada de Transporte 3a-46
rdt3.0 em ação
sender receiver
send pkt0 pkt0
sender receiver rcv pkt0
ack0 send ack0
pkt0 rcv ack0
rcv pkt0 send pkt1 pkt1
X
ack0 send ack0 loss
rcv ack0
pkt1
rcv pkt1 timeout
ack1 send ack1 resend pkt1 pkt1
rcv ack1
pkt0 rcv pkt1
rcv pkt0
ack1 send ack1
rcv ack1
ack0 send ack0
send pkt0 pkt0
rcv pkt0
ack0 send ack0
(a) no loss
(b) packet loss
3: Camada de Transporte 3a-47
rdt3.0 em ação
sender receiver
sender receiver send pkt0
pkt0
rcv pkt0
send pkt0 pkt0 send ack0
ack0
rcv pkt0 rcv ack0
ack0 send ack0 send pkt1 pkt1
rcv ack0 rcv pkt1
send pkt1 pkt1 send ack1
rcv pkt1 ack1
ack1 send ack1
X timeout
loss resend pkt1
timeout
pkt1 rcv pkt1
resend pkt1 pkt1 rcv ack1 (detect duplicate)
rcv pkt1 send pkt0 pkt0 send ack1
(detect duplicate)
ack1 send ack1 ack1 rcv pkt0
rcv ack1 rcv ack1 send ack0
send pkt0 pkt0 (ignore) ack0
rcv pkt0
ack0 send ack0 pkt1
(d) premature timeout/ delayed ACK
(c) ACK loss
3: Camada de Transporte 3a-48
Desempenho do rdt3.0
rdt3.0 funciona, porém seu desempenho pode ser muito ruim
quando o atraso de propagação é muito grande!
❑ Exemplo:
Enlace costa-a-costa de 1 Gbps, dprop = 15 ms, pacote de 8.000
bits, transmissão livre de erros
3: Camada de Transporte 3a-49
Desempenho do rdt3.0
transmissão livre de erros de bit
Exemplo: (continuação):
Uremet = Utilização do Remetente (ou do Canal) = fração do tempo
total que o remetente fica ocupado transmitindo no canal
Uremet = (dtrans) ÷ tT = [(L/R) ÷ (RTT + L/R)]
onde: tT = intervalo de tempo entre pacotes sucessivos
remetente destinatário
primeiro bit do primeiro pacote
transmitido, t = 0
último bit do primeiro pacote
transmitido, dTRANS = L / R
primeiro pacote
primeiro bit do primeiro pacote chega
RTT último bit do primeiro pacote chega,
envia ACK
ACK chega, envia próximo
pacote, tT = RTT + L / R
segundo pacote 3: Camada de Transporte 3a-50
Desempenho do rdt3.0
transmissão livre de erros de bit
Exemplo: (continuação)
RTT = 2 x dprop = 2 x 15 ms = 30 ms
L 8.000 bits
dtrans = = = 0,008 ms
109 bits/s
R
L
tT = + RTT = 0,008 ms + 30 ms = 30,008 ms
R
0,008 ms
Uremet = dtrans/tT = = 0,00027
30,008 ms
Vazão = 1 pacote/tT segundos = 8 kbits/30,008 ms = 267 kbps
➢ Conclusão: o protocolo “stop-and-wait” limita o uso do canal!
3: Camada de Transporte 3a-51
Desempenho do rdt3.0
transmissão sujeita a erros de bit
remetente
primeiro bit do primeiro pacote
transmitido, t = 0
último bit do primeiro pacote
transmitido, dTRANS = L / R
RTT
tT = RTT + L / R
Tx de pacote novo
ou retransmissão
➢ Meta: calcular tempo médio entre pacotes transmitidos com sucesso = tC
t C = Nr x t T onde Nr é o número médio de tentativas de transmissão
3: Camada de Transporte 3a-52
Desempenho do rdt3.0
transmissão sujeita a erros de bit
P = Prob{pacote recebido com erro}
Prob{i-ésimo pacote recebido OK} =
i = 1, 2, 3, ...
Nr = número médio de tentativas transmissão
Nr =
Nr = 1 / (1 – P)
tC = tempo médio entre pacotes transmitidos com sucesso
tC = Nr x tT = (RTT + L/R) / (1 – P) [s]
vazão média = 1 pacote / tC segundos = (1 – P) / (RTT + L/R) [pacotes/s]
3: Camada de Transporte 3a-53
Protocolos com Pipelining
Pipelining : ao remetente é permitido múltiplos pacotes “em trânsito”,
ainda não reconhecidos
a faixa de números de sequência deve ser ampliada
requer aumento de capacidade dos buffers (remetente e receptor)
duas formas genéricas de protocolos com pipelining:
Go-Back-N (retransmissão integral)
Selective Repeate (retransmissão seletiva)
3: Camada de Transporte 3a-54
Pipelining: aumento da utilização
Exemplo: envio de três pacotes consecutivos
remetente destinatário
primeiro bit do primeiro pacote
transmitido, t = 0
último bit do primeiro pacote
transmitido, dTRANS = L / R
primeiro bit do primeiro pacote chega
RTT último bit do primeiro pacote chega, envia ACK
último bit do segundo pacote chega, envia ACK
último bit do terceiro pacote chega, envia ACK
ACK chega, envia próximo
pacote, tT = RTT + L / R
Utilização do Canal
aumenta por um
fator de 3
3: Camada de Transporte 3a-55
Go-Back-N
Remetente:
pode transmitir múltiplos pacotes sem esperar por ACK, mas fica
limitado em até N pacotes (“janela de transmissão”) consecutivos não
reconhecidos
send_base nextseqnum
protocolo sliding-window : “desliza janela” após uma transmissão
OK
campo “número de sequência” no cabeçalho tem m bits -> faixa de
números de sequência: [0, 2m - 1]
ACK cumulativo: um ACK de pacote com número de sequência n
indica que todos os pacotes com número de sequência até e inclusive
n foram corretamente recebidos
“timeout” é usado para recuperar pacote ou ACK perdido
3: Camada de Transporte 3a-56
Go-Back-N: receptor
janela de recepção
rcv_base
se o pacote(n) é recebido livre de erros e com número de sequência
de acordo com o ordenamento, o ACK(n) é enviado
➢ o receptor precisa registrar apenas o valor de rcv_base
➢ a janela de recepção tem sempre tamanho igual a 1
caso contrário (erro de bit e/ou pacote fora de ordem): ocorre
descarte do pacote recebido e retransmissão do ACK(n-1)
3: Camada de Transporte 3a-57
Go-Back-N em ação
sender window (N=4) sender receiver
012345678 send pkt0
012345678 send pkt1
012345678 send pkt2 receive pkt0, send ack0
012345678 send pkt3 Xloss receive pkt1, send ack1
(wait)
receive pkt3, discard,
012345678 rcv ack0, send pkt4 (re)send ack1
012345678 rcv ack1, send pkt5 receive pkt4, discard,
(re)send ack1
ignore duplicate ack1 receive pkt5, discard,
(re)send ack1
pkt 2 timeout
012345678 send pkt2
012345678 send pkt3
012345678 send pkt4 rcv pkt2, deliver, send ack2
012345678 send pkt5 rcv pkt3, deliver, send ack3
rcv pkt4, deliver, send ack4
rcv pkt5, deliver, send ack5
Go-Back-N em ação
➢Animação interativa para o Protocolo Go-Back-N:
[Link]
nt/interactiveanimations/go-back-n-protocol/[Link]
BDP (Bandwidth-Delay Product )
BDP - produto capacidade de transmissão pelo atraso
de ida e volta é uma medida do número de bits (ou
bytes) que um remetente pode transmitir enquanto
espera por ACK do destinatário
BDP = Rbps . (RTTmédio)seg [bits]
3: Camada de Transporte 3a-60
Exemplo:
Projete um protocolo Go-Back-N com janela deslizante para uma rede
com capacidade de transmissão de 100 Mbps e distância entre
emissor e receptor de 10.000 km. Considere que o tamanho médio dos
pacotes é de 100.000 bits e a velocidade de propagação no meio físico
de transmissão igual a 2x108 m/s. Para isso, determine:
a) O tamanho máximo das janelas de transmissão e de recepção.
b) O número de bits no campo de número de sequência (m).
c) Um valor de tempo limite inferior para o timeout.
Solução:
dados:
R = 100 Mbps
d = 10.000 km
L = 100.000 bits
v = 2x108 m/s
3: Camada de Transporte 3a-61
Exemplo:
a) tamanho máximo das janelas de transmissão e de recepção?
RTT = 2 x dprop = 2 x d/v
RTT = 2 x 10.000 km / 2x108 m/s = 100 ms
BDP = Rbps . (RTTmédio)seg [bits]
BDP em bits = 100 Mbps x 100 ms = 10.000.000 bits
BDP em pacotes = 10.000.000 / 100.000 = 100 pacotes
➢ tamanho máximo da janela de transmissão = 100 pacotes
➢ no Go-Back-N, o tamanho da janela de recepção é sempre igual a 1
pacote
3: Camada de Transporte 3a-62
Exemplo (continuação):
b) número de bits no campo de número de sequência (m)?
(tamanho da janela de transmissão) < 2m
m > log2 (tamanho da janela de transmissão)
m ≈ 7 bits
c) valor de tempo limite inferior para o timeout?
timeout mínimo = RTT = 100 ms
3: Camada de Transporte 3a-63
Retransmissão seletiva
Selective Repeate (SR)
Go-Back-N pode apresentar baixo desempenho se o tamanho da
janela de transmissão e o BDP são grandes
solução: evitar a retransmissão desnecessária de pacotes
reconhecendo individualmente todos os pacotes recebidos
corretamente no destino
receptor armazena os pacotes recebidos fora de ordem no
buffer de recepção para entrega posterior, em ordem, à camada
superior
remetente retransmite somente os pacotes não reconhecidos
e dispara temporizador (“timeout”) para cada pacote
retransmitido
Selective Repeate usa janelas de transmissão e de recepção com
igual tamanho
3: Camada de Transporte 3a-64
Retransmissão seletiva: janelas do remetente e do
receptor
3: Camada de Transporte 3a-65
Retransmissão seletiva: eventos e ações
Remetente Receptor
dados recebidos de cima pacote n recebido OK
se o próximo no de seq. está com no de seq. no
dentro da janela, cria e envia [rcv_base, rcv_base+(N-1)]
o pacote envia ACK(n)
ocorre timeout(n) se fora de ordem: buffer
retransmite o pacote n e em ordem: entrega (inclui
reinicia o temporizador pacotes no buffer) e avança
ACK(n) recebido no janela p/ "próximo pacote
[send_base, send_base+(N-1)] ainda não recebido"
marca o pacote n como
“recebido” pacote n recebido OK no
[rcv_base-N, rcv_base-1]
se n for igual a send_base,
avança base da janela até o um ACK(n) deve ser gerado
pacote não reconhecido que
tiver o menor no de sequência qualquer outro pacote
ignora o pacote
3: Camada de Transporte 3a-66
Retransmissão Seletiva em ação
sender window (N=4) sender receiver
012345678 send pkt0
012345678 send pkt1
012345678 send pkt2 receive pkt0, send ack0
012345678 send pkt3 Xloss receive pkt1, send ack1
(wait)
receive pkt3, buffer,
012345678 rcv ack0, send pkt4 send ack3
012345678 rcv ack1, send pkt5
receive pkt4, buffer,
record ack3 arrived send ack4
receive pkt5, buffer,
pkt 2 timeout send ack5
012345678 send pkt2
012345678 (but not 3,4,5)
012345678 rcv pkt2; deliver pkt2,
012345678 pkt3, pkt4, pkt5; send ack2
Q: what happens when ack2 arrives?
Retransmissão
seletiva: dilema 0123012 pkt0
0123012 pkt1 0123012
Exemplo: 0123012 pkt2 X 0123012
X 0123012
números de sequência dos X
timeout
pacotes: 0, 1, 2, 3 retransmit pkt0
pkt0
tamanho das janelas de 0123012
will accept packet
transmissão e de recepção with seq number 0
(a)
igual a 3
receptor não “vê” sender window receiver window
diferença entre os dois (after receipt) (after receipt)
cenários! pkt0
0123012
incorretamente, passa-se 0123012 pkt1 0123012
dados duplicados como 0123012 pkt2 0123012
novos [Figura (a)] 0123012
0123012 pkt3
X
P: Qual a relação entre os 0123012
pkt0 will accept packet
números de sequência e o (b) with seq number 0
tamanho das janelas que
permite evitar esse dilema? 3: Camada de Transporte 3a-68
Retransmissão seletiva
Animação interativa para o Protocolo Retransmissão Seletiva:
➢ [Link]
rk_8/cw/content/interactiveanimations/selective-repeat-
protocol/[Link]
3: Camada de Transporte 3a-69
Exercício Proposto
Considere o protocolo Selective Repeate. Suponha que o espaço de
números de sequência seja de tamanho k. Qual será o maior
tamanho de janela permissível (w) que evitará o problema
apresentado nas figuras do slide 68?
3: Camada de Transporte 3a-70
Mecanismos de transferência confiável
3: Camada de Transporte 3a-71