Você está na página 1de 43

TCP

TCP: Overview
• ponto-a-ponto: • dados full-duplex:
– um transmissor, um receptor – transmissão bi-direcional na
• confiável, seqüêncial byte mesma conexão
stream: – MSS: maximum segment size
– não há contornos de mensagens • orientado à conexão:
• pipelined: (transmissão de vários – handshaking (troca de
pacotes em confirmação) mensagens de controle) inicia o
estado do transmissor e do
– Controle de congestão e de fluxo
receptor antes da troca de dados
definem tamanho da janela
• controle de fluxo:
• buffers de transmissão e de
– transmissor não esgota a
recepção
capacidade do receptor
aplicação aplicação
envia dados lê dados
socket socket
port port
TCP TCP
buffe de txr buffer de rx
segment
Estrutura do Segmento TCP
32 bits
URG: dados urgentes contagem por
(pouco usado) porta origem porta destino
bytes de dados
número de seqüência (não segmentos!)
ACK: campo de ACK
é válido número de reconhecimento
tam. não
PSH: produz envio de cabec.usado
UA P R S F janela de recep.
dados (pouco usado) checksum dados urgentes número de bytes
receptor está
RST, SYN, FIN: Opções (tamanho variável) pronto para
estabelec. de conexão aceitar
(comandos de
criação e término)
dados de aplicação
Internet (tamanho variável)
checksum
(como no UDP)
Números de Seqüência e ACKs do TCP
Números de seqüência:
Host A Host B
– número do primeiro
byte no segmentos de Usuário Seq=4
2,
digita ACK=
dados ‘C’
79, da
t a = ‘C
’ host confirma
ACKs: recepção de
– número do próximo ‘C’, e ecoa o
C’
da ta = ‘ ’C’ de volta
byte esperado do outro CK=4
3 ,
79 , A
lado Seq=
– ACK cumulativo Q:
como o receptor trata host confirma
segmentos foram de ordem recepção Seq=4
do ‘C’ ecoado 3, ACK
=80
– A especificação do
TCP não define, fica a
critério do
implementador tempo
cenário telnet simples
TCP: transferência de dados confiável

evento: dados recebidos


transmissor simplificado, assumindo
da aplicação acima
que não há controle de fluxo nem de
cria, envia segmento
congestionamento

evento: temporização esgotada


wait
espera
para segmento com seq = y
for
por
event
evento retransmite segmento

evento: ACK recebido,


