Link

http://tools.ietf.org/html/rfc793

Introdução

  • O TCP é um protocolo host-to-host altamente confiável.
  • Comunicação inter-processos, orientado a conexão, com suporte a muitas aplicações, e já assume a simplicidade do protocolo da camada abaixo (IP).
  • A interface TCP consiste de um conjunto de chamadas, como em um SO, como exemplo para abrir e fechar conexões. A comunicação com a aplicação pode ser assíncrona.
  • A Operação do TCP está nas seguintes áreas:
    • Transferência básica de dados
      • O TCP é capaz de tranferir dados em um fluxo em cada direção. Uma função "push" garante que esses dados são passados adiante no receptor.
    • Confiabilidade
      • O TCP é capaz de "recuperar" dados comprometidos, perdidos, duplicados ou entregues fora de ordem. Mensagens como o "ACK" são usadas para confirmação de recepção ccorreta.
    • Controle de fluxo
      • O TCP permite um controle da quantidade de dados transmitidos, através de uma janela e da quantidade de ACKs.
    • Multiplexação
      • A partir do IP mais a porta é formado um socket, que permite conexões múltiplas. Existem sockets fixos para certas aplicações.
    • Conexão
      • Os mecanismos descritos anteriormente exigem a inicialização e manutenção dos fluxos de dados, daí vem a conexão, feita por um mecanismo de "handshake", baseado em números de sequência baseados no clock.
    • Precedência e segurança
      • Podem ser indicados precedência e segurança da comunicação pelos usuários.

Filosofia

  • Os ambientes de rede podem ser locais, ou de grande abrangência, mas assumem uma tecnologia de comutação de pacotes. Toda esta estrutura é para a comunicação entre processos de hosts (através das portas), daí a importância do TCP.
  • O TCP recebe uma chamada de um processo com um buffer de dados como argumento. Na recepção ele notifica o usuário e passa esses dados para a aplicação de destino.
  • Fragmentação e remontagem é responsabilidade do módulo da internet (camada de rede - IP). O segmento (TCP) é retirado da parte dos dados do datagrama (IP).
  • O TCP é como um módulo do SO, controlado por um driver.
  • A interface tem chamadas como: SEND, RECEIVE, OPEN, CLOSE, STATUS. Essas chamadas podem ter parâmetros como: tipo de serviço, endereço, precedência, segurança, etc.

Transferência

  • A transferência confiável é baseada em números de sequência e ACKs, sendo que se um segmento com um certo número de sequência não receber o ACK correspondente ele é retransmitido, se não, deletado da fila. A janela citada anteriormente possui um número, que designa a quantidade de segmentos enviados sem receber ACK.
  • Para uma identificação TCP ser única, deve-se acoplar o IP (endereço+porta -> socket).
  • Dois sockets definem uma conexão, full-duplex (nos dois sentidos)
  • Existe uma estrutura, a TCB (Transmission Control Block), para guardar as informações das conexões.

Chamadas de funções

  • Chamadas passivas da função OPEN, acontecem quando existe uma solicitação de conexão "estrangeira". Neste caso um socket estrangeiro de zeros é utilizado para denotar um socket não especificado.
  • Dois processos que requisitam OPEN ao mesmo tempo, obtém sucesso pela forma assícrona.
  • Para estabelecer a conexão existe a mensagem SYN (tree-way handshake), para fechar a conexão existe a flag FIN.
  • Para enviar, usa-se a chamada SEND, e quando um receptor vê a flag PUSH, ele não espera mais dados e passa os recebidos para a camada superior. Se o buffer estiver cheio e não for visto o PUSH os dados são passados para o usuário.

Segurança e Robustez

  • O TCP não define uma atitude na presença de dados urgentes por parte do usuário, mas a noção geral é que o processo receptor toma a a ação de processar dados urgentes primeiro.
  • O TCP pode usar o tipo de serviço e opções do IP para tratar segurança, mas nem todos os módulos tem essa capacidade multicamada. Alguns módulos permitem a aplicações, como Telnet, especificar certos níveis de segurança, precedência, conexão...
  • O TCP tem um princípio enquanto à robustez: Ser liberal no que aceita e conservador no que faz.

