Вы находитесь на странице: 1из 105

Captulo 3 Camada

de transporte
Nota sobre o uso destes slides ppt:

Estamos disponibilizando estes slides gratuitamente a todos


(professores, alunos, leitores). Eles esto em formato do
PowerPoint para que voc possa incluir, modificar e excluir
slides (incluindo este) e o contedo do slide, de acordo com
suas necessidades. Eles obviamente representam muito
trabalho da nossa parte. Em retorno pelo uso, pedimos apenas
o seguinte:
Se voc usar estes slides (por exemplo, em sala de aula)
sem muita alterao, que mencione sua fonte (afinal, gostamos
que as pessoas usem nosso livro!).
Se voc postar quaisquer slides sem muita alterao em um
site Web, que informe que eles foram adaptados dos (ou talvez
idnticos aos) nossos slides, e inclua nossa nota de direito
autoral desse material.

Obrigado e divirta-se! JFK/KWR

Todo o material copyright 1996-2009


J. F Kurose e K. W. Ross, Todos os direitos reservados.

slide 1
2010 Pearson Prentice Hall. Todos os direitos reservados.
Captulo 3:
Camada de transporte
Objetivos do captulo:
entender princpios aprender sobre os
por trs dos servios protocolos da camada de
da camada de transporte na Internet:
transporte: UDP: transporte sem
multiplexao/demul- conexo
tiplexao TCP: transporte orientado a
transferncia de conexo
dados confivel controle de
controle de fluxo congestionamento TCP
controle de
congestionamento
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Servios e protocolos
de transporte
oferecem comunicao lgica aplicao

entre processos de aplicao transporte


rede
rodando em hospedeiros enlace
fsica
diferentes
protocolos de transporte rodam
em sistemas finais
lado remetente: divide as msgs
da aplicao em segmentos,
passa camada de rede
lado destinatrio: remonta os
segmentos em msgs, passa aplicao

camada de aplicao transporte


rede
enlace
mais de um protocolo de fsica

transporte disponvel s
aplicaes
Internet: TCP e UDP
Camada de transporte
versus rede
camada de rede: analogia com a famlia:
comunicao lgica 12 crianas mandando
entre hospedeiros carta a 12 crianas
camada de transporte: processos = crianas
comunicao lgica msgs da aplicao =
entre processos cartas nos envelopes
conta com e amplia os hospedeiros = casas
servios da camada de
rede protocolo de transporte
= Ana e Bill
protocolo da camada de
rede = servio postal
Protocolos da camada
de transporte da Internet
remessa confivel e em
aplicao
transporte
rede
ordem (TCP) enlace
fsica

controle de congestionamento rede


enlace rede
enlace
controle de fluxo fsica
fsica

estabelecimento da conexo rede


enlace
remessa no confivel e fsica

desordenada: UDP rede


enlace
fsica
extenso sem luxo do IP pelo network
rede
data link
enlace
melhor esforo physical
fsica
rede aplicao
transporte
enlace

servios no disponveis:
fsica rede
enlace
fsica
garantias de atraso
garantias de largura de banda
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Multiplexao/
demultiplexao
demultiplexao no destinatrio: multiplexao no remetente:
entregando segmentos colhendo dados de mltiplos
recebidos ao socket correto sockets, envelopando dados
com cabealho (usados depois
= socket = processo para demultiplexao)

P3 P1
P1 P2 P4 aplicao
aplicao aplicao

transporte transporte transporte

rede rede rede

enlace enlace enlace

fsica fsica fsica

hospedeiro 2 hospedeiro 3
hospedeiro 1
Como funciona a
demultiplexao
hospedeiro recebe
datagramas IP 32 bits
cada datagrama tem
# porta origem # porta destino
endereo IP de origem,
endereo IP de destino
cada datagrama carrega 1 outros campos de cabealho
segmento da camada de
transporte
cada segmento tem
dados da
nmero de porta de aplicao
origem, destino (mensagem)
hospedeiro usa endereos IP
& nmeros de porta para
direcionar segmento ao formato do segmento TCP/UDP
socket apropriado
Demultiplexao
no orientada para conexo
quando hospedeiro
cria sockets com nmeros
recebe segmento UDP:
de porta: verifica nmero de porta
DatagramSocket mySocket1 = new de destino no segmento
DatagramSocket(12534); direciona segmento UDP
DatagramSocket mySocket2 = new para socket com esse
DatagramSocket(12535); nmero de porta
socket UDP identificado por datagramas IP com
tupla de dois elementos: diferentes endereos IP
(endereo IP destino, nmero porta de origem e/ou nmeros
destino) de porta de origem
direcionados para o
mesmo socket
DatagramSocket serverSocket = new DatagramSocket(6428);

