O Protocolo TCP/IP 

Copyright® 1997 HaCkErZ HoT PaGe.
http://www.geocities.com/~hckz/hacker1.htm

TCP/IP é o nome que se dá a toda a família de protocolos utilizados pela Internet. Esta família de protocolos foi desenvolvida pela DARPA (Defense Advanced Research Project Agency) no DoD (Departamento de Defensa dos Estados Unidos).

Este conjunto de protocolos foi desenvolvido para permitir aos computadores compartilharem recursos numa rede. Toda a família de protocolos inclui um conjunto de padrões que especificam os detalhes de como os computadores se comunicam, assim como também convenções para interconectar redes e rotear o tráfego.

Mas, ao contrário do que acontece na imprensa, o nome completo raramente é usado. O TCP e o IP são protocolos individuais que podem ser discutidos de modo isolado, mas eles não são os únicos protocolos que compõem essa família. Pode acontecer de um usuário do TCP/IP não utilizar o protocolo TCP propriamente dito, mas sim alguns protocolos da família. A utilização do TCP/IP nessa situação não deixa de ser apropriada porque o nome se aplica de modo genérico ao uso de qualquer protocolo da família TCP/IP.

ARP Address Resolution Protocol
ICMP Internet Control Message Protocol
UDP User Datagram Protocol
RIP Routing Information Protocol
HTTP Hypertext Transfer Protocol
NNTP Network News Transfer Protocol
*SMTP Simple Mail Transfer Protocol
SNMP Simple Network Management Protocol
FTP File Transfer Protocol
TFTP Trivial File Transfer Protocol
INETPhone Telephone Services on Internet
IRC Internet Relay Chat
RPC Remote Procedure Call
NFS Network File System 
DNS Domain Name System

Talvez seja difícil lembrar todos esses acrônimos, até porque alguns também são utilizados por outros protocolos (por exemplo o protocolo RIP da família Novell, ou o IPX, é diferente do RIP da família TCP/IP). Além do mais, saber exatamente quais são os protocolos que compõem uma determinada família não é pré-requisito para compreender o funcionamento básico da rede.

Uma visão resumida do Protocolo

Uma transferencia se inicia com um pedido de leitura ou escrita de um arquivo, o qual também serve para pedir uma conexão. Se o servidor reconhece o pedido, a conexão é aberta e o arquivo é enviado num bloco de tamanho fixo de 512 bytes.

Cada pacote de dados contém um bloco de dados e deve ser reconhecido por um pacote de acknowledgment antes que o próximo pacote possa ser enviado. Um pacote de dados menor que 512 bytes sinaliza o término de uma transferência.

Se um pacote se perder na rede, o receptor indicará time-out e poderá retransmitir seu último pacote (o qual pode ser de dados ou um reconhecimento). Isto motiva o transmissor do pacote perdido a retransmitir o pacote perdido. O transmissor tem que guardar apenas um pacote para a retransmissão, pois cada passo de reconhecimento garante que todos os pacotes anteriores tenham sido recebidos.

Note que as duas máquinas envolvidas na transferência são consideradas transmissoras e receptoras. Uma envia dados e recebe reconhecimento, a outra envia reconhecimento e recebe dados.

Muitos erros são causados pelo término da conexão. Um erro é sinalizado enviando um pacote de erro. Este pacote não é reconhecido nem retransmitido (i.e., um servidor TFTP ou o usuário pode terminar depois enviando uma mensagem de erro) assim o outro terminal da conexão não deve recebê-lo. Portanto os time-outs são usados para detectar tais terminais quando o pacote de erro for perdido.

O Protocolo IP

O protocolo IP define mecanismos de expedição de pacotes sem conexão. IP define três pontos importantes:

Dentro do protocolo IP há os seguintes tópicos:

TCP (Transport Control Protocol)

TCP é um protocolo da camada de transporte. Este é um protocolo orientado à conexão, o que indica que neste nível vão ser solucionados todos os problemas de erros que não forem solucionados no nível de IP, dado que este último é um protocolo sem conexão.