Especificação Funcional

  • O TCP fornece a informação do campom "protocolo" do IP.
  • Segue o cabeçalho:

  • Porta fonte e destino (16 bits)
  • Número de Sequência (32 bits): número do primeiro byte do segmento, quando tem SYN, é o número inicial da sequência (ISN) e o primeiro byte está em ISN+1.
  • Número de reconhecimento (32 bits): se o bit ACK está setado, este é o valor do próximo número de sequência esperado.
  • Comprimento do cabeçalho (Data offset - 4 bits)
  • Não utilizado (6 bits)
  • Bits de Controle (6 bits)
    • URG: ponteiro de urgência
    • ACK
    • PSH: ponteiro do PUSH
    • RST: resetar conexão
    • SYN: sincronização dos números de sequência
    • FIN: fim da transmissão
  • Window (16 bits): número de bytes, quando ACK está setado, que o destinatário ainda pode receber.
  • Checksum (16 bits): complemento de 1 da soma de todas as palavras de 16 bits. Ele abrange um pseudo cabeçalho de 96 bits (endereços de fonte e destino, o protocolo e o TCP Length(tamanho do cabeçalho TCP mais os dados - em octetos, sem contar o pseudo cabeçalho).
Pseudo Cabeçalho do TCP
  • Ponteiro para urgência (16 bits): Indica a localização para dados urgentes (flag URG ativada).
  • Opções (variável): múltiplos de 8 bits, são incluídas no checksum. São 2 casos:
    • Um único byte para o tipo de opção.
    • Um byte para o tipo, um para o tamanho e um para os dados.
      • 00000000: fim da lista de opções
      • 00000001: usado entre opções.
      • [00000010][00000100][max seg size] - usado para determinar o maior tamanho do segmento, são 16 bits.

Terminologia

  • As variáveis necessárias são armazenadas no TCB:
    • SND.___: enviando algo
    • ISS: Inicial Sequence Number
    • RCV.___: recebendo algo
    • SEG.___: informações sobre o segmento (tamanho, janela, número,...)
  • Alguns estados durante a conexão:
    • LISTEN: espera por uma conexão.
    • SYN-SENT: esperando confirmação
    • SYN-RECEIVED
    • ESTABLISHED
    • FIN-WAIT-1: espera por um fim de conexão, ou pelo ACK como resposta por um fim (TCP remoto)
    • FIN-WAIT-2: espera apenas pelo fim de conexão (TCP remoto).
    • CLOSE-WAIT: espera por uma requisição de fim de conexão do usuário local.
    • CLOSING: esperando pelo ACK de resposta por um fim.
    • LAST-ACK: ACK de fim enviado ao TCP remoto.
    • TIME-WAIT: Representa o tempo de espera até que se tenha certeza de que o TCP remoto recebeu o ACK de fim.
    • CLOSED

Números de Sequência

  • São armazenados para serem consecutivos.
  • São limitados pelos 32 bits, ou seja 2^32 - 1.
  • Um segmento recebido deve ter um número de sequência esperado.
  • SEG.SEQ + SEG.LEN - 1 = último número de sequência de um segmento.
  • SND.UNA < SEG.ACK <= SND.NXT, o UNA é o último que não recebeu ACK.
  • RCV.NXT =< SEG.SEQ < RCV.NXT + RCV.WND
  • Quando a janela de recepção é zero, só recebe ACKs.
  • O ISN (primeiro número de sequência) é gerado de acordo com um relógio, e a cada 4 microsegundos incrementa em 1, isso quer dizer que para fechar o ciclo são 4.55 horas.
  • Para sincronizar a conexão tem-se o three way handshake.
    • A --> B (SYN)
    • A <-- B (ACK,SYN)
    • A --> B (ACK)
  • O TCP espera um MSL(maximum segment lifetime), que segundo a RFC eram 2 minutos, para abrir uma conexão igual (com os mesmos sockets), desde que não seja reiniciado.
  • Quando um host dá um "crash", ele pode esperar esse MSL pra não correr o risco de problemas com uma conexão repetida.

Estabelecimento da Conexão

  • Handshake normal

  • Handshake Sincronizado

  • O TCP é capaz de se recuperar de uma duplicata resetando a conexão.
  • É possível uma conexão aberta pela metade, quando um dos lados encerra a conexão e o outro não fica sabendo. Os métodos para sair das anomalias podem ser visualizados abaixo.
    • Caso 1: Descoberta de conexão aberta pela metade

    • Caso 2: Lado ativo causa a descoberta

    • Caso 3: SYN antigo duplicado causa um reset

- pag 36 -