# Introdução às Redes de Computadores/Protocolo TCP

Transporte orientado para conexão: TCP, protocolo de transporte confiável da camada de transporte, orientado para conexão, da Internet.
O TCP (Transmission Control Protocol - Protocolo de Controle de Transmissão) é um dos protocolos, sob os quais assenta o núcleo da Internet nos dias de hoje. A versatilidade e robustez deste protocolo tornou-o adequado para redes globais, já que este verifica se os dados são enviados de forma correta, na sequência apropriada e sem erros, pela rede.

## A conexão TCP

TCP(Transmission Control Protocol) é um protocolo da camada de transporte, orientado a conexão. Ele é responsável pela divisão da mensagem em datagramas, reagrupamento e retransmissão no caso de datagramas perdidos.
Dentre suas principais vantagens, podemos destacar a segurança quanto à reposição de pacotes perdidos e ordenação desses pacotes.

## Estrutura do segmento TCP

O segmento TCP é dividido em partes. Didaticamente é representado pelo bloco abaixo ilustrado, porém na prática é enviado sequencialmente. Cada linha da tabela é um bloco de 32 bits, sendo que o bit inicial é de número 0.
O protocolo TCP permite que seu cabeçalho tenha tamanho variável, conforme as necessidades das estações comunicantes e especifidades do enlace. A estrutura básica possui valores bem definidos, como as portas de origem (16 bits) e de destino (16 bits).
Partes importantes no TCP são o número de seqüência (32 bits) e o número de reconhecimento (32 bits), pois estes campos garantem a confiabilidade da transferência.Há também outros campos, como comprimento do cabeçalho (4 bits), que indica qual tamanho do cabeçalho em palavras de 32 bit, as flags (6 bits), que podem ser de 6 tipos:
* URG – urgência
* ACK – número ack válido
* PSH – push (envio imediato de dados)
* RST – reset (reinício da conexão)
* SYN – sync (estabelecimento de conexão)
* FIN – finalizar conexão
Há também a janela de recepção (16 bits) que indica o tamanho da janela para controle de fluxo (figura acima), o checksum (16 bits) que verifica a integridade dos dados de todo o pacote, como um hash; o ponteiro para dados urgentes (16 bits) que indica que determinado dado deve ser entregue no mesmo instante, as opções (quantidade variável de bits), que podem alocar mais banda do enlace para a transmissão dentre outras possibilidades, e os dados, cuja quantidade é definida no MSS.
A conexão TCP, por ser confiável, exige o estabelecimento de uma conexão, embora não seja necessário alocar exclusividade de enlace (circuito dedicado). É necessário existir um cliente e um servidor, porém como é um protocolo full-duplex, um terminal pode ser simultaneamente servidor e cliente.
A confiabilidade da transmissão se deve ao número de seqüência e ao número de reconhecimento. O primeiro indica qual é o primeiro byte do segmento de daos, e o segundo indica o primeiro byte do próximo segmento de dados. Isso permite que os dados sejam agrupados corretamente, mesmo que pacotes tenham sofrido atrasos na transmissão.
O número de sequência é escolhido aleatoriamente no servidor e no cliente, e são independentes entre si, ou seja, não é exigência que o número de sequência do servidor seja o mesmo do cliente. Mas então como é feita a comunicação?
Para isto é utilizada a flag ACK. Esta flag faz a sincronização dos números de sequência, como mostrado na figura a seguir.

## Estimativa do tempo de viagem de ida e volta e de esgotamento de temporização

O TCP utiliza um mecanismo de controle de temporização/retransmissão para recuperar segmentos perdidos. Em um protocolo real como o TCP, surgem problemas de implementação de um mecanismo de controle de temporização/retransmissão como por exemplo, estimar o tempo de viagem de ida e volta da conexão - RTT (a duração dos intervalos de controle deve ser maior do que o RTT, evitando o envio de retransmissões desnecessárias).

### Estimativa do tempo de viagem de ida e volta - RTT