Alguns dos problemas que o TCP deve tratar são:

O TCP especifica o formato dos pacotes de dados e de reconhecimentos que dois computadores trocam para realizar uma transferência confiável, assim como os procedimentos que os computadores usam para assegurar que os dados cheguem corretamente. Entre estes procedimentos estão:

Para entender melhor o protocolo TCP veremos alguns conceitos, para depois passarmos ao formato TCP.

As aplicações normalmente utilizam um endereço de IP de 32 bits no sentido de abrir uma conexão ou enviar um datagrama de IP. Entretanto, os usuários preferem identificar as maquinas através de nomes ao invés de números. Assim, é necessário um banco de dados que permita a uma aplicação encontrar um endereço, dado que ela conhece o nome da máquina com a qual se deseja comunicar.

Um conjunto de servidores de nomes mantêm o banco de dados com os nomes e endereços das máquinas conectadas à Internet. Na realidade, este é apenas um tipo de informação armazenada no Domain System (Sistema de Domínios). Note que é usado um conjunto de servidores interconectados, ao invés de um único servidor centralizado. Existem atualmente tantas instituições conectadas à Internet que seria impraticável exigir que elas notificassem uma autoridade central toda vez que uma máquina fosse instalada ou trocasse de lugar. Assim, a autoridade para atribuição de nomes é delegada a instituições individuais. Os servidores de nome formam uma árvore, correspondendo à estrutura institucional. Os nomes também adotam uma estrutura similar.

Um exemplo típico é o nome chupeta.jxh.xyz.br. Para encontrar seu endereço Internet, pode ser necessário o acesso a até quatro servidores de nomes. Inicialmente deve ser consultado um servidor central, denominado servidor raiz, para descobrir onde está o servidor br. O servidor br é o responsável pela gerência dos nomes das instituições/empresas brasileiras ligadas à Internet. O servidor raiz informa como resultado da consulta o endereço de IP de vários servidores de nome para o nível br (pode existir mais de um servidor de nomes em cada nível, para garantir a continuidade da operação quando um deles pára de funcionar). Um servidor do nível br pode então ser consultado, devolvendo o endereço de IP do servidor xyz.

De posse do endereço de um servidor xyz, é possível solicitar que ele informe o endereço de um servidor jxh, quando, finalmente, pode-se consultar o servidor jxh sobre o endereço da máquina chupeta. O resultado final da busca é o endereço Internet correspondente ao nome chupeta.jxh.xyz.br.

Cada um dos níveis percorridos é referenciado como sendo um Domínio. O nome completo chupeta.jxh.xyz.br é um Nome de Domínio.

Na maioria dos casos, não é necessário ter acesso a todos os domínios de um nome para encontrar o endereço correspondente, pois os servidores de nome muitas vezes possuem informações sobre mais de um nível de domínio o que elimina uma ou mais consultas. Alem disso, as aplicações normalmente tem acesso ao DNS através de um processo local (servidor para as aplicações e um cliente DNS), que pode ser implementado de modo a guardar os últimos acessos feitos, e assim resolver a consulta em nível local. Essa abordagem de acesso através de um processo local, simplifica e otimiza a tarefa das aplicações no que tange ao mapeamento de nomes em endereços, uma vez que elimina a necessidade de implementar, em todas as aplicações que fazem uso do DNS, o algoritmo de caminhamento na arvore de domínios descrito anteriormente.

O DNS não se limita a manter e gerenciar endereços Internet. Cada nome de domínio é um nó em um banco de dados, que pode conter registros definindo varias propriedades. Por exemplo, o tipo da máquina e a lista de serviços fornecidos por ela. O DNS permite que seja definido um alias (nome alternativo) para o nó. Também é possível utilizar o DNS para armazenar informações sobre usuários, listas de distribuição ou outros objetos.

