Link

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

Introdução

  • IP foi projetado para interconectar computadores em redes com sistemas de comutação de pacotes.
  • Prevê a transmissão de datagramas de fontes para o destino.
  • Também provê fragmentação e remontagem de datagramas se necessário.
  • Limitado para prover funções de entrega de um pacote de bits (end-to-end), não há mecanismos de controle (entrega confiável, sequenciamento, controle de fluxo)
  • É chamado de host-to-host (Camada de Rede), e usa de protocolos de nível mais baixo para carregar o datagrama nas redes locais.

Operação

  • São basicamente duas funções: endereçamento e fragmentação.
  • A seleção de um caminho para uma transmissão: roteamento.
  • São usados campos do cabeçalho para a fragmentação.
  • O IP trata cada datagrama como uma entidade independente.
  • O serviço é oferecido um quatro mecanismos chaves: ToS (Type of Service), Options, Checksum e TTL(Time to Live).
  • O ToS influencia no QoS, na escolha de parâmentros de tranmissão, a rede a ser utilizada no próximo hop(salto)...
  • O TTL indica o número de saltos que podem ser feitos pelo datagrama até sua "auto-destruição".
  • O "Options" provê funções pouco usadas de segurança, roteamento especial, timestamp (eventos identificados por sequência de caracteres geralmente indicando a hora ou a data)
  • o Checksum é usado para verificar se não houve erro no datagrama. Os erros detectados são reportados por uma mensagem ICMP.
  • Não há controle de erro, retransmissões ou controle de fluxo.

Overview

  • Protocolo da camada de rede, faz a interface entre o transporte e a "rede local".

Exemplo de operação

  • O módulo internet pega dados fornecidos por uma aplicação e adiciona um cabeçalho (datagrama) com alguns parâmetros, como destino e fonte (endereço local).
  • Após enviado para a rede local, a interface de rede adiciona um novo cabeçalho, reenviando para uma próxima rede local.
  • Uma nova interface de rede recebe o datagrama e percebe que este está direcionado a uma outra rede e reenvia o datagrama.
  • Isso até que seja atingido o host final.
  • Obs.: A transferência dentro da rede local é feita por um protocolo nível abaixo (como o CSMA/CD).

Descrição de funções

  • A função do IP é transportar datagramas em redes interconectadas. Tudo isto através de de módulos situados pelo caminho que redirecionam o datagrama de acordo com o endereço de destino.
  • Endereçamento:
    • Módulo de internet mapeia IPs para endereços locais, este protocolo lida com endereços.
    • Classes:
      • A: início(bit) - 0, 7 bits - rede, 24 bits - endereço local
      • B: início - 10, 14 bits - rede, 16 bits - endereço local
      • C: início - 110, 21 bits - rede, 8 bits - endereço local
    • Um host pode ter várias interfaces e assim vários endereços lógicos (IP).
  • Fragmentação:
    • Quantidade de dados pode ser maior que o máximo permitido (MTU), assim acontece a fragmentação.
    • Os campos:
      • id: permanece o mesmo
      • Bytes: número de bytes de dados
      • offset: quantos bytes existem antes destes (múltiplo de 8)
      • flag: 1 (mais fragmentos) ou 0 (sem mais fragmentos)

Gateways

  • Implementam IP e GGP(Gateway to Gateway Protocol)
  • Não há implementação de protocolos de camadas superiores
  • Passagem de datagramas para redes posteriores.