P2 P1
P1
P3

SP: 6428 SP: 6428


DP: 9157 DP: 5775

SP: 9157 SP: 5775


cliente DP: 6428 DP: 6428 Cliente
servidor
IP: A IP: C IP:B

SP oferece endereo de retorno


Demultiplexao orientada
para conexo
socket TCP identificado hospedeiro servidor pode
por tupla de 4 elementos: admitir muitos sockets
endereo IP de origem TCP simultneos:
nmero de porta de origem cada socket identificado
endereo IP de destino por usa prpria tupla de 4
nmero de porta de destino servidores Web tm
hospedeiro destinatrio diferentes sockets para
usa todos os quatro cada cliente conectando
valores para direcionar HTTP no persistente ter
segmento ao socket diferentes sockets para
cada requisio
apropriado
P1 P4 P5 P6 P2 P1P3

SP: 5775
DP: 80
S-IP: B
D-IP:C

SP: 9157 SP: 9157


cliente DP: 80 DP: 80 cliente
servidor
IP: A S-IP: A
IP: C S-IP: B IP:B
D-IP:C D-IP:C
Demultiplexao orientada
para conexo: servidor Web
threaded

P1 P4 P2 P1P3

SP: 5775
DP: 80
S-IP: B
D-IP:C

SP: 9157 SP: 9157


cliente DP: 80 DP: 80 cliente
servidor
IP: A S-IP: A
IP: C S-IP: B IP:B
D-IP:C D-IP:C
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
UDP: User Datagram
Protocol [RFC 768]
protocolo de transporte da
Internet sem luxo, bsico Por que existe um UDP?
servio de melhor esforo, sem estabelecimento de
segmentos UDP podem ser: conexo (que pode gerar
atraso)
perdidos simples: sem estado de
entregues aplicao conexo no remetente,
fora da ordem destinatrio
cabealho de segmento
sem conexo: pequeno
sem handshaking entre sem controle de
remetente e destinatrio congestionamento: UDP
UDP pode transmitir o mais
rpido possvel
cada segmento UDP
tratado independente
dos outros
UDP: mais
normalmente usado para
streaming de aplicaes de 32 bits
multimdia
tamanho, # porta origem # porta dest.
tolerante a perdas em bytes, do tamanho soma verif.
sensvel taxa segmento UDP,
incluindo
outros usos do UDP cabealho
DNS
SNMP dados da
transferncia confivel por aplicao
UDP: aumenta confiabilidade (mensagem)
na camada de aplicao
recuperao de erro
especfica da aplicao! formato de segmento UDP
Soma de verificao UDP

objetivo: detectar erros (p. e., bits invertidos) no


segmento transmitido
destinatrio:
remetente: calcula soma de verificao do
trata contedo de segmento recebido
segmento como sequncia verifica se soma de verificao
de inteiros de 16 bits
soma de verificao
calculada igual ao valor do
(checksum): adio (soma campo de soma de verificao:
por complemento de 1) do NO erro detectado
contedo do segmento
SIM nenhum erro
remetente coloca valor da
soma de verificao no detectado. Mas pode haver
campo de soma de erros mesmo assim? Veja
verificao UDP mais adiante .
Exemplo de soma de
verificao da Internet

nota
Aosomar nmeros, um carryout do bit mais
significativo precisa ser somado ao resultado
exemplo: somar 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

contorna 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
soma de 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1
verificao
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Princpios de transferncia
confivel de dados

importante nas camadas de aplicao, transporte e enlace


lista dos 10 mais importantes tpicos de redes!
caractersticas do canal confivel determinaro
complexidade do protocolo de transferncia confivel (rdt)
Transferncia confivel de
dados: introduo
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 destinatrio

lado lado
remetente destinatrio

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


rdt, para transferir pacote por chega no lado destinatrio do canal
canal no confivel ao
destinatrio
vamos:
desenvolver de forma incremental os lados remetente e
destinatrio do protocolo de transferncia confivel de dados
(rdt)
considerar apenas a transf. de dados unidirecional
mas informaes de controle fluiro nas duas direes!
usar mquinas de estado finito (FSM) para especificar
remetente, destinatrio
evento causando transio de estado
aes tomadas sobre transio de estado
estado: quando neste
estado, prximo estado estado
1 evento
estado determinado 2
exclusivamente pelo aes
prximo evento
Rdt1.0: transferncia
confivel por canal confivel
canal subjacente perfeitamente confivel
sem erros de bit
sem perda de pacotes

FSMs separadas para remetente e destinatrio:


remetente envia dados para canal subjacente
destinatrio 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 destinatrio
Rdt2.0: canal com erros
de bit
canal subjacente pode inverter bits no pacote
soma de verificao para detectar erros de bit

a questo: como recuperar-se dos erros:


reconhecimentos (ACKs): destinatrio diz explicitamente
ao remetente que o pacote foi recebido OK
reconhecimentos negativas (NAKs): destinatrio diz
explicitamente ao remetente que o pacote teve erros
remetente retransmite pacote ao receber NAK
novos mecanismos no rdt2.0 (alm do rdt1.0):
deteco de erro
feedback do destinatrio: msgs de controle (ACK,NAK)
destinatrio->remetente
rdt2.0: especificao da FSM
rdt_send(dados)
snkpkt = make_pkt(dados, soma_verif)
udt_send(pctenv)
destinatrio
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


chamada
remetente de baixo

rdt_rcv(pctrec) &&
notcorrupt(pctrec)
extract(pctrec,dados)
deliver_data(dados)
udt_send(ACK)
rdt2.0: operao 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

chamada
de baixo

rdt_rcv(pctrec) &&
notcorrupt(pctrec)
extract(pctrec,dados)
deliver_data(dados)
udt_send(ACK)
rdt2.0: cenrio 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

chamada
de baixo

rdt_rcv(pctrec) &&
notcorrupt(pctrec)
extract(pctrec,dados)
deliver_data(dados)
udt_send(ACK)
rdt2.0 tem uma falha fatal!

O que acontece se ACK/ tratando de duplicatas:


NAK for corrompido? remetente retransmite
remetente no sabe o que pacote atual se ACK/NAK
aconteceu no destinatrio! corrompido
no pode simplesmente remetente acrescenta
retransmitir: possvel nmero de sequncia a cada
duplicao pacote
destinatrio descarta (no
sobe) pacote duplicado

pare e espere
remetente envia um pacote,
depois espera resposta do
destinatrio
rdt2.1: remetente trata de
ACK/NAKs corrompidos
rdt_send(dados)
pctenv = make_pkt(0, dados, checksum)
udt_send(pctenv) rdt_rcv(pctrec) &&
( corrupt(pctrec) ||
Espera Espera
isNAK(pctrec) )
chamada 0 ACK ou
NAK 0 udt_send(pctenv)
de cima
rdt_rcv(pctrec)
&& notcorrupt(pctrec) rdt_rcv(pctrec)
&& isACK(pctrec) && notcorrupt(pctrec)
&& isACK(pctrec)




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)
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 rdt_rcv(pctrec) && (corrupt
(pctrec) (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)
rdt2.1: discusso
remetente: destinatrio:
# seq acrescentado ao deve verificar se
pkt pacote recebido est
dois #s seq. (0,1) duplicado
bastaro. Por qu? estado indica se 0 ou 1
# seq. esperado do
deve verificar se ACK/ pacote
NAK recebido foi
nota: destinatrio no
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
rdt2.2: um protocolo sem NAK

mesma funcionalidade de rdt2.1, usando apenas ACKs


em vez de NAK, destinatrio envia ACK para ltimo
pacote recebido OK
destinatrio precisa incluir explicitamente # seq. do pacote
sendo reconhecido com ACK
ACK duplicado no remetente resulta na mesma ao
de NAK: retransmitir pacote atual
rdt2.2: fragmentos do
remetente, destinatrio
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) ||

has_seq1(pctrec)) Espera fragmento FSM
0 de
udt_send(pctenv) baixo do destinatrio
rdt_rcv(pctrec) && notcorrupt(pctrec)
&& has_seq1(pctrec)
extract(pctrec,dados)
deliver_data(dados)
pctenv = make_pkt(ACK1, chksum)
udt_send(pctenv)
rdt3.0: canais com erros
e perda
nova suposio: canal tcnica: remetente espera
subjacente tambm quantidade razovel de
pode perder pacotes tempo por ACK
(dados ou ACKs) retransmite se no chegar ACK
soma de verificao, # nesse tempo
seq., ACKs, se pct (ou ACK) simplesmente
retransmisses sero atrasado (no perdido):
teis, mas no retransmisso ser
suficientes duplicada, mas os #s de seq.
j cuidam disso
destinatrio deve especificar
# seq. do pacote sendo
reconhecido com ACK
requer contador regressivo
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)


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)

rdt_rcv(pctrec) &&
( corrupt(pctrec) || pctenv = make_pkt(1, dados, checksum)
isACK(pctrec,0) ) udt_send(pctenv)
start_timer


rdt3.0 em ao
Desempenho do rdt3.0
rdt3.0 funciona, mas com desempenho ruim
ex.: enlace 1 Gbps, 15 ms atraso propriedade, pacote
8000 bits:

U remet: utilizao frao do tempo remet. ocupado enviando

Pct. 1 KB cada 30 ms -> 33 kB/s vazo em enlace de 1 Gbps


protocolo de rede limita uso de recursos fsicos!
rdt3.0: operao pare e
espere
Protocolos com paralelismo
paralelismo: remetente permite mltiplos pacotes
no ar, ainda a serem reconhecidos
intervalo de nmeros de sequncia deve ser aumentado
buffering no remetente e/ou destinatrio

duas formas genricas de protocolo com paralelismo:


Go-Back-N, repetio seletiva
Paralelismo: utilizao
aumentada

Aumento de utilizao
por fator de 3!
Protocolos com paralelismo
Go-back-N: viso geral Repetio seletiva: viso geral
remetente: at N pacotes remetente: at pacotes no
no reconhecidos na reconhecidos na pipeline
pipeline destinatrio: reconhece (ACK)
destinatrio: s envia ACKs pacotes individuais
cumulativos remetente: mantm
no 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
Go-Back-N
remetente:
# seq. de k bits no cabealho 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 destinatrio)
temporizador para cada pacote no ar
timeout(n): retransmite pct n e todos pcts com # seq. mais alto
na janela
GBN: FSM estendido no
remetente
rdt_send(dados)
if (nextseqnum < base+N) {
pctenv[nextseqnum] = make_pkt(nextseqnum,dados,chksum)
udt_send(pctenv[nextseqnum])
if (base = = nextseqnum)
start_timer
nextseqnum++
}

else
refuse_data(dados)
base = 1
nextseqnum = 1
timeout
start_timer
Espera
udt_send(pctenv[base])
rdt_rcv(pctrec) udt_send(pctenv[base+1])
&& corrupt(pctrec)
udt_send(pctenv
[nextseqnum-1])
rdt_rcv(pctrec) &&
notcorrupt(pctrec)
base = getacknum(pctrec)+1
If (base = = nextseqnum)
stop_timer
else
start_timer
GBN: FSM estendido no
destinatrio
default
udt_send(pctenv) rdt_rcv(pctrec)
&& notcurrupt(pctrec)

&& 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 (no mantm em buffer) -> sem buffering no
destinatrio!
reenvia ACK do pct com # seq. mais alto em ordem
GBN em operao
Repetio seletiva

individualmente todos os
destinatrio reconhece
pacotes recebidos de modo correto
mantm pcts em buffer, se for preciso, para eventual
remessa em ordem para a camada superior
remetente s reenvia pcts para os quais o ACK
no 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
Repetio seletiva: janelas
de remetente, destinatrio
Repetio seletiva
remetente destinatrio
dados de cima: pct n em [rcvbase, rcvbase
+N-1]
se prx. # seq. disponvel
na janela, envia pct envia ACK(n)
fora de ordem: buffer
timeout(n):
em ordem: entrega
reenvia pct n, reinicia
(tambm entrega pcts em
temporizador
ordem no buffer), avana
ACK(n) em [sendbase,sendbase janela para prximo pct
+N]: ainda no recebido
marca pct n como recebido
pct n em [rcvbase-N,rcvbase-1]
se n menor pct com ACK,
ACK(n)
avana base da janela para
prximo # seq. sem ACK caso contrrio:
ignora
Repetio seletiva em
operao
Repetio seletiva:
dilema
Exemplo:
# seq.: 0, 1, 2, 3
tamanho janela = 3
destinatrio no v
diferena nos dois cenrios!
passa incorretamente
dados duplicados como
novos em (a)

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

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
TCP: Viso geral
RFCs: 793, 1122, 1323, 2018, 2581
ponto a ponto:
dados full duplex:
um remetente, um
destinatrio dados bidirecionais fluem
cadeia de bytes confivel, em na mesma conexo
ordem: MSS: tamanho mximo do
sem limites de mensagem segmento
paralelismo: orientado a conexo:
congestionamento TCP e
controle de fluxo definem apresentao (troca de
tamanho da janela msgs de controle) inicia
buffers de envio & recepo estado do remetente e
destinatrio antes da
troca de dados
fluxo controlado:
remetente no
sobrecarrega destinatrio
Estrutura do segmento TCP
32 bits
URG: dados urgentes contagem por
(quase no usado) porta origem porta destino bytes de dados
(no segmentos!)
ACK: # ACK nmero sequncia
vlido nmero reconhecimento
compr. no
cab. usado
UA P R S F janela recepo # bytes
PSH: empurrar dados destinatrio
agora (quase no usado) soma verificao ponteiro dados urg. pode aceitar
RST, SYN, FIN: opes (tamanho varivel)
estab. conexo
(comandos setup,
teardown)
dados da
soma de verificao
da Internet aplicao
(como em UDP) (tamanho varivel)
#s sequncia e ACKs do TCP

