Sie sind auf Seite 1von 34

Capítulo 3: Esboço

 3.1 Serviços da camada  3.5 Transporte orientado


de transporte para conexão: TCP
 3.2 Multiplexação e  estrutura de segmento
demultiplexação  transferência confiável de
dados
 3.3 Transporte não
 controle de fluxo
orientado para
 gerenciamento da conexão
conexão: UDP
 3.6 Princípios de controle
 3.4 Princípios da
de congestionamento
transferência
 3.7 Controle de
confiável de dados
congestionamento no TCP

slide 1 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Princípios de transferência
confiável de dados

 importante nas camadas de aplicação, transporte e enlace


 lista dos 10 mais importantes tópicos de redes!
 características do canal confiável determinarão
complexidade do protocolo de transferência confiável (rdt)

slide 2 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Transferência confiável de
dados: introdução
rdt_send(): chamado de cima, (p. e., deliver_data(): chamado pela
pela apl.). Dados passados para remeter rdt para remeter dados para cima
à camada superior do destinatário

lado lado
remetente destinatário

udt_send(): chamado pela rdt_rcv(): chamado quando pacote


rdt, para transferir pacote por chega no lado destinatário do canal
canal não confiável ao
destinatário
slide 3 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
vamos:
 desenvolver de forma incremental os lados remetente e
destinatário do protocolo de transferência confiável de dados
(rdt)
 considerar apenas a transf. de dados unidirecional
 mas informações de controle fluirão nas duas direções!
 usar máquinas de estado finito (FSM) para especificar
remetente, destinatário
evento causando transição de estado
ações tomadas sobre transição de estado
estado: quando neste
“estado”, próximo estado estado
1 evento
estado determinado 2
exclusivamente pelo ações
próximo evento

slide 4 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Rdt1.0: transferência
confiável por canal confiável
 canal subjacente perfeitamente confiável
 sem erros de bit
 sem perda de pacotes

 FSMs separadas para remetente e destinatário:


 remetente envia dados para canal subjacente
 destinatário lê dados do canal subjacente

Espera rdt_send(dados) Espera rdt_rcv(pacote)


chamada chamada extract (pacote, dados)
de cima packet = make_pkt(dados) de baixo deliver_data(dados)
udt_send(pacote)

remetente destinatário

slide 5 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Rdt2.0: canal com erros
de bit
 canal subjacente pode inverter bits no pacote
 soma de verificação para detectar erros de bit

 a questão: como recuperar-se dos erros:


 reconhecimentos (ACKs): destinatário diz explicitamente
ao remetente que o pacote foi recebido OK
 reconhecimentos negativas (NAKs): destinatário diz
explicitamente ao remetente que o pacote teve erros
 remetente retransmite pacote ao receber NAK

 novos mecanismos no rdt2.0 (além do rdt1.0):


 detecção de erro
 feedback do destinatário: msgs de controle (ACK,NAK)
destinatário->remetente

slide 6 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.0: especificação da FSM
rdt_send(dados) destinatário
snkpkt = make_pkt(dados, soma_verif)
udt_send(pctenv)
rdt_rcv(pctrec) &&
Não recebeu
isNAK(pctrec)
Espera Espera rdt_rcv(pctrec) &&
chamada
de cima
ACK udt_send(pctenv) corrupt(pctrec)
ou NAK udt_send(NAK)

rdt_rcv(pctrec) && isACK(pctrec)


Espera
L
chamada
remetente de baixo

rdt_rcv(pctrec) &&
Recebeu notcorrupt(pctrec)
extract(pctrec,dados)
deliver_data(dados)
udt_send(ACK)

slide 7 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.0: operação sem erros
rdt_send(dados)
snkpkt = make_pkt(dados, soma_verif)
udt_send(pctenv)
rdt_rcv(pctrec) &&
isNAK(pctrec)
Espera Espera rdt_rcv(pctrec) &&
chamada ACK ou udt_send(pctenv) corrupt(pctrec)
de cima NAK
udt_send(NAK)

rdt_rcv(pctrec) && isACK(pctrec)


Espera
L chamada
de baixo

rdt_rcv(pctrec) &&
notcorrupt(pctrec)
extract(pctrec,dados)
deliver_data(dados)
udt_send(ACK)