O DNS é particularmente importante para o sistema de correio eletrônico. No DNS são definidos registros que identificam a máquina que manipula as correspondências relativas a um dado nome, identificado assim onde um determinado usuário recebe suas correspondências. O DNS pode ser usado também para definição de listas para distribuição de correspondências.

SMTP - Simple Mail Transfer Protocol

O SMTP (Simple Mail Transfer Protocol) é o protocolo usado no sistema de correio eletrônico na arquitetura Internet TCP/IP. Um usuário, ao desejar enviar uma mensagem, utiliza o módulo interface com o usuário para compor a mensagem e solicita ao sistema de correio eletrônico que a entregue ao destinatário. Quando recebe a mensagem do usuário, o sistema de correio eletrônico armazena uma cópia da mensagem em seu spool (área do dispositivo de armazenamento), junto com o horário do armazenamento e a identificação do remetente e do destinatário. A transferencia da mensagem é executada por um processo em background, permitindo que o usuário remetente, após entregar a mensagem ao sistema de correio eletrônico, possa executar outras aplicações.

O processo de transferencia de mensagens, executando em background mapeia o nome da maquina de destino em seu endereço de IP, e tenta estabelecer uma conexão TCP com o servidor de correio eletrônico da maquina de destino. Note que o processo de transferencia atua como cliente do servidor do correio eletrônico. Se a conexão for estabelecida, o cliente envia uma copia da mensagem para o servidor, que a armazena em seu spool. Caso a mensagem seja transferida com sucesso, o servidor avisa ao cliente que recebeu e armazenou uma cópia da mensagem. Quando recebe a confirmação do recebimento e armazenamento, o cliente retira a cópia da mensagem que mantinha em seu spool local. Se a mensagem, por algum motivo, não for transmitida com sucesso, o cliente anota o horário da tentativa e suspende sua execução. Periodicamente, o cliente acorda e verifica se existem mensagens a serem enviadas na área de spool e tenta transmiti-las. Se uma mensagem não for enviada por um período, por exemplo, de dois dias, o serviço de correio eletrônico devolve a mensagem ao remetente, informando que não conseguiu transmiti-la.

Em geral, quando um usuário se conecta ao sistema, o sistema de correio eletrônico é ativado para verificar se existem mensagens na caixa postal do usuário. Se existirem, o sistema de correio eletrônico emite um aviso para o usuário que, quando achar conveniente, ativa o modulo de interface com o usuário para receber as correspondências.

Uma mensagem SMTP divide-se em duas partes: cabeçalho e corpo, separados por uma linha em branco. No cabeçalho são especificadas as informações necessárias para a transferencia da mensagem. O cabeçalho é composto por linhas, que contêm uma palavra-chave seguida de um valor. Por exemplo, identificação do remetente (palavra-chave "to:" seguida do seu endereço), identificação do destinatário, assunto da mensagem, etc. No corpo são transportadas as informações da mensagem propriamente dita. O formato do texto é livre e as mensagens são transferidas no formato texto.

Os usuários do sistema de correio eletrônico são localizados através de um par de identificadores. Um deles especifica o nome da máquina de destino e o outro identifica a caixa postal do usuário. Um remetente pode enviar simultaneamente várias cópias de uma mensagem, para diferentes destinatários, utilizando o conceito de lista de distribuição (um nome que identifica um grupo de usuários). O formato dos endereços SMTP e o seguinte:

nome_local@nome_do_dominio

onde o nome_do_dominio identifica o domínio ao qual a maquina de destino pertence (esse endereço deve identificar um grupo de maquinas gerenciado por um servidor de correio eletrônico). O nome_local identifica a caixa postal do destinatário.

O SMTP especifica como o sistema de correio eletrônico transfere mensagens de uma máquina para outra. O modulo interface com usuário e a forma como as mensagens são armazenadas não são definidos pelo SMTP. O sistema de correio eletrônico pode também ser utilizado por processos de aplicação para transmitir mensagens contendo textos.