com número de ACK = y
processamento do ACK
TCP: 00 sendbase = initial_sequence number
01 nextseqnum = initial_sequence number
02
transferência 03 loop (forever) {
04 switch(event)

confiável 05
06
07
event: dados recebidos da aplicação acima
cria segmento TCP com número de seqüência nextseqnum
inicia temporizador para segmento nextseqnum
08 passa segmento ao IP
09 nextseqnum = nextseqnum + length(data)
10 event: esgotamento de temp. para segmento com seq = y
11 retransmite segmento com seq = y
12 calcule nova temporização para o segmento y
Transmissor 13 reinicia temporizador para número de seqüência y
14 event: ACK recebido, com valor y no campo de ACK
TCP simplificado 15 if (y > sendbase) { /* ACK cumulativo de todos os dados até y */
16 cancela todas as temporizações para segmentos com seq < y
17 sendbase = y
18 }
19 else { /* um ACK duplicata para um segmento já reconhecido */
20 incrementa numero de duplicatas de ACKs recebidas para y
21 if (numero de duplicatas de ACKS recebidas para y == 3) {
22 /* TCP fast retransmit */
23 reenvia segmento com número de seqüência y
24 reinicia temporização para segmento y
25 }
26 } /* end of loop forever */
Geração de ACK [RFC 1122, RFC 2581]
Event0 Ação do TCP Receptor
segmento chega em ordem, ACK retardado. Espera até 500ms
não há lacunas, pelo próximo segmento. Se não chegar,
segmentos anteriores já aceitos envia ACK

segmento chega em ordem, imediatamente envia um ACK


não há lacunas, cumulativo
um ACK atrasado pendente

segmento chega fora de ordem envia ACK duplicado, indicando número


número de seqüência chegou de seqüência do próximo byte esperado
maior: gap detetado

chegada de segmento que reconhece imediatamente se o segmento


parcial ou completamente começa na borda inferior do gap
preenche o gap
TCP: cenários de retransmissão
Host A Host B Host A Host B

Seq=9 Seq=9
2, 2, 8 b y te
8 b y te s data
s data Seq=
1

Seq=92 temp.
00, 2
temporização

0 by t
es da
t a
=100

Seq=100 temp.
ACK 0
10
X CK=
A AC K = 120
loss
Seq=9 Seq=9
2, 8 b 2, 8 b
y y t es da
tes da ta
ta

= 120
K
=100 AC
ACK

tempo tempo
cenário com perda temporização prematura,
do ACK ACKs cumulativos
TCP: Controle de Fluxo

controle de fluxo receptor: explicitamente


transmissor não deve informa o transmissor da
esgotar os buffers de área livre no buffer
receção enviando (dinamicamente mudando)
dados rápido demais – campo RcvWindow
no segmento TCP
RcvBuffer = tamanho do Buffer de recepção do TCP transmissor: mantém a
RcvWindow = total de espaço livre no buffer quantidade de dados
transmitidos mas não
reconhecidos menor que o
último RcvWindow
recebido

armazenamento de recepção
TCP Round Trip Time e Temporização
Q: como escolher o valor Q: Como estimar o RTT?
da temporização do • SampleRTT: tempo medido da
TCP? transmissão de um segmento até a
respectiva confirmação
• maior que o RTT
– ignora retransmissões e segmentos
– nota: RTT varia
reconhecidos de forma cumulativa
• muito curto: temporização
• SampleRTT varia de forma rápida, é
prematura
desejável um amortecedor para a
– retransmissões estimativa do RTT
desnecessárias
– usar várias medidas recentes, não
• muito longo: a reação à apenas o último SampleRTT
perda de segmento fica obtido
lenta
TCP Round Trip Time e Temporização

EstimatedRTT = (1-x)*EstimatedRTT + x*SampleRTT


• Média móvel com peso exponential
• influencia de uma dada amostra decresce de forma exponencial
• valor típico de x: 0.1

Definindo a temporização
• EstimtedRTT mais “margem de segurança”
• grandes variações no EstimatedRTT -> maior margem de segurança

Temporização = EstimatedRTT + 4*Desvios


Desvios = (1-x)*Desvio +
x*|SampleRTT-EstimatedRTT|
TCP Estabelecimento de Conexão

TCP transmissor estabelece conexão Three way handshake:


com o receptor antes de trocar
Passo 1: sistema final cliente envia
segmentos de dados
TCP SYN ao servidor
• initializar variáveis:
– especifica número de seqüência
– números de seqüência inicial
– buffers, controle de fluxo
Passo 2: sistema final servidor que
(ex. RcvWindow)
recebe o SYN, responde com
• cliente: iniciador da conexão segmento SYNACK
Socket clientSocket = new
Socket("hostname","port – reconhece o SYN recebido
number"); – aloca buffers
• servidor: chamado pelo cliente – especifica o número de
seqüência inicial do servidor
Socket connectionSocket =
welcomeSocket.accept(); Passo 3: o sistema final cliente
reconhece o SYNACK
TCP Término de Conexão

cliente servidor
Fechando uma conexão: close
FIN
cliente fecha o socket:
clientSocket.close();
ACK
Passo 1: o cliente envia o segmento close
TCP FIN ao servidor FIN

Passo 2: servidor recebe FIN,

espera temp.
ACK
responde com ACK. Fecha a
conexão, envia FIN.

closed
TCP Término de Conexão

cliente servidor

Passo 3: cliente recebe FIN, closing


FIN
responde com ACK.
– Entra “espera temporizada”
- vai responder com ACK a ACK
closing
FINs recebidos FIN

Passo 4: servidor, recebe ACK.

espera temp.
Conexão fechada. ACK

closed

closed
TCP Controle de Conexão

Estados do Servidor

Estados do Cliente
Princípios de Controle de Congestionamento

Congestionamento:
• informalmente: “muitas fontes enviando dados acima da
capacidade da rede tratá-los”
• diferente de controle de fluxo!
• sintomas:
– perda de pacotes (saturação de buffer nos roteadores)
– atrasos grandes (filas nos buffers dos roteadores)
• um dos 10 problemas mais importantes na Internet!
Controle de congestionamento

(a) Uma rede rápida com um receptor de baixa capacidade. (b) Uma rede lenta
com um receptor de alta-capacidade.
Controle de congestionamento
Quando há pacotes demais presentes em parte de uma sub-rede (sub-rede lenta), o
desempenho da rede diminui.
Controle de congestionamento

Gerencia
mento da
janela
TCP.
Causas/custos do congestionamento: cenário
1
• dois transmissores, dois
receptores
• um roteador, buffers
infinitos
• não há retransmissão

• grandes atrasos
quando
congestionado
• máxima vazão
obtenível
Causas/custos do congestionamento: cenário
2
• um roteador, buffers finitos
• transmissor reenvia pacotes perdidos
Causas/custos do congestionamento: cenário
2
• sempre vale :  = out(tráfego bom)
in
• “perfeita” retransmissão somente quando há perdas:  > out
in
• retransmissão de pacotes atrasados (não perdidos) torna  maior (que o caso
in
perfeito ) para o mesmo 
out

“custos” do congestionamento:
• mais trabalho (retransmissões) para um dado “tráfego bom”
• retransmissões desnecessárias: enlace transporta várias cópias do mesmo pacote
Causas/custos do congestionamento: cenário
3
• quatro transmissores
Q: o que acontece quando 
• caminhos com múltiplos saltos in
 e aumentam ?
• temporizações/retransmissões in
Causas/custos do congestionamento: cenário
3

Outro “custo” do congestionamento:


• quando pacote é descartado, qualquer capacidade de transmissão que
tenha sido anteriormente usada para aquele pacote é desperdiçada!
Abordagens do problema de controle de
congestionamento
Existem duas abordagens gerais para o problema
de controle de congestionamento:
Controle de congestionamento Controle de congestionamento
fim-a-fim: assistido pela rede:
• não usa realimentação explícita • roteadores enviam informações
da rede para os sistemas finais
• congestionamento é inferido a – bit único indicando o
partir das perdas e dos atrasos congestionamento (SNA,
observados nos sistemas finais DECbit, TCP/IP ECN,
• abordagem usada pelo TCP ATM)
– taxa explícita do
transmissor poderia ser
enviada
TCP: Controle Congestionamento
• controle fim-a-fim (não há assistência da rede)
• taxa de transmissão é limitada pelo tamanho da janela, Congwin, sobre os
segmentos:

Congwin

• w segmentos, cada um com MSS bytes enviados em um


RTT:
w * MSS
vazão = Bytes/seg
RTT
TCP: Controle Congestionamento

• “teste” para reconhecer a • duas “fases””


taxa possível: – slow start
– idealmente: transmitir tão – congestion avoidance
rápido quanto possível • variáveis importantes:
(Congwin tão grande
– Congwin
quanto possível) sem perdas
– aumentar Congwin até – threshold: define o
que ocorra perda limite entre a fase slow
(congestionamento) start e a fase congestion
avoidance
– perda: diminuir Congwin,
então ir testando
(aumentando) outra vez
TCP Slowstart
Host A Host B
algoritmo Slowstart one segm
ent

RTT
initializar: Congwin = 1
para (cada segmento reconhecido two segm
ents
Congwin++
até (evento perda OU
CongWin > threshold)
four segm
ents

• aumento exponencial (por RTT) no


tamanho da janela (não tão lento!)
• evento de perda : temporização tempo
(Tahoe TCP) e/ou 3 ACKs duplicados
(Reno TCP)
TCP: Congestion Avoidance
Congestion avoidance
/* acabou slowstart */
/* Congwin > threshold */
Até (evento perda) {
cada w segmentos reconhecidos:
Congwin++
}
threshold = Congwin/2
Congwin = 1
realiza slowstart

1: TCP Reno pula a fase slowstart (recuperaçaõ rápida)


após três ACKs duplicados
TPC inicia lentamente para não congestionar a
rede
Controle de congestionamento

Um exemplo de algoritmo de controle de congestionamento da Internet.


AIMD
TCP congestion
TCP Eqüidade
avoidance: Objetivo: se N sessões TCP devem
passar pelo mesmo gargalo,
• AIMD: aumento cada uma deve obter 1/N da
aditivo, redução capacidade do enlace
multiplicativa
– aumenta a janela de 1 a
cada RTT conexão TCP 1
– diminui a janela por um
fator de 2 em caso de
evento perda

roteador com
gargalo de capacidade R
conexão TCP 2
Porque o TCP é justo?

Duas sessões competindo pela banda:


• O aumento aditivo fornece uma inclinação de 1, quando a vazão aumenta
• redução multiplicativa diminui a vazão proporcionalmente

R divisão igual da banda


Vazão da Conexão 1

perda: reduz janela por um fato de 2


congestion avoidance: aumento aditivo
perda: reduz janela por um fator de 2
congestion avoidance: aumento aditivo

Vazão da Conexão 2 R
TCP: modelagem da latência

Q: Quanto tempo demora para receber Notação, hipóteses:


um objeto de um servidor Web após • Assuma um enlace entre o cliente e
enviar um pedido? o servidor com taxa de dados R
• estabelecimento de conexão TCP • Assuma: janela de
• atraso de transferência de dados congestionamento fixa, W
segmentos
• S: MSS (bits)
• O: tamanho do objeto (bits)
• não há retransmissões (sem perdas
e corrupção de dados)
Dois casos a considerar:
• WS/R > RTT + S/R: ACK para o primeiro segmento retorna
antes de se esgotar a janela de transmissão de dados
• WS/R < RTT + S/R: espera pelo depois de esgotar a janela de
transmissão de dados
TCP: modelagem da latência
K:= O/WS

Caso 1: latencia = 2RTT + O/R Caso 2: latencia = 2RTT + O/R


+ (K-1)[S/R + RTT - WS/R]
TCP Modelagem de Latência: Slow Start
• Agora suponha que a janela cresce de acordo com os procedimentos
da fase slow start.
• Vamos mostrar que a latência de um objeto de tamanho O é:
O  S S
Latency  2 RTT   P  RTT    ( 2 P  1)
R  R R
onde P é o número de vezes que o TCP fica bloqueado no servidor:

P  min{Q , K  1}

- onde Q é o número de vezes que o servidor ficaria bloqueado se


o objeto fosse de tamanho infinito.

- e K é o número de janelas que cobrem o objeto.


TCP Modelagem de Latência: Slow Start (cont.)
inicia
conexão TCP
Exemplo:
pede
O/S = 15 segmentos objeto
primeira janela
= S/R

K = 4 janelas RTT
segunda janela
= 2S/R
Q=2
terceira janela
P = min{K-1,Q} = 2 = 4S/R

Servidor bloqueado P=2 times.


quarta janela
= 8S/R

transmissão
objeto completa
entregue
tempo no
tempo no servidor
cliente
TCP Modelagem de Latência: Slow Start (cont.)
S
 RTT tempo quando o servidor inicia o envio do segmento
R
até quando o servidor recebe reconhecimento

inicia
1 S conexão TCP
2k  tempo para enviar a k-ésima janela
R pede
objeto
primeira janela
 = S/R
S k 1 S  tempo de bloqueio após a
 R  RTT  2  RTT
R  k-ésima janela
segunda janela
= 2S/R

terceira janela
= 4S/R

P
O
latencia   2 RTT  TempoBloqueio p quarta janela
R p 1 = 8S/R
P
O S S
  2 RTT  [  RTT  2k 1 ]
R k 1 R R
transmissão
objeto
O S S completa
  2 RTT  P[ RTT  ]  (2P 1) entregue
R R R tempo no
tempo no
servidor
cliente
UDP
UDP: User Datagram Protocol [RFC 768]
• Protocolo de transporte da
Internet “sem gorduras” Porque existe um UDP?
• serviço “best effort” , segmentos • não há estabelecimento de
UDP podem ser:
conexão (que pode redundar em
– perdidos atrasos)
– entregues fora de ordem • simples: não há estado de conexão
para a aplicação nem no transmissor, nem no receptor
• sem conexão: • cabeçalho de segmento reduzido
– não há apresentação entre o • não há controle de congestionamento:
UDP transmissor e o UDP pode enviar segmentos tão
receptor rápido quanto desejado (e possível)
– cada segmento UDP é
tratado de forma
independente dos outros
Mais sobre UDP
• muito usado por aplicações de
mutimídia contínua (streaming) 32 bits

– tolerantes à perda Tamanho, em


porta origem porta destino
– sensíveis à taxa bytes do segmento tamanho checksum
UDP, incluíndo
• outros usos do UDP cabeçalho

(porque?):
– DNS
– SNMP Dados de Aplicação
(mensagem)
• transferência confiável sobre
UDP: acrescentar confiabilidade na
camada de aplicação
– recuperação de erro
formato do segmento UDP
específica de cada aplicação
UDP checksum
Objetivo: detectar “erros” (ex.,bits trocados) no segmento
transmitido

Transmissor: Receptor:
• trata o conteúdo do segmento • computa o checksum do segmento
como seqüencia de inteiros de 16 recebido
bits • verifica se o checksum calculado é
• checksum: soma (complemento de igual ao valor do campo checksum:
1 da soma) do conteúdo do – NÃO - error detectado
segmento
– SIM - não há erros. Mas, talvez
• transmissor coloca o valor do
checksum no campo de checksum
haja erros apesar disto? Mais
do UDP depois ….
Obrigado pela atenção !

Você também pode gostar