Página seguinte Página anterior Índice

8. Como se Parecem os Pacotes

Para os excepcionalmente curiosos (e os curiosamente excepcionais), há aqui uma explicação de como se parece um pacote. Existem várias ferramentas que podem examinar quais pacotes estão entrando ou saindo de sua máquina Linux: a mais comum é o `tcpdump' (que entende mais que o TCP atualmente), mas uma mais legal é o `ethereal'. Estes programas são conhecidos como `packet sniffers'.

O início de cada pacote diz onde ele está indo, de onde ele vem, o tipo de pacote, e outros detalhes administrativos. Esta parte é chamada de `packet header', ou `cabeçalho do pacote'. O resto do pacote, contendo os dados que estão sendo transmitidos, é chamado geralmente de `packet body' ou `corpo do pacote'.

Assim qualquer pacote começa com um `cabeçalho IP': pelo menos 20 bytes de comprimento. Ele se parece com isto (este diagrama foi copiado sem nenhuma vergonha da RFC 791):

  .-------+-------+---------------+-------------------------------.
  |Version|  IHL  |Type of Service|          Total Length         |
  |-------+-------+---------------+-------------------------------|
  |         Identification        |Flags|      Fragment Offset    |
  |---------------+---------------+-------------------------------|
  |  Time to Live |    Protocol   |         Header Checksum       |
  |---------------+---------------+-------------------------------|
  |                       Source Address                          |
  |---------------------------------------------------------------|
  |                    Destination Address                        |
  `---------------------------------------------------------------'

Os campos importantes são o Protocolo, que indica se é um pacote TCP (número 6), um pacote UDP (número 17), ou outra coisa, o endereço IP de Origem, e o endereço IP de Destino.

Agora, se o campo do protocolo diz que é um pacote TCP, então um cabeçalho TCP deve segir imediatamente este cabeçalho IP: o cabeçalho TCP tem também pelo menos 20 bytes:

  .-------------------------------+-------------------------------.
  |          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        |
  `---------------------------------------------------------------'

Os campos mais importantes aqui são a porta de origem, e a porta de destino, que diz a qual serviço o pacote está indo (ou vindo, no caso de pacotes de resposta). Os números de seqüência e reconhecimento são usados para manter os pacotes em ordem, e dizem ao outro lado quais pacotes já foram recebidos. As flags ACK, SYN, RST e FIN (escritas de cima para baixo) são bits simples que são usados para negociar a abertura (SYN) e fechamento (RST ou FIN) das conexões.

Seguindo este cabeçalho vem a verdadeira mensagem que a aplicação está enviando (o corpo do pacote). Um pacote normal tem até 1500 bytes: isto significa que o maior espaço que um dado por tomar é 1460 bytes (20 bytes para o cabeçalho IP, e 20 para o cabeçalho TCP): pouco mais de 97%.


Página seguinte Página anterior Índice 1