Protocolo TCP: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
Linha 110: Linha 110:
O '''controle de fluxo''' no TCP visa evitar que um emissor não '''afogue''' um receptor, enviando mais dados mais rápido do que ele possa processar.  
O '''controle de fluxo''' no TCP visa evitar que um emissor não '''afogue''' um receptor, enviando mais dados mais rápido do que ele possa processar.  


Quando uma conexão TCP recebe bytes que estão corretos e em sequência ela os armazena em um '''''buffer'' de recepção''' antes de entregá-los a aplicação. Como o processo de aplicação pode não ler estes dados imediatamente, pode ocorrer um estouro da capacidade do ''buffer''. Assim, o mecanismo de '''controle de fluxo''' implementa um tipo de casamento de velocidades entre o emissor e o receptor.
Quando uma conexão TCP recebe bytes que estão corretos e em sequência ela os armazena em um '''''buffer'' de recepção''' para que a aplicação possa processá-los. Entretanto, a aplicação pode não ler estes dados imediatamente, já que é um processo independente. Assim, pode ocorrer um estouro da capacidade do ''buffer''. Desta forma, o mecanismo de '''controle de fluxo''' implementa um tipo de casamento de velocidades entre o emissor e o receptor.


O controle de fluxo é implementado por meio de uma variável, chamada '''janela do receptor''' (''Receive Window''}), que mantém o valor atual da capacidade de armazenamento do '''''buffer'' de recepção'''. Esta janela limita a quantidade de bytes que pode ser enviada antes de esperar por um reconhecimento. O tamanho desta janela é dinâmico, podendo variar durante uma conexão. Como a conexão é ''full-duplex'', cada um dos receptores mantém a informação sobre sua janela de recepção.
O controle de fluxo é implementado por meio de uma variável, chamada '''janela do receptor''' (''Receive Window''}), que mantém o valor atual da capacidade de armazenamento do '''''buffer'' de recepção'''. Esta janela limita a quantidade de bytes que pode ser enviada antes de esperar por um reconhecimento.  
 
A variável '''janela do receptor''' faz parte do cabeçalho TCP, e seu tamanho é dinâmico, podendo variar durante uma conexão. A cada troca de segmentos o receptor informa o tamanho atual da janela.
 
Como a conexão é ''full-duplex'', cada um dos receptores mantém a informação sobre sua janela de recepção.


A figura a seguir o mecanismo de controle de fluxo. Novos dados chegando da camada IP ocupam o espaço livre do buffer. Dados consumidos pela aplicação liberam espaço do buffer.
A figura a seguir o mecanismo de controle de fluxo. Novos dados chegando da camada IP ocupam o espaço livre do buffer. Dados consumidos pela aplicação liberam espaço do buffer.

Edição das 19h28min de 28 de abril de 2015

Protocolo TCP

O protocolo TCP (RFC 793), como o Protocolo UDP, também oferece a multiplexação/demultiplexação de aplicações através das portas e o mecanismo de detecção de erros. A grande diferença é que o TCP é um protocolo orientado a conexão e com transferência garantida, onde os dois processos devem acordar entre eles uma abertura de conexão para que os dados possam ser transferidos. Além destas características, o TCP integra ainda um serviço de controle de fluxo, que assegura que nenhum dos lados da comunicação envie pacotes rápido demais, pois uma aplicação em um lado pode não conseguir processar a informação na velocidade que está recebendo, e um serviço de controle de congestionamento ajuda a prevenir congestionamentos na rede.

Formato do segmento TCP

O cabeçalho do segmento TCP, além dos números de porta origem e destino e Checksum, que também existem no UDP, há outros campos com informações necessárias a implementação do serviço de transferência garantida, controle de fluxo e controle de congestionamento. Veja figura (RFC 793):

   0                   1                   2                   3   
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Source Port          |       Destination Port        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Sequence Number                        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Acknowledgment Number                      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Data |           |U|A|P|R|S|F|                               |
  | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
  |       |           |G|K|H|T|N|N|                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Checksum            |         Urgent Pointer        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                    Options                    |    Padding    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                             data                              |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Os campos fundamentais do segmento TCP são os seguintes:

  • Porta origem e porta destino (Source Port e Destination Port);
  • Número de seqüência e reconhecimento, utilizado para o emissor e receptor implementarem o serviço de transferência garantida (Sequence Number e Acknowledgment Number).
  • Tamanho da janela do receptor, usado para o controle de fluxo, e indica o número de bytes que o receptor é capaz de receber (Window).
  • Seis bits de flags:
    • Ack é usado para indicar que o campo de reconhecimento é válido;
    • Syn, Fin e Rst são usados para o controle de abertura e encerramento de conexão;
    • Psh indica ao receptor que o segmento tem dados prontos para passar a camada superior;
    • Urg indica a presença de dados urgentes no segmento, situados entre o primeiro byte e o byte apontado pelo campo Urgent Pointer (este flag praticamente não é mais utilizado).
  • Tamanho do cabeçalho (Data Offset), especifica o tamanho da cabeçalho em linhas de 32 bits, que pode variar em funções do campo de opções; tipicamente o cabeçalho contém as 5 primeiras linhas, totalizando 20 bytes.
  • O checksum é usado para detecção de erros.
  • O campo de opções (Options) é usado quando o emissor e receptor precisam negociar algum parâmetro, como por exemplo na abertura de conexão para acordar o tamanho máximo de segmento (MSS). O Padding é utilizado para completar o campo opções (se necessário).