#s de sequncia:
nmero na cadeia de
bytes do 1o byte nos
dados do segmento
ACKs:
# seq do prximo byte
esperado do outro lado
ACK cumulativo
P: como o destinatrio trata
segmentos fora de ordem
R: TCP no diz a critrio
do implementador
cenrio telnet simples
Tempo de ida e volta e
timeout do TCP
P: Como definir o valor P: Como estimar o RTT?
de timeout do TCP? SampleRTT: tempo medido
maior que RTT da transmisso do segmento
mas RTT varia at receber o ACK
muito curto: ignora retransmisses

timeout prematuro SampleRTT variar;


retransmisses queremos RTT estimado
desnecessrias mais estvel
muito longo: baixa mdia de vrias medies

reao a perda de recentes, no apenas


segmento SampleRTT atual
EstimatedRTT = (1- )*EstimatedRTT + *SampleRTT

mdia mvel exponencial ponderada


influncia da amostra passada diminui exponencialmente
rpido
valor tpico: = 0,125
Amostras de RTTs estimados:
Tempo de ida e volta e
timeout do TCP
definindo o timeout
EstimtedRTT mais margem de segurana
grande variao em EstimatedRTT -> maior margem de seg.
primeira estimativa do quanto SampleRTT se desvia de
EstimatedRTT:

DevRTT = (1-)*DevRTT +
*|SampleRTT-EstimatedRTT|

(geralmente, = 0,25)

depois definir intervalo de timeout

TimeoutInterval = EstimatedRTT + 4*DevRTT


Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Transferncia confivel
de dados no TCP
TCP cria servio rdt retransmisses so
em cima do servio no disparadas por:
confivel do IP eventos de timeout
segmentos em paralelo ACKs duplicados
ACKs cumulativos inicialmente, considera

TCP usa nico


remetente TCP
temporizador de simplificado:
ignora ACKs duplicados
retransmisso
ignora controle de
fluxo, controle de
congestionamento
Eventos de remetente TCP:
dados recebidos da apl.: timeout:
cria segmento com # retransmite segmento
seq que causou timeout
# seq # nmero da reinicia temporizador
cadeia de bytes do ACK recebido:
primeiro byte de dados Reconhecem-se
no segmento segmentos sem ACK
anteriores
inicia temporizador, se
atualiza o que
ainda no tiver iniciado sabidamente tem ACK
(pense nele como para inicia temporizador se
o segmento mais antigo houver segmentos
pendentes
sem ACK)
intervalo de expirao:
TimeOutInterval
RemetenteTCP (simplificado)
NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum

loop (forever) {
switch(event)

event: data received from application above Comentrio:


create TCP segment with sequence number NextSeqNum
if (timer currently not running)
SendBase-1: ltimo byte
start timer cumulativo com ACK
pass segment to IP Exemplo:
NextSeqNum = NextSeqNum + length(dados) SendBase-1 = 71;
y = 73, de modo que
event: timer timeout
retransmit not-yet-acknowledged segment with destinatrio deseja 73+ ;
smallest sequence number y > SendBase, de modo que
start timer novos dados tm ACK
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}

} /* end of loop forever */


TCP: cenrios de
retransmisso
Hosp. A Hosp. B Hosp. A Hosp. B

Seq = Seq =
92, 8 92, 8
bytes bytes
dados Seq = dados

Seq = 92 timeout
100,
20 by
tes d
a
timeout

0 dos
= 10
ACK
X
loss
Seq = Seq =
92, 8 92, 8
bytes Sendbase bytes
dados
dados
= 100

Seq = 92 timeout
SendBase
= 120
=
ACK
100
SendBase
= 100 SendBase
= 120 Timeout prematuro
tempo tempo
Cenrio de ACK perdido
Host A Host B

Seq =
92, 8
bytes
dados
0
= 10
timeout

Seq = C K
100, 2 A
0 byte
s dado
s
X
perda

SendBase =
ACK
= 120 120

tempo
Cenrio ACK cumulativo
TCP: gerao de ACK
[RFC 1122, RFC 2581]
Retransmisso rpida

perodo detimeout se remetente recebe 3 ACKs