slide 8 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.0: cenário de erro
rdt_send(dados)
snkpkt = make_pkt(dados, soma_verif)
udt_send(pctenv)
rdt_rcv(pctrec) && isNAK(pctrec)

Espera Espera rdt_rcv(pctrec) &&


chamada ACK ou udt_send(pctenv) corrupt(pctrec)
de cima NAK
udt_send(NAK)

rdt_rcv(pctrec) && isACK(pctrec)


Espera
L chamada
de baixo

rdt_rcv(pctrec) &&
notcorrupt(pctrec)
extract(pctrec,dados)
deliver_data(dados)
udt_send(ACK)

slide 9 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.0 tem uma falha fatal!

O que acontece se tratando de duplicatas:


ACK/NAK for  remetente retransmite
corrompido? pacote atual se ACK/NAK
 remetente não sabe o que corrompido
aconteceu no destinatário!  remetente acrescenta
 não pode simplesmente número de sequência a cada
retransmitir: possível pacote
duplicação  destinatário descarta (não
sobe) pacote duplicado

pare e espere
remetente envia um pacote,
depois espera resposta do
destinatário

slide 10 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.1: remetente trata de
ACK/NAKs corrompidos
rdt_send(dados) Envia novamente
pctenv = make_pkt(0, dados, checksum)
udt_send(pctenv) rdt_rcv(pctrec) &&
( corrupt(pctrec) ||
Espera envia Espera
ACK ou
isNAK(pctrec) )
chamada 0
NAK 0 udt_send(pctenv)
de cima
rdt_rcv(pctrec)
&& notcorrupt(pctrec) rdt_rcv(pctrec)
&& isACK(pctrec) Recebe
&& notcorrupt(pctrec)
ACK
&& isACK(pctrec)
L
L
Espera Espera
ACK ou chamada 1
rdt_rcv(pctrec) && NAK 1 de cima
( corrupt(pctrec) ||
isNAK(pctrec) ) rdt_send(dados)

udt_send(pctenv) pctenv = make_pkt(1, dados, checksum)