Tamanho do segmento TCP

O campo de dados da aplicação (data) do segmento TCP, contém um fragmento ou pedaço dos dados da aplicação, cujo tamanho máximo é chamado de Tamanho Máximo do Segmento ou MSS (Maximum Segment Size), não considerando o cabeçalho.

O valor do MSS é acertado entre o emissor e o receptor na abertura de conexão TCP, utilizando o campo opções do cabeçalho TCP.

Em geral o valor de MSS é escolhido para evitar a fragmentação do datagrama IP na camada inferior. Ou seja:

MSS + headers ≤ MTU

O valor MTU (Maximum Tranfer Unit) é a Unidade Máxima de Transferência da camada enlace. Um valor típico para MTU nas redes locais Ethernet é 1500 Bytes. Considerando que tanto o TCP quanto o IP tenham cabeçalho padrão de 20 Bytes, um valor comum para MSS é 1460 Bytes.

Números de sequência e reconhecimento TCP

Dois campos importantes do segmento TCP são os números de seqüência e reconhecimento, os quais implementam o controle da transferência de dados confiável.

Como vimos, os dados das aplicações são transportados pelos segmentos TCP. Caso as mensagens sejam maiores que o valor de MSS, Tamanho Máximo do Segmento, as mesmas são fragmentadas para poderem ser acomodadas na parte de dados do segmento. Por exemplo, um arquivo GIF de 500.000 bytes trocado pelo HTTP será fragmentado em vários pedaços para ser transmitido pelo TCP. Os números de sequência servem, portanto, para que o lado receptor TCP possa reordenar corretamente os dados recebidos.

Os números de sequência correspondem a quantidade de bytes que o TCP está transmitindo. Por exemplo, suponha que o bloco total de dados que será transmitido tenha 500.000 bytes, que o valor de MSS é de 1.000 bytes. Suponha que o primeiro byte dos dados é numerado como zero. Para transmitir esta quantidade de bytes o TCP formará 500 segmentos. Ao primeiro segmento atribui-se o número de sequência zero, ao segundo 1000, ao terceiro 2000 e assim por diante [1].

O número de reconhecimento que o host A coloca no seu segmento é o número de sequência do próximo byte que o host A espera receber do host B. Por exemplo, suponha que o host A recebeu todos os bytes numerados de 0 a 535 de B e que está prestes a enviar um segmento a B. Neste caso, o host A coloca como número de reconhecimento 536, o que vai indicar a B que o mesmo recebeu todos os bytes até este número [1].

Em outro exemplo, suponha que o host A recebeu todos os bytes numerados de 0 a 535 de B e em seguida recebeu de B um segmento contendo bytes de 900 a 1000. Note que A não recebeu os bytes que vão de 536 a 899. Como A ainda está esperando bytes a partir de 536, ele reenvia a B um segmento com número de reconhecimento 536. Continuando este exemplo, suponha agora que A receba o segmento que faltava, com os bytes que vão de 536 a 899. Neste caso, como ele já recebeu inclusive os dados contendo os bytes de 900 a 1000, ele envia um reconhecimento com número 1001. Isto é chamado de reconhecimento cumulativo, que indica que recebeu todos os bytes até este número [1].

Conexão TCP

Para trocarem segmentos de dados utilizando o TCP o emissor e o receptor devem estabelecer uma conexão TCP através da troca de pacotes de controle entre si. Isto é chamado de procedimento de estabelecimento de conexão (handshaking), onde se estabelecem os parâmetros para a comunicação. Uma vez concluído o handshaking a conexão é dita estabelecida e os dois sistemas terminais podem trocar dados.

O cliente solicita a estabelecimento de conexão em uma porta bem conhecida do servidor (por exemplo, porta 80 de um servidor Web) e informa a porta origem para receber as respostas, além de ajustar outros parâmetros para implementar a transferência garantida.

Estabelecimento de conexão TCP

Na fase de estabelecimento de conexão, são inicializadas as variáveis do protocolo TCP, como os números de sequência inicial e o tamanho de buffers. O processo cliente é o que inicia o estabelecimento da conexão, sendo o servidor contatado pelo cliente.

