Transmission Control Protocol (TCP)

André Moreira (andre@dei.isep.ipp.pt)
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:

  • Os dados são enviados e recebidos em fluxo ("stream"), não existindo o conceito de mensagem ou "datagrama".
  • Os eventuais erros de transmissão são corrigidos de forma transparente para as aplicações.
  • É implementado controlo de fluxo baseado no protocolo da "janela deslizante".
  • Os dados chegam ao destino na mesma ordem em que forma emitidos.
  • Tal como acontecia para o UDP, são definidos números de porta para multiplexar o acesso ao TCP por várias aplicações residentes na mesma máquina.
  • Uma conexão é uma ligação privada entre duas aplicações. Uma conexão entre duas aplicações A e B é identificada pelo conjunto (IP A; Porta A; IP B; Porta B). É possivel ter várias conexões sobre uma mesma porta de uma dada máquina. Em cada máquina a conexão é identificada pelo conjunto (Porta Local; Porta Remota; IP Remoto).

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:

  • Garantir a manutenção da ordem do fluxo de dados (os segmentos podem chegar ao destino em ordem diferente da de emissão)
  • Implementação do controlo de fluxo: juntamente com um segmento é enviado o ACK do próximo octeto esperado ("piggybacking") e o tamanho da janela de recepção.
  • Implementação do controlo de erros: o número de sequência são usados para confirmar a recepção dos segmentos, sempre que se atinge o valor RTO o segmento é retransmitido.

Constitução do cabeçalho de em segmento TCP

	Porta 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.