relativamente grande: para os mesmos dados, ele
longo atraso antes de supe que segmento aps
reenviar pacote perdido dados com ACK foi perdido:
detecta segmentos retransmisso rpida:
perdidos por meio de ACKs reenvia segmento antes que
duplicados o temporizador expire
remetente geralmente
envia muitos segmentos um
aps o outro
se segmento for perdido,
provavelmente haver
muitos ACKs duplicados
para esse segmento
Hosp. A Hosp. B

seq # x1
seq # x2
seq # x3 ACK x1
seq # x4 X
seq # x5
ACK x1
ACK x1
ACK x1
ACKs
duplicados
trs vezes reenv
ia seq X
2
timeout

tempo
Algoritmo de retransmisso
rpida:

event: ACK received, with ACK field value of y


if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
else {
increment count of dup ACKs received for y
if (count of dup ACKs received for y = 3) {
resend segment with sequence number y
}

ACK duplicado para retransmisso rpida


segmento j com ACK
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Controle de fluxo TCP
controle de fluxo
lado receptor da
conexo TCP tem um remetente no estourar
buffer do destinatrio
buffer de recepo: transmitindo muitos
dados muito rapidamente
espao
datagramas de buffer dados TCP processo da servio de
IP (atualmente) (no buffer) aplicao
no usado
compatibilizao de
velocidades:
compatibiliza a taxa de
envio do remetente
processo da aplicao
com a de leitura da
pode ser lento na aplicao receptora
leitura do buffer
Controle de fluxo TCP:
como funciona
espao destinatrio: anuncia
datagramas de buffer dados TCP processo da
IP (atualmente) (no buffer) aplicao espao de buffer no
no usado
usado incluindo valor de
rwnd rwnd no cabealho do
RcvBuffer
segmento
(suponha que destinatrio TCP remetente: limita # de
descarte segmentos fora de bytes com ACKa rwnd
ordem) garante que buffer do
espao de buffer no usado: destinatrio no estoura
= rwnd
= RcvBuffer-[LastByteRcvd -
LastByteRead]
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Gerenciamento da
conexo TCP
lembre-se: Remetente e
destinatrio TCP
estabelecem conexo antes apresentao de 3 vias:
que troquem segmentos
etapa 1: hosp. cliente envia segmento
dados
SYN do TCP ao servidor
inicializa variveis TCP:
especifica # seq. inicial
#s seq.:
sem dados
buffers, informao de
etapa 2: hosp. servidor recebe SYN,
controle de fluxo (p. e.
responde com segmento SYNACK
RcvWindow)
cliente: inicia a conexo servidor aloca buffers
Socket clientSocket = new especifica # seq. inicial do

Socket("hostname","port #");
servidor
servidor: contactado pelo etapa 3: cliente recebe SYNACK,
responde com segmento ACK, que
cliente
Socket connectionSocket =
pode conter dados
welcomeSocket.accept();
fechando uma conexo: cliente servidor

fecha
cliente fecha socket: FIN

clientSocket.close();

etapa 1: sistema final do ACK


fecha
cliente envia segmento de FIN
controle TCP FIN ao
servidor

temporizada
ACK

espera
etapa 2: servidor recebe
FIN, responde com ACK.
Fecha conexo, envia FIN.
fechado
etapa 3: cliente recebe cliente servidor
FIN, responde com ACK fechado
FIN
entra em espera
temporizada
responder com ACK ACK
fechando
aos FINs recebidos
FIN

etapa 4: servidor recebe

temporizada
ACK - conexo fechada ACK

espera
fechado
Nota: Com pequena
modificao, pode tratar
de FINs simultneos. fechado
ciclo de vida do
servidor TCP

ciclo de vida do
cliente TCP
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Princpios de controle de
congestionamento
Congestionamento:
informalmente: muitas fontes enviando muitos
dados muito rpido para a rede tratar
diferente de controle de fluxo!
manifestaes:
pacotes perdidos (estouro de buffer nos
roteadores)
longos atrasos (enfileiramento nos buffers do
roteador)
um dos maiores problemas da rede!
Causas/custos do
congestionamento: cenrio 1
dois remetentes,
dois destinatrios
um roteador,
infinitos buffers
sem retransmisso

grandes atrasos
quando
congestionado
vazo mxima
alcanvel
Causas/custos do
congestionamento: cenrio 2

um roteador, buffers finitos


retransmisso do pacote perdido pelo remetente
sempre:
=

out (vazo)
in
retransmisso perfeita apenas quando h perda:
>
out
in
retransmisso do pacote adiado (no pedido) torna
maior
in
(que o caso perfeito ) para o mesmo

out
R/2 R/2 R/2

R/3
out

out

out
R/4

R/2 R/2 R/2


in in in

a. b. c.
custos do congestionamento:
mais trabalho (retransmisso) para determinada vazo
retransmisses desnecessrias: enlace transporta vrias cpias
do pacote
Causas/custos do
congestionamento: cenrio 3
quatro remetentes P: O que acontece quando

caminhos com vrios saltos in
e
in aumentam ?
timeout/retransmisso
H
o
o
st
u
A t

H
o
st
B

outro custo do congestionamento:


quando pacote descartado, qualquer capacidade
de transmisso upstream usada para esse pacote
foi desperdiada!
Tcnicas para controle de
congestionamento
duas tcnicas amplas para controle de congestionamento:

controle de controle de
congestionamento fim a congestionamento
fim: assistido pela rede:
roteadores oferecem
nenhum feedback explcito da
feedback aos sistemas
rede finais
congestionamento deduzido da nico bit indicando
perda e atraso observados do congestionamento
sistema final (SNA, DECbit, TCP/IP
tcnica tomada pelo TCP ECN, ATM)
taxa explcita que o
remetente deve enviar
no enlace de sada
Estudo de caso: controle de
congestionamento ATM ABR
ABR: taxa de bit clulas RM (gerenciamento de
disponvel: recursos) :
servio elstico enviadas pelo remetente,
intercaladas com clulas de dados
se caminho do remetente
sobrecarregado: bits na clula RM definida por
comutadores (assistido pela rede)
remetente deve usar
largura de banda bit NI: sem aumento na taxa

disponvel (congestionamento leve)


se caminho do remetente bit CI: indicao de

congestionado: congestionamento
remetente sufocado clulas RM retornadas ao remetente
taxa mnima garantida pelo destinatrio, com bits intactos
campo ER (explicit rate) de 2 bytes na clula RM
comutador congestionado pode reduzir valor de ER na clula
taxa de envio do remetente taxa mxima admissvel no caminho

bit EFCI nas clulas de dados: defina como 1 no


comutador congestionado
se a clula de dados anterior clula RM tiver EFCI definido,
remetente define bit CI na clula RM retornada
Captulo 3: Esboo

3.1 Servios da camada 3.5 Transporte orientado


de transporte para conexo: TCP
3.2 Multiplexao e estrutura de segmento
demultiplexao transferncia confivel de
dados
3.3 Transporte no
controle de fluxo
orientado para
gerenciamento da conexo
conexo: UDP
3.6 Princpios de controle
3.4 Princpios da
de congestionamento
transferncia
3.7 Controle de
confivel de dados
congestionamento no TCP
Controle de congestionamento
TCP: busca por largura
de banda
procura por largura de banda: aumenta taxa de
transmisso no recebimento do ACK at por fim ocorrer
perda; depois diminui taxa de transmisso
continua a aumentar no ACK, diminui na perda (pois largura de
banda disponvel est mudando, dependendo de outras conexes
na rede) ACKs sendo recebidos,
X perda e diminuio de taxa
de modo que aumenta taxa
X
taxa de emisso

X
X
comportamento
X dente de serra
do TCP

tempo

P: Com que velocidade aumentar/diminuir?


detalhes a seguir
Controle de congestionamento
TCP: detalhes
remetente limita taxa limitando nmero de
bytes sem ACK na pipeline:
LastByteSent-LastByteAcked cwnd
cwnd: difere de rwnd (como, por qu?)
remetente limitado por min(cwnd,rwnd)
bytes
aproximadamente, cwnd!

cwnd
taxa = bytes/seg
RTT
RTT
cwnd dinmico, funo do
congestionamento de rede percebido ACK(s)
Controle de congestionamento
TCP: mais detalhes
evento de perda de segmento: ACK recebido: aumenta
reduzindo cwnd! cwnd!
timeout: sem resposta do fase de partida lenta:
destinatrio aumento exponencialmente
corta cwnd para 1 rpido (apesar do nome) no
incio da conexo, ou aps
3 ACKs duplicados: pelo
o timeout
menos alguns segmentos
preveno de
passando (lembre-se da
retransmisso rpida) congestionamento:
aumento linear
corta cwnd pela metade,
menos agressivamente do que
no timeout
Partida lenta do TCP
quando conexo comea, cwnd = 1
MSS Hosp. A Hosp. B
exemplo: MSS = 500 bytes &
um segme
RTT = 200 ms nto

RTT
taxa inicial = 20 kbps
largura de banda disponvel pode dois segm
entos
ser >> MSS/RTT
desejvel subir rapidamente
para taxa respeitvel quatro seg
mentos
aumenta taxa exponencialmente at
o primeiro evento de perda ou
quando o patamar alcanado
cwnd duplo a cada RTT
tempo
feito incrementando cwnd por 1
para cada ACK recebido
Transio dentro/fora
da partida rpida
ssthresh: patamar de cwnd mantido pelo TCP
um evento de perda: define ssthresh como cwnd/2
lembre-se (metade) da taxa TCP quando ocorreu perda de
congestionamento
quando transio de cwnd > = ssthresh: da partida lenta para fase
de preveno de congestionamento
duplicate ACK
dupACKcount++ new ACK
cwnd = cwnd+MSS
dupACKcount = 0

transmite novos segmento(s), como permitido
cwnd = 1 MSS
ssthresh = 64 KB cwnd > ssthresh
dupACKcount = 0 partida
preveno de
lenta timeout congestionamento
ssthresh = cwnd/2
cwnd = 1 MSS
dupACKcount = 0
timeout
retransmite segmento que falta
ssthresh = cwnd/2
cwnd = 1 MSS
dupACKcount = 0
retransmite segmento que falta
TCP: preveno de
congestionamento
quando cwnd > ssthresh AIMD
cresce cwnd de forma linear
ACKs: aumenta cwnd em 1
aumenta cwnd em 1 MSS
por RTT MSS por RTT: aumento
aditivo
aborda possvel
perda: corta cwnd ao meio
congestionamento mais
lento que na partida lenta (perda sem timeout
detectado): diminuio
implementao: cwnd =
multiplicativa
cwnd + MSS/cwnd para
cada ACK recebido
AIMD: Additive Increase
Multiplicative Decrease
FSM do controle de
congestionamento TCP:
viso geral

partida cwnd > ssthresh


preveno
lenta de cong.
perda:
timeout
perda:
timeout

perda: novo ACK perda:


timeout 3dupACK
recup.
perda: rpida
3dupACK
FSM do controle de
congestionamento TCP: detalhes
Tipos populares de TCP
Resumo: controle de
congestionamento TCP
quando cwnd < ssthresh, remetente na fase de
partida lenta, janela cresce exponencialmente.

quando cwnd > = ssthresh, remetente est na


fase de preveno de congestionamento, janela
cresce linearmente.

quando ocorre o ACK duplicado triplo, ssthresh


definido como cwnd/2, cwnd definido como
~ssthresh

timeout, ssthresh definido como


quando ocorre o
cwnd/2, cwnd definido como 1 MSS.
Vazo do TCP

P: Qual a vazo mdia do TCP como funo


do tamanho da janela, RTT?
ignorando partida lenta
seja W o tamanho da janela quando ocorre
a perda
quando janela W, a vazo W/RTT
logo aps perda, janela cai para W/2,
vazo para W/2RTT.
aps a vazo: 0,75 W/RTT
Futuros do TCP: TCP sobre
pipes longos, gordos
exemplo: segmentos de 1500 bytes, RTT de
100 ms, deseja vazo de 10 Gbps
exige tamanho de janela W = 83.333 segmentos
no ar
vazo em termos da taxa de perda:

Uau!
L = 2 10-10
novas verses do TCP para alta velocidade
Equidade do TCP

objetivo da equidade: se K sesses TCP


compartilharem o mesmo enlace de gargalo da
largura de banda R, cada uma deve ter uma taxa
mdia de R/K
conexo TCP 1

capacidade de
gargalo do
conexo
roteador R
TCP 2
Por que o TCP justo?
duas sesses concorrentes:
aumento aditivo d inclinao 1, pois vazo aumenta
diminuio multiplicativa diminui vazo proporcionalmente

R compartilhamento de largura de banda igual


Vazo da conexo 2

perda: diminui janela por fator de 2


preveno de congestionamento: aumento aditivo
perda: diminui janela por fator de 2
preveno de cong.: aumento aditivo

Vazo da conexo 1 R
Equidade (mais)
equidade e UDP
qquidade e conexes TCP
aplicaes de multimdia paralelas
normalmente no usam
nada impede que a
TCP
aplicao abra conexes
no desejam que a taxa
seja sufocada pelo paralelas entre 2
controle de hospedeiros.
congestionamento navegadores Web fazem
em vez disso, use UDP: isso
envia udio/vdeo em exemplo: enlace de taxa R
taxa constante, tolera admitindo 9 conexes;
perdas de pacotes
nova aplicao solicita 1 TCP,
recebe taxa R/10
nova aplicao solicita 11
TCPs, recebe R/2!
Captulo 3: Resumo
princpios por trs dos
servios da camada de
transporte:
multiplexao,
demultiplexao
transferncia de dados
confivel Em seguida:
controle de fluxo
saindo da borda da
controle de rede (camada de
congestionamento
transportes da
instncia e implementao na aplicao)
Internet
no ncleo da rede
UDP
TCP