O estabelecimento da conexão se dá em três passos, conforme mostrado na figura [2]:

  1. O lado cliente do TCP envia um segmento de sincronização, chamado SYN (com o flag Syn setado em 1), ao lado servidor do TCP, especificando um número de sequência inicial escolhido aleatóriamente (Seq=X).
  2. O servidor recebe o SYN, aloca buffers e inicializa variáveis, e envia uma mensagem de reconhecimento da conexão, chamada SYNACK (com o flags Syn e Ack setados em 1), onde reconhece o pedido de conexão e especifica seu número de sequência inicial (Seq=Y, Ack=X+1).
  3. Uma vez recebido o reconhecimento da conexão pelo servidor, o cliente confirma a conexão com um segmento chamado ACK (flag Syn agora em 0 e flag Ack setado em 1 indicando um reconhecimento válido) e também aloca buffers e inicializa variáveis da conexão (Seq=X+1, Ack=Y+1).

Recusa de conexão

No caso de uma recusa de conexão, por exemplo quando um cliente solicita uma conexão numa porta inativa, o servidor contatado envia um segmento de controle chamado RST (reset) (com o flag Rst setado em 1), conforme ilustra a figura [2]:

Encerramento de conexão

Para o enceramento da conexão quatro segmentos são trocados. Quem inicia a desconexão envia de um segmento especial, chamado FIN (com flag Fin setado em 1). Quem recebe o segmento, primeiro reconhece a solicitação de fim da conexão e depois envia ele também um segmento FIN (Estas duas mensagens podem estar concatenadas em uma única mensagem FIN-ACK). O encerramento definitivo da conexão se dá quando o que iniciou a desconexão recebe e reconhece o segundo segmento FIN, conforme ilustra a figura [2].

Flag Psh

O TCP é visto pela camada aplicação como uma simples porta (socket) por onde as informações são enviadas ou recebidas.

A medida que a aplicação emissora passa dados ao TCP os mesmos vão sendo alocados em um buffer de envio. O TCP, por sua vez, vai processando as informações presentes no buffer, procurando montar os segmentos para envio de acordo com o valor do MSS.

No lado do receptor, a medida que os segmentos vão chegando, são alocados em um buffer de recepção e ficam disponíveis para processamento pela aplicação remota.

No caso de aplicações interativas, que exigem resposta imediata do lado do receptor, a aplicação que envia deve informar ao TCP para entregar imediatamente os dados para aplicação receptora. Isto é realizado através do flag Psh. [3].

Exemplo de uso do flag Psh
Quando um cliente HTTP solicita uma página Web através do comando GET a solicitação deve ser imediatamente passada ao servidor Web. Assim o TCP monta o segmento com a solicitação e o flag Psh setado. Da mesma forma, quando o servidor HTTP envia a página Web solicitada pelo cliente, o segmento com os últimos bytes da solicitação vem com o flag Psh setado.

Controle de Fluxo TCP

O controle de fluxo no TCP visa evitar que um emissor não afogue um receptor, enviando mais dados mais rápido do que ele possa processar.

Quando uma conexão TCP recebe bytes que estão corretos e em sequência ela os armazena em um buffer de recepção para que a aplicação possa processá-los. Entretanto, a aplicação pode não ler estes dados imediatamente, já que é um processo independente. Assim, pode ocorrer um estouro da capacidade do buffer. Desta forma, o mecanismo de controle de fluxo implementa um tipo de casamento de velocidades entre o emissor e o receptor.

O controle de fluxo é implementado por meio de uma variável, chamada janela do receptor (Receive Window}), que mantém o valor atual da capacidade de armazenamento do buffer de recepção. Esta janela limita a quantidade de bytes que pode ser enviada antes de esperar por um reconhecimento.

A variável janela do receptor faz parte do cabeçalho TCP, e seu tamanho é dinâmico, podendo variar durante uma conexão. A cada troca de segmentos o receptor informa o tamanho atual da janela.

Como a conexão é full-duplex, cada um dos receptores mantém a informação sobre sua janela de recepção.

A figura a seguir o mecanismo de controle de fluxo. Novos dados chegando da camada IP ocupam o espaço livre do buffer. Dados consumidos pela aplicação liberam espaço do buffer.

Referências

  1. 1,0 1,1 1,2 KUROSE, J.F; ROSS K. W. Redes de Computadores e a Internet: Uma abordagem top-down, São Paulo: Pearson, 2010.
  2. 2,0 2,1 2,2 STEVENS, W. S.; FENNER, B.;RUDOFF, A. M. Programação de Rede UNIX. Porto Alegre: Bookman, 2005.
  3. STRETCH, J. TCP Flags: PSH and URG: http://packetlife.net/blog/2011/mar/2/tcp-flags-psh-and-urg/

--Evandro.cantu (discussão) 17h12min de 20 de março de 2015 (BRT)