Transmission Control Protocol (TCP)Professor Adjunto do Departamento de Engenharia Informática do ISEP Ao contrário do protocolo UDP, o TCP (RFC 793) representa um grande incremento de qualidade relativamente ao protocolo IP que lhe serve de base. O objectivo do protocolo TCP é fornecer um serviço fiável de comunicação entre aplicações, baseado no conceito de conexão (serviço de transporte). Para todos os efeitos considera-se uma conexão TCP como sendo um canal dedicado de comunicação entre duas aplicações com as seguintes caracteristicas:
Como se trata de um serviço orientado à conexão, antes do envio e recepção de dados é necessário estabelecer a conexão. Para este efeito é necessário que duas aplicações colaborem entre sí, uma aplicação deverá estar disponível para receber a conexão TCP e a outra aplicação deverá enviar o pedido de conexão. O TCP utiliza o serviço não fiável de "datagramas" do nível IP, sendo usado o identificador de protocolo 6. Dada a enorme diferença entre o tipo de serviço usado e o tipo de serviço fornecido a implementação do TCP é bastante mais complexa do que a do UDP. Os dados transmitidos através de uma conexão TCP são inevitavelmente transportados por "datagramas" IP, para evitar um "overhead" exagerado no nível IP, os dados a enviar são acomulados pelo emissor até que se atinjam certas condições (tempo de armazenamento; quantidade de dados, ...) e só depois são colocados num "datagrama" e enviados. As aplicações podem em qualquer altura forçar o envio de todos os dados pendentes. Os dados TCP transportados em "datagramas" são designados por segmentos, o tamanho máximo dos segmentos (MSS - "Maximum Segment Size") depende do MTU, geralmente o valor do MSS é (MTU - 40) de modo a disponibilizar espaço para os cabeçalhos. Para assegurar um serviço fiável o TCP efectua a retransmissão de octetos com erro, se após um período de tempo após a emissão (RTO - "Retransmission TimeOut") o respectivo ACK não é recebido volta a ser enviado. O valor do RTO não é estático, devido à diversidade de situações, os atrasos de transmissão variam fortemente conforme a situação. Como solução o valor do atraso desde a emissão de um octeto até à recepção do respectivo ACK (RTT Round Trip Time) é usado para calcular o valor do RTO: Em cada instante pode ser calculado o RTT com as variações bruscas atenuadas (SRTT - "Smoothed Round Trip Time"): SRTT = ( ALFA * SRTT ) + ( ( 1 - ALFA ) * RTT ) , onde ALFA tem um valor entre 0,8 e 0,9 Com o SRTT calcula-se o RTO: RTO = min( MAX_RTO, max(MIN_RTO, BETA * SRTT)) , onde BETA é um factor de variância do RTT, geralmente entre 1,3 e 2. Os valores MAX_RTO e MIN_RTO representam os valores limite para o RTO, geralmente 1 minuto e 1 segundo respectivamente. Cada octeto transmitido possui um número de sequência de 32 bits, no cabeçalho de cada segmento encontra-se o número de sequência do primeiro octeto desse segmento (número de sequência do segmento), dentro de um segmento os octetos estão na ordem correcta. Estes números de sequência são usados para:
Constitução do cabeçalho de em segmento TCPPorta de Origem (16 bits) Porta de Destino (16 bits) Número de sequência (32 bits) Número de confirmação (32 bits) Offset dos Dados ( 4 bits) Reservado ( 6 bits) Control ( 6 bits) Tamanho da Janela (16 bits) "Checksum" (16 bits) "Urgent Pointer" (16 bits) Opções (24 bits) Enchimento ( 8 bits) As portas de origem e destino são utilizadas para multiplexar vários acessos ao protocolo dentro de uma mesma máquina. O "número de sequência" corresponde ao primeiro octeto de dados. O "número de confirmação" é um ACK do emissor relativamente ao octeto cujo número de sequência é aqui transportado, indica qual o próximo octetos que está disponível para receber. O "Offset de Dados" indica o número de conjuntos de 32 bits que constituem o cabeçalho do segmento. O campo "Reservado" deve conter zeros e poderá ser usado em implementações futuras. O campo "Control" é constituido por 6 flags que permitem controlar diversos aspectos de detalhe da implementação. O "Tamanho da Janela" indica a quantidade de octetos que podem ser enviados (RWIN - "Receive Window"). O "Checksum" permite detectar erros e é aplicado a todo o segmento, incluindo ainda o Pseudo-cabeçalho IP. |