udt_send(pctenv)
Envia novamente
envia
slide 11 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
rdt_rcv(pctrec) && notcorrupt(pctrec)
&& has_seq0(pctrec)
extract(pctrec,dados)
deliver_data(dados)
pctenv = make_pkt(ACK, chksum)
udt_send(pctenv)
rdt_rcv(pctrec) && (corrupt(pctrec) rdt_rcv(pctrec) && (corrupt(pctrec)
pctenv = make_pkt(NAK, chksum) pctenv = make_pkt(NAK, chksum)
udt_send(pctenv) udt_send(pctenv)
Espera Espera
rdt_rcv(pctrec) && 0 de 1 de rdt_rcv(pctrec) &&
not corrupt(pctrec) && cima baixo not corrupt(pctrec) &&
has_seq1(pctrec) has_seq0(pctrec)
pctenv = make_pkt(ACK, chksum) pctenv = make_pkt(ACK, chksum)
udt_send(pctenv) udt_send(pctenv)
rdt_rcv(pctrec) && notcorrupt(pctrec)
&& has_seq1(pctrec)

extract(pctrec,dados)
deliver_data(dados)
pctenv = make_pkt(ACK, chksum)
udt_send(pctenv)

slide 12 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.1: discussão
remetente: destinatário:
 # seq acrescentado ao  deve verificar se
pkt pacote recebido está
 dois #s seq. (0,1) duplicado
bastarão. Por quê?  estado indica se 0 ou 1 é
# seq. esperado do
 deve verificar se pacote
ACK/NAK recebido foi
 nota: destinatário não
corrompido
sabe se seu último
 o dobro de estados ACK/NAK foi recebido
 estado de “lembrar” se OK no remetente
pacote “atual” tem #
seq. 0 ou 1

slide 13 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.2: um protocolo sem NAK

 mesma funcionalidade de rdt2.1, usando apenas ACKs


 em vez de NAK, destinatário envia ACK para último
pacote recebido OK
 destinatário precisa incluir explicitamente # seq. do pacote
sendo reconhecido com ACK
 ACK duplicado no remetente resulta na mesma ação
de NAK: retransmitir pacote atual

slide 14 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt2.2: fragmentos do
remetente, destinatário
rdt_send(dados)
pctenv = make_pkt(0, dados, checksum)
udt_send(pctenv)
rdt_rcv(pctrec) &&
( corrupt(pctrec) ||
Espera Espera
ACK isACK(pctrec,1) )
chamada 0
de cima 0 udt_send(pctenv)
fragmento FSM
do remetente rdt_rcv(pctrec)
&& notcorrupt(pctrec)
rdt_rcv(pctrec) && && isACK(pctrec,0)
(corrupt(pctrec) || L
has_seq1(pctrec)) Espera fragmento FSM
0 de
udt_send(pctenv) baixo do destinatário
rdt_rcv(pctrec) && notcorrupt(pctrec)
&& has_seq1(pctrec)
extract(pctrec,dados)
deliver_data(dados)
pctenv = make_pkt(ACK1, chksum)
slide 15 udt_send(pctenv)© 2010 Pearson Prentice Hall. Todos os direitos reservados.
rdt3.0: canais com erros
e perda
nova suposição: canal técnica: remetente espera
subjacente também quantidade “razoável” de
pode perder pacotes tempo por ACK
(dados ou ACKs)  retransmite se não chegar ACK
 soma de verificação, # nesse tempo
seq., ACKs,  se pct (ou ACK) simplesmente
retransmissões serão atrasado (não perdido):
úteis, mas não  retransmissão será
suficientes duplicada, mas os #s de seq.
já cuidam disso
 destinatário deve especificar
# seq. do pacote sendo
reconhecido com ACK
 requer contador regressivo

slide 16 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


remetente rdt3.0
rdt_send(dados)
pctenv = make_pkt(0, dados, checksum) rdt_rcv(pctrec) &&
udt_send(pctenv) ( corrupt(pctrec) ||
start_timer isACK(pctrec,1) )
rdt_rcv(pctrec) L
L Espera Espera timeout
chamada 0 ACK0 udt_send(pctenv)
de cima
start_timer
rdt_rcv(pctrec)
&& notcorrupt(pctrec) rdt_rcv(pctrec)
&& isACK(pctrec,1) && notcorrupt(pctrec)
stop_timer && isACK(pctrec,0)
stop_timer

Espera Espera
timeout chamada 1
ACK1
udt_send(pctenv) de cima
start_timer rdt_rcv(pctrec)
rdt_send(dados) L
rdt_rcv(pctrec) &&
( corrupt(pctrec) || pctenv = make_pkt(1, dados, checksum)
isACK(pctrec,0) ) udt_send(pctenv)
start_timer
L

slide 17 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt3.0 em ação

slide 18 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


slide 19 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
Desempenho do rdt3.0
 rdt3.0 funciona, mas com desempenho ruim
 ex.: enlace 1 Gbps, 15 ms atraso propriedade, pacote
8000 bits:
L 8000 bits
dtrans   9
 8 microssegundos
R 10 bps
 U remet: utilização – fração do tempo remet. ocupado enviando

U L/R 0,008
= = = 0,00027
remet 30,008
RTT + L / R microsec
onds
 Pct. 1 KB cada 30 ms -> 33 kB/s vazão em enlace de 1 Gbps
 protocolo de rede limita uso de recursos físicos!

slide 20 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


rdt3.0: operação pare e
espere

U L/R 0,008
= = = 0,00027
remet 30,008
RTT + L / R microsec
onds
slide 21 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
Protocolos com paralelismo
paralelismo: remetente permite múltiplos pacotes
“no ar”, ainda a serem reconhecidos
 intervalo de números de sequência deve ser aumentado
 buffering no remetente e/ou destinatário

 duas formas genéricas de protocolo com paralelismo:


Go-Back-N, repetição seletiva
slide 22 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
Paralelismo: utilização
aumentada

Aumento de utilização
por fator de 3!

U 3*L/R 0,02
= = 4 = 0,0008
remet 30,008
RTT + L / R microsecon
ds

slide 23 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Protocolos com paralelismo
Go-back-N: visão geral Repetição seletiva: visão geral
 remetente: até N pacotes  remetente: até pacotes não
não reconhecidos na reconhecidos na pipeline
pipeline  destinatário: reconhece (ACK)
 destinatário: só envia ACKs pacotes individuais
cumulativos  remetente: mantém
 não envia pct ACK se temporizador para cada pct sem
houver uma lacuna ACK
 remetente: tem  se o temporizador expirar:
temporizador para pct sem retransmite apenas o pacote
ACK mais antigo sem ACK
 se o temporizador expirar:
retransmite todos os
pacotes sem ACK

slide 24 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


slide 25
Camada de transporte 3-25
© 2010 Pearson Prentice Hall. Todos os direitos reservados.
Go-Back-N
remetente:
 # seq. de k bits no cabeçalho do pacote
 “janela” de até N pcts consecutivos sem ACK permitidos

 ACK(n): ACK de todos pcts até inclusive # seq. n – “ACK


cumulativo”
 pode receber ACKs duplicados (ver destinatário)
 temporizador para cada pacote no ar
 timeout(n): retransmite pct n e todos pcts com # seq. mais alto
na janela
slide 26 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
GBN: FSM estendido no
remetente
rdt_send(dados) Envia Pacote
if (nextseqnum < base+N) {
pctenv[nextseqnum] = make_pkt(nextseqnum,dados,chksum)
udt_send(pctenv[nextseqnum])
if (base = = nextseqnum)
start_timer
nextseqnum++
}
L else
refuse_data(dados)
base = 1
nextseqnum = 1
timeout Acabou tempo
start_timer
Espera
udt_send(pctenv[base])
rdt_rcv(pctrec) udt_send(pctenv[base+1])
&& corrupt(pctrec) …
udt_send(pctenv[nextseqnum-1])
Recebeu errado rdt_rcv(pctrec) &&
notcorrupt(pctrec) Recebeu correto
base = getacknum(pctrec)+1
If (base = = nextseqnum)
stop_timer
else
start_timer
slide 27 © 2010 Pearson Prentice Hall. Todos os direitos reservados.
GBN: FSM estendido no destinatário
Descarta Pacote
default
udt_send(pctenv)
Entrega Pacote,
rdt_rcv(pctrec)
&& notcurrupt(pctrec) envia ACK
L && hasseqnum(pctrec,expectedseqnum)
expectedseqnum = 1 Espera extract(pctrec,dados)
pctenv = deliver_data(dados)
make_pkt(expectedseqnum,ACK,chksum) pctenv = make_pkt(expectedseqnum,ACK,chksum)
udt_send(pctenv)
expectedseqnum++

apenas ACK: sempre envia ACK para pct recebido


corretamente com # seq. mais alto em ordem
 pode gerar ACKs duplicados
 só precisa se lembrar de expectedseqnum
 pacote fora de ordem:
 descarta (não mantém em buffer) -> sem buffering no
destinatário!
 reenvia ACK do pct com # seq. mais alto em ordem

slide 28 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


GBN
em operação

slide 29 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Repetição seletiva

 destinatário reconhece individualmente todos os


pacotes recebidos de modo correto
 mantém pcts em buffer, se for preciso, para eventual
remessa em ordem para a camada superior
 remetente só reenvia pcts para os quais o ACK
não foi recebido
 temporizador no remetente para cada pct sem ACK
 janela do remetente
 N # seq. consecutivos
 novamente limita #s seq. de pcts enviados, sem ACK

slide 30 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Repetição seletiva: janelas
de remetente, destinatário

slide 31 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Repetição seletiva
remetente destinatário
dados de cima: pct n em [rcvbase, rcvbase+N-
1]
 se próx. # seq. disponível
na janela, envia pct  envia ACK(n)
 fora de ordem: buffer
timeout(n):
 em ordem: entrega
 reenvia pct n, reinicia
(também entrega pcts em
temporizador
ordem no buffer), avança
ACK(n) em janela para próximo pct
[sendbase,sendbase+N]: ainda não recebido
 marca pct n como recebido
pct n em [rcvbase-N,rcvbase-1]
 se n menor pct com ACK,
 ACK(n)
avança base da janela para
próximo # seq. sem ACK caso contrário:
 ignora

slide 32 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Repetição seletiva em
operação

slide 33 © 2010 Pearson Prentice Hall. Todos os direitos reservados.


Repetição seletiva:
dilema
Exemplo:
 # seq.: 0, 1, 2, 3
 tamanho janela = 3
 destinatário não vê
diferença nos dois
cenários!
 passa incorretamente
dados duplicados como
novos em (a)

P: Qual o relacionamento
entre tamanho do # seq. e
tamanho de janela?

slide 34 © 2010 Pearson Prentice Hall. Todos os direitos reservados.

Das könnte Ihnen auch gefallen