Edgard Jamhour
O objetivo desta unidade é apresentar uma revisão dos principais conceitos relacionados
aos protocolos de transporte TCP e UDP, bem com os protocolos de aplicação.
Os conceitos dessa unidade são requisitos importantes para compreender o funcionamento
dos mecanismos de Proxy e NAT que serão abordados na seqüência deste módulo. Eles
serão igualmente importantes nas disciplinas que abordarão aspectos de segurança da
arquitetura TCP/IP.
A leitura desse capítulo não é obrigatória para os alunos que se sentem familiarizados com
esses conceitos.
1
Protocolo do nível de transporte
DADOS
Camada de Transporte
TCP, UDP transporte
S.O.
Camada de Rede pacote
IP
Placa de
rede Camada de Enlace e quadro
Fisica
Edgard Jamhour
2
Endereçamento por Portas
Computador 1 Computador 2
Processo
A Processo Processo Processo
Processo
Processo B
Porta Porta
1024 Porta Porta Porta 80 Porta
Endereço IP Endereço IP
IP IP
Ethernet Ethernet
barramento
1024 80 Mensagem
Edgard Jamhour
3
TCP X UDP
TCP UDP
Edgard Jamhour
Os protocolos TCP e UDP são muito diferentes. O protocolo UDP é muito simples, e
praticamente só oferece um serviço de endereçamento por portas para a aplicação. Já o
TCP é um protocolo muito sofisticado, que realiza diversas operações para a aplicação,
como a verificação de recebimento e a retransmissão automática de pacotes perdidos.
A primeira diferença entre o TCP e o UDP refere-se a existência ou não de conexão. Uma
conexão é criada através de uma troca de pacotes de controle entre um cliente e o servidor
que ocorre antes do início do primeiro pacote de dados ser transmitido. O TCP utiliza os
pacotes de controle para criar, monitorar e encerrar as conexões. A conexão é um requisito
para realizar muitos dos serviços adicionais oferecidos pelo TCP. O UDP, transmite apenas
pacotes de dados.
A segunda diferença refere-se ao modo de transmissão dos dados. No TCP, uma aplicação
não precisa controlar quantos dados cabem em um pacote. Ela pode simplesmente
transmitir os dados em um fluxo contínuo, que o S.O. decide como segmentar os dados em
pacotes. O S.O. no receptor também remonta os pacotes de forma transparente para a
aplicação, que recebe os dados também como um fluxo contínuo. No caso do UDP, cabe a
aplicação fornecer para o S.O. uma quantidade de dados que caiba em um pacote.
A terceira diferença refere-se ao controle de recebimento e a retransmissão de pacotes
perdidos. No caso do TCP os pacotes enviados são confirmados pelo receptor. Caso eles
não sejam confirmados, eles são re-enviados automaticamente pelo sistema operacional,
sem necessidade de intervenção da aplicação. No caso do UDP, a detecção de pacotes
perdidos e a retransmissão precisa ser feita pela aplicação.
4
TCP X UDP
TCP UDP
Controle de Fluxo Sem controle
Controle de Congestionamento
Somente Unicast Unicast, Multicast ou BroadCast
Edgard Jamhour
O TCP implementa ainda dois mecanismos bastante sofisticados que não são
implementados pelo UDP: o controle de fluxo e o controle de congestionamento.
O controle de fluxo é um ajuste automático da velocidade do transmissor, que reduz sua
taxa de envio de pacotes para evitar que o receptor perca pacotes por não ter capacidade de
recebê-los. Isso é necessário quando dois computadores de capacidade muito distinta se
comuniquem numa rede de alta-velocidade. Nesse caso, o limitante de velocidade não é a
rede, mas a capacidade de processamento dos computadores.
O controle de congestionamento é também um ajuste de velocidade, mas provocado pela
perda de pacotes na rede. Quando o TCP detecta perda de pacotes, ele assume que os
roteadores da rede tiveram que descartar os pacotes porque a rede está congestionada. Esse
mecanismo foi implementado nos primórdios da Internet, quando se percebeu que a
retransmissão automática de pacotes sem controle de congestionamento podia levar a rede
rapidamente a um colapso.
As funcionalidades adicionais oferecidas pelo TCP sobre o UDP vem com um custo: o
TCP só suporta transmissões em unicast. Isto é, não é possível usar endereços de
broadcast ou multicast em conexão TCP. Isso acontece, entre outras coisas, porque os
pacotes TCP precisam ser confirmados pelo receptor. A confirmação não funciona quando
se usa um endereço genérico de destino, pois o transmissor não sabe de quantos
destinatários ele deve aguardar a confirmação. Todas as aplicações que precisam transmitir
broadcast ou multicast precisam usar UDP. O TCP também é um protocolo mais custoso
em termos de processamento para os sistemas operacionais e também em termos do
volume de dados transmitido pela rede. Ele não é indicado quando a aplicação precisa
transmitir apenas mensagens curtas ou mensagens sensíveis ao atraso, que não podem ser
retransmitidas.
5
Protocolo TCP
0 4 8 12 16 20 24 28 31
Número de Seqüência
Número de Confirmação
Opções
Dados
....
6
Transmissão por Fluxo (TCP)
aplicação aplicação
Fluxo contínuo de Fluxo contínuo de
bytes (stream) bytes (stream)
socket socket
TCP TCP
segmentos segmentos
IP IP
Edgard Jamhour
7
Segmentação e Remontagem
Início da Conexão Fim da Conexão
Edgard Jamhour
8
Comunicação Confiável
segmento 1 segmento 2 segmento A segmento B
tempo tempo
Edgard Jamhour
9
Recomendações RFC 1122 e 2581
EVENTO AÇÃO TCP DESTINATÁRIO
Edgard Jamhour
O receptor não confirma segmentos recebidos fora da ordem. Ao invés disso, para cada
segmento recebido fora de ordem, o receptor repete o número de confirmação do último
segmento recebido na seqüência correta para o transmissor.
Se o transmissor receber 3 segmentos com o mesmo número de confirmação, ele
retransmite todos os segmentos ainda não confirmados. Essa técnica é denominada
retransmissão rápida (retransmissão antes de expirar o temporizador do segmento).
A figura apresenta um resumo das principais recomendações sobre o funcionamento do
TCP, descritas nas RFCs 1122 e 2581.
10
Conexão TCP
cliente servidor
seq=C_NIS, ACK=0, SYN=1
ACK=1,SYN=0 transmissão
dos dados
...
FIN=1
ACK=1
encerramento
de
conexão
FIN=1
ACK=1
tempo tempo
Edgard Jamhour
Os bits ACK, SYN e FIN (definidos no campo FLAS do TCP) são utilizados para controlar a abertura e o
encerramento das conexões TCP. O ACK é o flag de confirmação de recebimento. Ele é 0 no primeiro
segmento transmitido (pois não há nada a confirmar) e 1 em todos os demais. O SYN é o flag de sincronismo.
Seu valor é 1 é apenas nos dois primeiros segmentos trocados entre o cliente e o servidor. O flag FIN é flag
de finalização. Quando seu valor é um, ele indica o desejo de encerrar a conexão.
Uma conexão TCP estabelece os números de seqüência iniciais (NIS) usados pelo cliente e o servidor. Isso
envolve a troca de três segmentos:
1) O cliente envia para o servidor pedido de abertura de conexão (segmento SYN). Esse segmento define o
valor inicial do número de seqüência do cliente (C_NIS), e é identificado pelos flags SYN=1, ACK=0.
2) O servidor envia para o cliente a confirmação da abertura da conexão (segmento SYNACK). Esse
segmento informa o valor inicial do número de seqüência do servidor (S_NIS), e é identificado pelos flags
SYN=1 e ACK=1.
3) O cliente envia para o servidor a confirmação do recebimento do segmento SYNACK.
Após essa fase, os dados podem ser trocados indefinidamente entre o cliente e o servidor. Observe que
durante a fase de troca de dados que ACK=1 e SYN=0.
O encerramento da conexão pode ser feito por iniciativa do servidor ou do cliente. A conexão TCP é
bidirecional, então o encerramento completo da conexão precisa que ambos, o cliente e o servidor, enviem
pedidos de encerramento. O encerramento envolve a troca de 4 segmentos. No exemplo da figura, a iniciativa
de encerramento da conexão foi feita pelo cliente. Assim, primeiro, o cliente envia para o servidor um
segmento com o flag FIN=1. O servidor envia um segmento confirmando o recebimento do FIN, e outro
solicitando encerramento da sua conexão. Finalmente o cliente confirma o recebimento do segmento FIN do
servidor.
O TCP permite também um encerramento rápido da conexão utilizando o flag Reset (RST). Quando o cliente
ou o servido enviam um pacote com RST=1, a conexão é encerrada com um único pacote.
11
Controle de Fluxo
S.O.
3000 RcvBuffer
2000
LastByteRcvd
1000 aplicação
LastByteRead
0
A B
conf=1000
RcvWindow=1000
Transmissor Receptor
Edgard Jamhour
12
Controle de Congestionamento
MSS
congwindow
evento de falha
crescimento prevenção de
exponencial congestionamento
Threshold prevenção de
congestionamento
Threshold
t
RTT RTT RTT RTT RTT RTT RTT RTT RTT RTT
A envio B
RTT
confirmação
Edgard Jamhour
Na prática, o TCP impõe uma outra janela que limita o envio de bytes pelo transmissor. Essa janela é
denominada Janela de Congestionamento (CongWindow).
Ao contrário da Janela de Recepção, a Janela de Congestinamento não possui um campo correspondente no
cabeçalho do TCP. Ela é calculada internamente pelo sistema operacional do transmissor com base no
sucesso ou fracasso na transmissão de segmentos. Todas as vezes que um segmento é perdido, o TCP assume
que a rede está congestionada e tenta reduzir a velocidade do transmissor. Quando os segmentos são
transmitidos com sucesso, a janela é aumentada.
A janela CongWindow é calculada em múltiplos de MSS (Maximum Segment Size = 1460 bytes). A figura
ilustra como a CongWindow evolui ao longo do tempo. Inicialmente, a janela é ajustada para 1 MSS e é
dobrada a cada segmento confirmado com sucesso. Esse processo de crescimento exponencial continua até
um certo valor de Threshold. A partir desse ponto, a janela entre numa fase de prevenção de
congestionamento, onde o crescimento é mais lento (apenas um 1 MSS a cada confirmação bem sucedida).
Em caso de falha, o tamanho da janela e do Threshold são reduzidos a metade.
O algorimto de cáculo da CongWin pode ser resumido da seguinte forma:
a) Inicialização:
CongWin = 1 MSS (Maximum Segment Size = 1460 bytes)
Threshold = 65 kbps
b) Fase de crescimento exponencial (a cada confirmação recebida)
se CongWin < Threshold vai para Partida Lenta: CongWin = CongWin + MSS
Isto é, CongWin= Congwin*2 por RTT
senão vai para Prevenção de Congestionamento: CongWin = CongWin + (MSS/CongWin)
Isto é, CongWin = CongWin + 1 MSS por RTT
c) Em caso de detecção de segmentos fora de ordem:
Threshold = CongWin = CongWin/2
Vai para prevenção de congestionamento
d) Em caso de detecção de perda por temporização
Threshold = CongWin/2
CongWin = 1 MSS (volta para partida lenta)
13
Congestionamento X Controle de Fluxo
1800 CongWindow
1500
LastByteSent
1000
LastByteAcked
0
A envio B
RTT
confirmação
Edgard Jamhour
Em um dado instante, a taxa máxima de envio de segmentos pelo transmissor é dada pela
menor valor de janela definida pelo controle de fluxo e o controle de congestionamento.
Esse valor é calculado da seguinte forma:
taxa_máxima = [min(CongWindow,RcvWindow) - (LastByteSent-LastByteAcked)]/RTT bytes/s.
onde:
LastByteSent: último byte enviado pelo transmissor
LastByteAcked: última byte confirmado pelo receptor
O TCP distingue dois eventos de falha: perda de segmento (isto é, o receptor não enviou
nenhuma confirmação) e chegada de segmentos fora de ordem (isto é, o receptor está
enviou segmentos com o número de confirmação duplicado). O primeiro evento é
considerado mais grave que o segundo, pois no caso dos segmentos fora de ordem, o
receptor ainda consegue sinalizar segmentos ao transmissor.
Existem algumas variantes na implementação do TCP, de acordo como o mecanismo de
controle congestionamento reage a esses eventos de falha.
A versão Tahoe é a mais antiga, e volta para partida lenta (CongWin=1MSS) para
qualquer evento de falha.
A versão Reno é mais recente, e adota uma recuperação rápida (CongWin=CongWin/2) no
caso de segmentos fora de ordem, e partida lenta (CongWin=1MSS) em caso de perda de
segmentos.
O TCP Vegas é uma proposta não implementada em muitos SOs. Ela reduz a taxa de
transmissão de pacotes mesmo antes da ocorrência de perda, monitorando o aumento do
valor do RTT (tempo de confirmação).
14
Protocolo UDP
0 4 8 12 16 20 24 28 31
Dados
....
Edgard Jamhour
O cabeçalho UDP (User Datagram Protocol) são bem mais simples que o TCP, pois ele não
oferece nenhuma funcionalidade além da simples multiplexação de portas. O nome da
unidade de dados do protocolo UDP é geralmente denominada datagrama UDP.
Apesar do UDP possuir um campo para verificação de erros de transmissão (CheckSum), o
protocolo não oferece nenhum serviço de confirmação para o transmissor, nem a
retransmissão dos pacotes perdidos. Ele também não tem o conceito de conexão, sendo
portanto, incapaz de segmentar e remontar de forma transparente para a aplicação os dados
transmitidos.
Isso não significa que não é possível desenvolver aplicações sobre o protocolo UDP que
sejam confiáveis ou que possam transmitir grandes volumes de dados. Significa,
simplesmente, que essas funcionalidades adicionais deverão estar embutidas no código da
aplicação, pois elas não serão oferecidas pelo sistema operacional. Por exemplo, o NFS
(Network File System) que permite aos sistemas Unix compartilharem diretórios pela rede
é construído sobre UDP.
Em muitos casos, os desenvolvedores optam por não usar as funcionalidades do TCP
devido ao custo de performance associado. Isso é particularmente verdade para as
aplicações sensíveis atraso e jitter (i.e., aplicações tempo-real). Por exemplo, em uma
aplicação de VoIP (Voz Sobre IP) não vale a pena retransmitir pacotes perdidos, pois a
capacidade de re-ordenamento do terminal de VoIP é limitada.
O UDP é ainda essencial nos casos das aplicações que precisam transmitir mensagens em
multicast ou broadcast, pois TCP suporta apenas o modo unicast.
15
Protocolos de Aplicação
Camada de Aplicaç
Aplicação HTTP FTP SMTP NFS DNS DHCP
Camada de Rede IP
Edgard Jamhour
Os protocolos da camada de aplicação seguem uma estratégia bem diferente dos protocolos
das camadas de transporte e rede. Enquanto os protocolos TCP, UDP e IP oferecem a
possibilidade de grande quantidade de reuso de código entre aplicações distintas, os
protocolos de aplicação são particulares a cada aplicação. Dessa forma, não vale a pena
implementar os protocolos de aplicação ao nível do sistema operacional, ficando mais
simples implementá-los nas próprias aplicações cliente e servidora.
O objetivo dos protocolos de aplicação é permitir a comunicação entre programas
desenvolvidos por fabricantes diferentes. Os protocolos de aplicação relacionados aos
serviços IP são padronizados na forma de RFCs pelo IETF.
Muitos dos protocolos usados na Internet são formados de mensagem em texto. Nesses
protocolos, a separação entre campos do protocolo é muitas vezes feitas por um caractere
de quebra de linha (\n). Por exemplo, o uma mensagem do protocolo HTTP solicitando a
pagina http://espec.ppgia.pucpr.br/~jamhour/welcome.html pode ter o seguinte
formato:
GET /~jamhour/welcome.html HTTP/1.1\r\n
Host: espec.ppgia.pucpr.br\r\n
Cache-Control: no-cache\r\n
\r\n
16
Portas bem Conhecidas
http
httpd 80 >1023 wget
ftp control
21 >1023
ftpd ftp data ftp
20 >1023
servidor cliente
smtp
smptd 25 >1023 firefox
nfs
nfsd 2049 >1023 nfs client
dns
named 53 >1023 dig
dhcp
dhcpd 67 >1023 dhclient
Edgard Jamhour
Observe que quando você digita o comando wget não é necessário especificar em que porta
o servidor http estará escutando. Isso acontece porque o cliente wget assume por default
que o servidor estará conectado na porta 80. É possível, contudo, instalar as aplicações
servidoras em portas alternativas. Por exemplo, se o servidor http da espec for instalado na
porta 8080 (não padrão), o cliente wget precisar informar a porta da seguinte forma.
wget http://espec.ppgia.pucpr.br:8080/~jamhour/vlan.tar.gz
Observe também, que a maioria das aplicações servidoras do Linux tem seu nome
terminado com “d”. Isso acontecer porque as aplicações servidoras do Linux que rodam
em segundo plano (sem interface visível com o usuário) são denominadas daemon.
17
Conclusão
Edgard Jamhour
Nesta unidade, fizemos uma revisão dos principais conceitos relacionados aos protocolos
de transporte e aplicação da arquitetura TCP/IP.
Este documento deve ser revisto pelo aluno sempre que ele tiver dúvidas relativas ao
funcionamento desses protocolos. Conhecimentos mais aprofundados sobre o
funcionamento dos protocolos TCP e UDP serão necessários, por exemplo, na disciplinas
de segurança em redes, que irá discutir a configuração de firewalls. Como veremos a
configuração dos firewalls levam em conta o conceito de conexão do TCP e, sua ausência,
no caso do UDP.
O conhecimento sobre o funcionamento desse protocolos também será importante para
compreender o funcionamento do mecanismo de Proxy e NAT, discutidos na seqüência
dessa disciplina.
O conceito de protocolo de aplicação também é necessário para compreender o
funcionamento dos Proxies.
18