O RTT para um segmento, denominado RTTamostra, é a quantidade de tempo transcorrido entre o momento em que o segmento é enviado (isto é, passado ao IP) e o momento em que é recebido um reconhecimento para o segmento. Ao invés de medir um RTTamostra para cada segmento transmitido, a maioria das implementações de TCP executa apenas uma medição de RTTamostra por vez. Isto é, em qualquer instante, o RTTamostra estará sendo estimado para apenas um dos segmentos transmitidos mas ainda não reconhecidos, o que resulta em um novo valor de RTTamostra para aproximadamente cada RTT. E mais, o TCP nunca computa um RTTamostra para um segmento que foi retransmitido; apenas mede-o para segmentos que foram transmitidos uma vez.
Os valores de RTTamostra sofrerão variação de segmento para segmento devido a congestionamento nos roteadores e a variações de carga nos sistemas finais. Por causa dessa variação, qualquer dado valor de RTTamostra pode ser atípico. Portanto, para estimar um RTT típico, é natural tomar alguma espécie de média dos valores de RTTamostra. O TCP mantém uma média, denominada RTTestimado, dos valores de RTTamostra. Ao obter um novo RTTamostra, o TCP atualiza RTTestimado de acordo com a seguinte fórmula:
RTTestimado = (1 - a) * RTTestimado + a * RTTamostra
Esta fórmula está escrita sob a forma de um comando de linguagem de programação. O valor recomendado de a é a = 0,125 (isto é, 1/8) [RFC 2988], caso em que essa fórmula de torna:
RTTestimado = 0,875 * RTTestimado + 0,125 * RTTamostra
Onde RTTestimado é uma média ponderada dos valores de RTTamostra. Essa média ponderada atribui um peso maior às amostras recentes do que às amostras antigas.
Observação: O valor de "a" determina o peso das amostras mais recentes no cálculo da média, por exemplo, se "a" vale 0,125, a última amostra analisada terá peso de 12,5% no valor de RTTestimado.
Além de ter uma estimativa do RTT, também é valioso ter uma medida de sua variabilidade. O [RFC 2988] define a variação do RTT, RTTdesvio, como uma estimativa do desvio típico entre RTTamostra e RTTestimado:
RTTdesvio = (1 - b) * RTTdesvio + b * | RTTamostra - RTTestimado |
Onde RTTdesvio é uma MMEP (Média Móvel Exponencial Pura) da diferença entre RTTamostra e RTTestimado. Se os valores de RTTamostra apresentarem pouca variação, então RTTdesvio será pequeno; por outro lado, se houver muita variação, RTTdesvio será grande. O valor recomendado para b é 0,25.

### Estabelecimento e gerenciamento da temporização de retransmissão

Considerando-se dispor dos valores RTTestimado, RTTamostra e RTTdesvio, pode-se estabelecer um valor para a temporização de retransmissão do TCP (IntervaloTimeOut). Este valor deve ser maior ou igual a RTTestimado, caso contrário seriam enviadas retransmissões desnecessárias, porém não deve ser muito maior pois se houver perda de algum segmento, o TCP não o retransmitiria rapidamente, o que resultaria em grandes atrasos de transferência de dados. Dessa forma, é desejável que o valor estabelecido para a temporização seja igual a RTTestimado mais uma certa margem, que deverá ser grande quando houver muita variação nos valores de RTTamostra e pequena quando houver pouca variação. Assim, o valor de RTTdesvio deve ser considerado:
IntervaloTimeOut = RTTestimado + (4 * RTTdesvio)

## Transferência confiável de dados

Usa reconhecimentos positivos, temporizadores,números de seqüência e paralelismo
Ignora os ACKs duplicados
Ignora controle de fluxo e de congestionamento
RFC 2581: Três ACKs duplicados ® retransmite o segmento que Falta
Reconhecimento cumulativo evita a retransmissão do primeiro segmento

## Gerenciamento da conexão TCP

A maior parte dos ataques à Web, atualmente, exploram vulnerabilidades apresentadas no gerenciamento das conexões TCP. Além disso, importante observar, que o estabelecimento da conexão TCP interfere, significativamente, nos atrasos percebidos em nossa navegação. Portanto, saber como as conexões TCP são estabelecidas e finalizadas, possibilitando gerenciá-las, é bastante importante para garantia da confiabilidade inerente ao protocolo TCP.
Para envio de pacotes entre hospedeiros, via TCP, é necessário, previamente, o estabelecimento de uma conexão entre cliente e servidor. Para tanto, são necessárias três etapas, comumente chamada de apresentação de 3 vias (3 way handshake), conforme detalhado abaixo.
Pode acontecer, entretanto, situações em que o segmento TCP SYN recebido pelo hospedeiro apresenta número de porta e/ou IP incompatíveis com as portas nele existentes. Neste caso, não há o reconhecimento do segmento TCP SYN e, então, o hospedeiro (servidor) retorna ao cliente um segmento contendo um bit de sinalização RST, ativado em 1, para reenvio/reinicialização da conexão.
Se essas três etapas forem bem sucedidas, os dados podem ser enviados entre um cliente e um servidor em hospedeiros diferentes. Quando não se deseja continuar enviando pacotes, a conexão TCP pode ser finalizada pelo cliente ou pelo servidor.
O encerramento acontece em 4 passos. Em suma, inicialmente o cliente envia, ao servidor, um segmento TCP FIN, com um bit de flag FIN ajustado em 1, requisitando a finalização da conexão. O servidor recebe e envia, ao cliente, um ACK de reconhecimento (etapa 2). Posteriormente, o servidor envia um segmento FIN, também ativado em 1, ao cliente. Quando o cliente o recebe, responde com um ACK de reconhecimento e, então, a conexão é encerrada e os recursos (buffers e variáveis) alocados para a conexão TCP são liberados.
Encerramento da conexão TCP