Especificação

  • Versão (4 bits): versão do protocolo
  • IHL (4 bits): Tamanho do cabeçalho (palavras de 32 bits)
  • Type of Service (8 bits): parâmetros de QoS.
    • Bits 0-2: Precedência
      • 111 - Controle de Rede
      • 110 - Controle entre redes
      • 101 - CRITIC/ECP
      • 100 - Sobrescrita Flash
      • 011 - Flash
      • 010 - Intermediário
      • 001 - Prioridade
      • 000 - Rotina
    • Bit 3: Normal ou baixo delay
    • Bit 4: Normal ou alta vazão
    • Bit 5: Normal ou alta confiança
    • Bits 6-7: Uso futuro
    • Obs: Isso pode aumentar o custo da transmissão.
  • Comprimento do datagrama (16 bits): Tamanho total do datagrama (cabeçalho mais dados). Assim na teoria o maior valor aqui seria 65535 bytes.
  • Identificador (16 bits): id do datagrama, usado p/ fragmentação.
  • Flags (3 bits)
    • Bit 0: reservado, sempre 0.
    • Bit 1: pode ou não fragmentar (0-1)
    • Bit 2: não tem ou tem mais fragmentos (0-1)
  • Fragment Offset (13 bits): usado na fragmentação, usa unidades de 8 octetos (64 bits)
  • TTL (8 bits): Indica o máximo de saltos do datagrama.
  • Protocolo da camada superior (8 bits)
  • Checksum (16 bits): Soma todas as palavras de 16 bits e armazena o complemento de 1, usado p/ detecção de erros.
  • Endereço Fonte (32 bits)
  • Endereço Destino (32 bits)
  • Opções (Variável): podem existir ou não.
    • 2 Casos:
      • Um octeto de "option-type"
      • Um octeto de "option-type mais um "option-lenght" e os octetos de "option-data".


    • Para o primeiro caso:
      • 1 bit flag de cópia: esta opção deve ou não ser copiada em todos os fragmentos(1-0)
      • 2 bits para a classe: 0 - controle, 1 e 3 - reservados para uso futuro, 2 - debug/medição.
      • 5 bits para o número da opção
    • Exemplos:
      • 00000000 - Fim da lista de opções
      • 00000001 - No Operation: pode ser usada entre opções.
      • [10000010][00001011] - Segurança: A segunda sequência de bits indica o tamanho (11). A partir deste serão 16 bits para especificar um nível de segurança, 16 bits para compartimento, 16 bits para manipular restrições e 24 bits para um código de controle de transmissão (separar tráfego e definir comunidades controladas). Vê-se que são 11 octetos!
      • 10000011 - Fonte solta e registro de rota: Tamanho variável, permite a fonte do datagrama prover informações sobre a rota, além de registrar a rota que está sendo percorrida. Possui um ponteiro, que aponta para a próxima rota a ser seguida. Ele faz isso substituindo os campos de destino e fonte.
      • 10001001 - Fonte estrita e registro de rora: Igual o acima, a diferença é que o próximo endereço nesse caso é sempre direto, já no "loose" (solta) podem ser passados vários elementos até o próximo endereço especificado.
      • 00000111 - Record Route: Tamanho variável, registra rotas através de um ponteiro. Se não cabe mais endereços, para de gravar, se cabe parcialmente um endereço dá erro e o pacote é descartado.
      • [10001000][00000100] - Identificador de fluxo: Forncede um meio para identificar fluxos (SATNET 16 bits) em redes que não suportam o conceito de fluxo.
      • 01000100 - Internet Timestamp: sequências de tempo que podem indicar eventos. Tamanho variável. Tem uma flag de 2 bits, que se for 0 só acontece o timestamp, se for 1 cada timestamp é marcado pelo endereço da entidade, e se for 3 o campo de endereço é pré-especificado. Possui os campos: lenght (que pega o tamanho até o fim da flag), pointer, overflow (número de módulos que não vão registrar timestamp), flag, internet address, timestamp.
      • Padding: Tamanho variável, para garantir que o cabeçalho encerre em um limite de 32 bits.

Observações

  • É possível que um host possua vários IPs, ou que um único IP corresponda a uma rede local inteira, ou seja, vários hosts.
  • Todo módulo de internet deve ser capaz de passar um datagrama de 68 bytes sem fragmentação, visto que o cabeçalho pode chegar a 60 bytes e o menor fragmento tem 8 bytes.
  • Todo módulo de internet deve ser capaz de receber 576 bytes, fragmentados ou em apenas um datagrama.
  • Erros são reportados em mensagens ICMP.
  • Interfaces:
    • Enviando

SEND (src, dst, prot, TOS, TTL, BufPTR, len, Id, DF, opt => result)

   where:
     src = source address
     dst = destination address
     prot = protocol
     TOS = type of service
     TTL = time to live
     BufPTR = buffer pointer
     len = length of buffer
     Id  = Identifier
     DF = Don't Fragment
     opt = option data
     result = response
       OK = datagram sent ok
       Error = error in arguments or local network error
    • Recebendo:

RECV (BufPTR, prot, => result, src, dst, TOS, len, opt)

   where:
     BufPTR = buffer pointer
     prot = protocol
     result = response
       OK = datagram received ok
       Error = error in arguments
     len = length of buffer
     src = source address
     dst = destination address
     TOS = type of service
     opt = option data