TCP Protocolo de controle de transmissão (Transmission Control Protocol) Definido em diversas RFCs (793, 1122, 1323, 2018 e 2581) Diversos flavors (tipos) Serviços Multiplexação/demultiplexação Detecção de erros Transferência de dados confiável Controle de fluxo Orientado a conexão Controle de congestionamento
TCP - multiplexação/demultiplexação Socket TCP é identificado por Endereço IP de fonte Número de porta de fonte Endereço IP de destino Número de porta de destino
Multiplexação/demultiplexação no TCP (fonte: Kurose) P1 P4 P5 P6 P2 P1P3 SP: 5775 DP: 80 S-IP: B D-IP:C SP: 9157 SP: 9157 cliente IP: A DP: 80 S-IP: A D-IP:C servidor IP: C DP: 80 S-IP: B D-IP:C cliente IP:B
TCP - detecção de erros Análoga ao UDP Pseudocabeçalho do TCP (fonte: Tanenbaum)
TCP - envio de dados Uso de buffers alocados no estabelecimento de conexão TCP deve enviar dados no buffer segundo a sua conveniência Dados gerados e recebidos pela aplicação são vistos como uma sequência de octetos e não como uma sequência de pacotes
TCP - envio de dados Buffers do TCP (fonte: Kurose)
TCP - envio de dados Tamanho máximo do segmento (Maximum Segment Size - MSS) Quantidade máxima de dados da camada de aplicação no segmento Máximo de 64kB menos os cabeçalhos TCP e IP TCP faz a divisão em partes do fluxo de dados do usuário Normalmente estabelecido em função da unidade máxima de transmissão (Maximum Transmission Unit MTU) do hospedeiro fonte local RFC 1191 descobre a MTU do caminho da fonte ao destino Valores comuns de MSS: 1460, 536 e 512 octetos
TCP - envio de dados Aplicações interativas normalmente transmitem segmentos menores Ex.: Telnet
TCP - formato do segmento Formato do segmento TCP (fonte: Kurose)
TCP - formato do segmento Porta de origem (16 bits) Porta de destino (16 bits) Número de sequência (32 bits) Usado na implementação do serviço confiável Número do primeiro octeto do segmento (parte de dados) Segmento com flags SYN, ACK ou FIN isolados conta um octeto Inicialmente é escolhido aleatoriamente Para minimizar a possibilidade de ser reutilizado em uma nova conexão com mesmos números de porta e endereços IPs
TCP - formato do segmento Número de reconhecimento (32 bits) Usado na implementação do serviço confiável Número de sequência do próximo octeto que está aguardando do outro hospedeiro Reconhecimentos cumulativos Tratamento de segmentos fora de ordem depende da implementação Mais comum é guardar o segmento
TCP - formato do segmento Exemplo de Seq e ACK para o Telnet (fonte: Kurose)
TCP - formato do segmento Comprimento do cabeçalho (4 bits) Comprimento em palavras de 32 bits Variável em função do campo opções Flags (6 bits) URG - segmento contém dados urgentes Marcado pela camada aplicação do remetente Ex.: Usado por Telnet quando o usuário digita uma tecla de interrupção ACK - segmento contém ou não ACK PSH - destinatário deve passar os dados para a camada aplicação imediatamente RST - usado no estabelecimento de conexão SYN - usado no estabelecimento de conexão FIN - usado no fechamento de conexão
TCP - formato do segmento Janela de recepção (16 bits) Usada no controle de fluxo Número de octetos que o receptor está pronto para aceitar Soma de verificação (16 bits) Ponteiro para dados urgentes (16 bits) Usado com URG Indica o fim dos dados urgentes Aplicação determina o início
TCP - formato do segmento Opções Negociação de MSS Fator de aumento de escala da janela de recepção para redes de alta velocidade Window scale (RFC 1323): deslocamento da janela de recepção (Window size) até 14 bits para a esquerda Outras Dados
TCP - temporização TCP usa temporização para recuperar segmentos perdidos Gerenciamento de temporizadores por conexão Utiliza uma estimativa do tempo de ida e volta (Round Trip Time - RTT) SampleRTT RTT para um determinado segmento Muitas implementações medem para um segmento por vez (por RTT) Não calculado para retransmissões Pode ter valores atípicos em função de variações de congestionamento e carga
TCP - temporização EstimatedRTT Média móvel exponencial ponderada dos SampleRTT Peso de um SampleRTT diminui exponencialmente EstimatedRTT = (1-α)*EstimatedRTT + α*samplertt α = 0,125 (RFC 2988)
TCP - temporização Amostras de RTTs e RTTs estimados (fonte: Kurose)
TCP - temporização DevRTT Variação do RTT (RFC 2988) DevRTT = (1-β)*DevRTT + β* SampleRTT-EstimatedRTT Tipicamente β = 0,25 Estouro de temporizador TimeoutInterval = EstimatedRTT + 4*DevRTT RTT estimado mais uma margem de segurança Quanto maior a variação nos valores de SampleRTT, maior a margem
TCP - transferência confiável Sobre o serviço de melhor esforço do IP (Internet Protocol) Usa reconhecimentos positivos, temporizadores, números de sequência e paralelismo Pode usar um NACK implícito (retransmissão rápida) Pode usar um único temporizador de retransmissão (RFC 2988) Paralelismo relacionado ao controle de fluxo e ao controle de congestionamento Duas fases são apresentadas com aumento da complexidade Recuperação de perdas de segmentos Retransmissão rápida
TCP - transferência confiável Inicialmente o protocolo só trata da recuperação das perdas de segmentos Ignora os ACKs duplicados Ignora controle de fluxo e de congestionamento Eventos Dados recebidos da aplicação Temporizador único associado com o mais antigo segmento não reconhecido Estouro do temporizador Retransmite o segmento e reinicia o temporizador Recebimento de ACK y SendBase número de sequência do mais antigo octeto não reconhecido y > SendBase reconhece um ou mais octetos
Remetente TCP simplificado (fonte: Kurose) NextSeqNum = InitialSeqNum SendBase = InitialSeqNum loop (forever) { switch(event) event: dado recebido da aplicação acima cria segmento TCP com n o de sequência NextSeqNum if (timer currently not running) start timer pass segment to IP NextSeqNum = NextSeqNum + length(data) event: tempo de confirmação do temporizador retransmit not-yet-acknowledged segment with smallest sequence number start timer event: ACK recebido, com valor do campo de ACK do y if (y > SendBase) { SendBase = y if (there are currently not-yet-acknowledged segments) start timer } } /* end of loop forever */
Retransmissão devido a um ACK perdido (fonte: Kurose)
Segmento 100 não retransmitido (fonte: Kurose)
Reconhecimento cumulativo evita a retransmissão do primeiro segmento (fonte: Kurose)
TCP - transferência confiável Retransmissão Tempo de expiração é dobrado em relação ao tempo anterior Forma simples de controle de congestionamento
TCP - transferência confiável Segunda fase Retransmissão rápida Associada a ACKs duplicados
Geração de ACKs do TCP RFCs 1122 e 2581 (fonte: Kurose) Evento no receptor Segmento chega em ordem, não há lacunas, segmentos anteriores já aceitos Segmento chega em ordem, não há lacunas, um ACK atrasado pendente Segmento chega fora de ordem, número de sequência chegou maior: gap detectado Chegada de segmento que parcial ou completamente preenche o gap Ação do receptor TCP ACK retardado. Espera até 500 ms pelo próximo segmento. Se não chegar, envia ACK Imediatamente envia um ACK cumulativo Envia ACK duplicado, indicando número de sequência do próximo byte esperado Reconhece imediatamente se o segmento começa na borda inferior do gap
TCP - transferência confiável Retransmissão rápida (cont.) RFC 2581 Três ACKs duplicados retransmite o segmento que falta Modificação no remetente TCP simplificado
Mudança no remetente TCP (fonte: Kurose) 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 }
Retransmissão rápida (fonte: Kurose) Hosp. A Hosp. B ACKs duplicados três vezes seq # x1 seq # x2 seq # x3 seq # x4 seq # x5 X ACK x1 ACK x1 ACK x1 ACK x1 timeout tempo
TCP - transferência confiável Parecido com o Go-Back-N, porém Geralmente armazena segmentos fora de ordem Evita algumas retransmissões dependendo do estouro dos temporizadores Ver exemplo do Kurose na pag. 188
TCP - transferência confiável Reconhecimento seletivo RFC 2018 Destinatário pode reconhecer seletivamente segmentos fora de ordem Parecido com o protocolo Seletive Repeat
TCP - controle de fluxo Elimina a possibilidade de o remetente saturar o destinatário Apresentação supõe que segmentos fora de ordem são descartados Baseado em janelas Remetente mantém uma variável chamada janela de recepção (RcvWindow)
TCP - controle de fluxo Janela e buffer de recepção (fonte: Kurose)
TCP - controle de fluxo Destinatário mantém as variáveis LastByteRead LastByteRcvd LastByteRcvd LastByteRead RcvBuffer Para não saturar o buffer RcvWindow = RcvBuffer [LastByteRcvd LastByteRead]
TCP - controle de fluxo Remetente mantém as variáveis LastByteSent LastByteAcked Remetente precisa ter uma ideia do buffer do destinatário Destinatário envia quanto há de espaço no buffer colocando RcvWindow no campo janela de recepção de cada segmento LastByteSent LastByteAcked RcvWindow Para não saturar o buffer do destinatário
TCP - controle de fluxo Problema quando RcvWindow = 0 e o destinatário não tem nada a enviar Solução Remetente deve enviar segmento de um octeto de dados quando a janela for zero