You are on page 1of 7

O Protocolo TCP

O protocolo TCP o protocolo de transporte mais utilizado na Internet. A maioria das aplicaes que
voc conhece como e-mail, web, FTP, P2P, entre outras, utiliza TCP, e nesta seo voc vai entender o
porqu. Vamos analisar separadamente cada uma das funcionalidades oferecidas pelo TCP, mas
inicialmente voc j deve saber que o TCP procura tornar a rede por onde os pacotes sero
transmitidos confivel. Lembre-se que a camada de rede IP no confivel, pois os pacotes IP podem
ser perdidos e podem chegar fora de ordem no destino. Portanto, as duas principais funes do TCP
so:
garantir que os pacotes TCP sejam entregues aplicao de destino na mesma ordem em que foram
transmitidos pela aplicao de origem;
garantir que todos os pacotes transmitidos sejam recebidos.
Alm das duas funes acima, o TCP tambm oferece outras funcionalidades, como, por exemplo,
garantir que a mquina de origem envie os pacotes em uma taxa que o receptor possa process-los. A
isso d-se o nome de controle de fluxo.
Protocolo orientado conexo
Para conseguir realizar todas essas tarefas o TCP precisa manter uma srie de informaes sobre a
comunicao que est ocorrendo. Por isso, ele requer que uma conexo seja estabelecida entre as
duas mquinas que desejam se comunicar, antes que as informaes possam realmente ser
transmitidas.
Estabelecer uma conexo significa que uma mquina vai pedir para conversar com a outra, de modo
que ambas se preparem para controlar a comunicao que ir acontecer. Esse controle se refere, por
exemplo, criao de variveis para armazenar informaes sobre o andamento da comunicao.
Entre outras informaes, o cabealho TCP possui um campo formado por diversos bits (chamados de
flags) que indicam o tipo do pacote sendo transmitido. Esse tipo pode ser, por exemplo, se um pacote
de pedido de conexo ou um pacote de confirmao. A combinao dos flags definidos (possuem o
valor 1) que indica o tipo do pacote.
Para estabelecer uma conexo so trocados trs pacotes, conforme mostrado na Figura 4, onde a
mquina A estabelece uma conexo com a mquina B. Veja que a mquina A envia um pacote de
solicitao de conexo (flag SYN definido), a mquina B responde aceitando a conexo (flags SYN e
ACK definidos) e finalmente a mquina A avisa que recebeu a confirmao da conexo (pacote com
apenas o flag ACK definido). Esse procedimento
chamado de Three-way-handshake em referncia ao
fato de serem trocados trs pacotes para estabelecer a
conexo.

Os trs pacotes trocados durante a fase de estabelecimento da conexo contm apenas o cabealho TCP e no
contm nada na parte de dados! S aps o estabelecimento da conexo que os dados so, de fato, transmitidos.
Conforme estudaremos na prxima seo, o TCP confirma os pacotes recebidos. Portanto, a fase de troca de
dados, ou seja, a comunicao propriamente dita composta de pacotes de dados e as confirmaes. Quando
no se deseja mais transmitir nada a conexo fechada. Como uma conexo TCP full-duplex, ou seja, podem-se
transmitir dados nos dois sentidos, cada mquina precisa solicitar o fechamento da conexo. Isso feito por
pacotes com o flag FIN definido.
A Figura 5 mostra as trs fases de uma conexo TCP: estabelecimento de conexo, transferncia de dados,
encerramento da conexo. Evidentemente os pacotes mostrados na fase de dados so apenas um exemplo, pois
os pacotes trocados dependem de cada situao. O importante observar que cada mquina pode transmitir
dados para a outra, independentemente de quem abriu a conexo.

Segmentao e blocagem
Quando a camada de transporte recebe dados da camada de aplicao para serem transmitidos, ela acrescenta
seu cabealho informao recebida e passa a PDU resultante para a camada de rede. Sobre esse cabealho voc
j sabe que ele deve conter o nmero da porta de origem e da porta de destino.

A Figura 6 mostra que o pacote TCP inserido dentro da parte de dados de um pacote IP. Chamamos essa parte
de dados de Dados para ressaltar que ela composta pelos Dados passados pela camada de aplicao acrescidos
do cabealho TCP.
Entretanto, nem sempre gerado exatamente um pacote TCP para cada solicitao de transmisso feita pela
camada de aplicao. O TCP pode decidir dividir os Dados passados pela camada de aplicao em duas ou mais
partes e enviar cada uma delas em um pacote TCP separado. Esse procedimento de diviso chamado
segmentao. A Figura 7 mostra o caso onde uma solicitao de transmisso da camada de aplicao foi dividida
em dois pacotes TCP.

Esse processo chamado segmentao e normalmente realizado para impedir que o pacote IP que vai ser
gerado fique muito grande e precise ser dividido (fragmentao IP) porque no caberia na parte de dados da
camada de enlace onde vai ser transmitido por exemplo, uma rede Ethernet.
No exemplo acima, uma mensagem de aplicao foi dividida em dois pacotes TCP, mas pode acontecer tambm
de o TCP juntar duas ou mais mensagens de aplicao em um nico pacote TCP. Tal procedimento chamado
Blocagem. Isso acontece devido ao fato de que enviar pacotes muito pequenos reduz o desempenho da rede
porque aumenta a quantidade de bytes de cabealho transmitidos em relao aos bytes de dados do usurio.
Portanto, gasta-se mais banda de rede para informaes de controle, como o caso dos cabealhos.
A Figura 8 mostra o caso onde o TCP decide juntar duas mensagens de aplicao em um nico pacote TCP. Isso
tipicamente ocorrer quando o tamanho das mensagens de aplicao for muito pequeno.

Ordenamento dos pacotes
Como os pacotes TCP so transmitidos dentro de pacotes IP, eles podem chegar fora de ordem na mquina de
destino. Para resolver esses problemas o TCP numera os pacotes que transmite e insere o nmero de cada pacote
em um campo no seu cabealho. Desse modo, a mquina de destino pode colocar os pacotes na ordem antes de
pass-los para a camada de aplicao.
Suponha que a mquina A transmitiu os pacotes 1, 2 e 3 para a mquina B, mas eles chegaram na mquina B na
ordem 1, 3 e 2. Ao receber o pacote 1 o TCP o entrega para a camada de aplicao. Depois disso ele recebe o
pacote 3, mas como ainda no recebeu o pacote de nmero 2, ele guarda o pacote 3 em um buffer at que
receba o pacote 2. Quando isso acontecer ele entrega o pacote 2 e o pacote 3 para a camada de aplicao, nessa
ordem.
Embora tenhamos dito que o campo do cabealho TCP para identificar os pacotes numera cada pacote (pacote 1,
pacote 2 etc.), na verdade ele indica, contando com o primeiro byte do pacote, quantos bytes j foram
transmitidos. Desse modo, se desde o incio da conexo j tiverem sido transmitidos 5.000 bytes de A para B, o
prximo pacote que A transmitir ter como nmero do pacote 5001. Apesar dessa diferena, a forma de usar
este valor a mesma, como se ele realmente fosse o nmero do pacote. Alm disso, cada mquina mantm o seu
contador, pois o nmero de bytes transmitidos em cada sentido da conexo normalmente diferente. Iremos
continuar nos referindo a ele como nmero do pacote porque deixa o texto muito mais simples, e
conceitualmente a mesma coisa a diferena diz respeito apenas forma como a ideia implementada.
Controle de erros
Ainda devido ao fato dos pacotes TCP serem transmitidos dentro de pacotes IP, eles podem ser perdidos. Para
resolver esse problema, um mecanismo de confirmao dos pacotes recebidos acrescentado ao esquema de
numerao dos pacotes TCP.
Para cada pacote transmitido o TCP inicia um temporizador. Cada pacote precisa ser confirmado pelo receptor
antes que o temporizador expire. Se o temporizador expirar sem que a confirmao tenha chegado, o pacote
retransmitido pelo prprio TCP. Isso significa que o TCP guarda todos os pacotes ainda no confirmados em um
buffer para que possa retransmiti-los caso seja necessrio. Isso tudo ocorre sem que a aplicao que enviou o
dado tome conhecimento. Ou seja, suponha que sua aplicao solicitou ao TCP que transmitisse uma mensagem
e o TCP a colocou em um pacote que foi enviado para a mquina destino. Caso esse pacote fosse perdido, o
prprio TCP detectaria e o retransmitiria, sem que seu programa precisasse ficar sabendo que o erro aconteceu!
Isso simplifica bastante a escrita de programas.
Uma coisa importante que quando se confirma um pacote de nmero X, isso significa que todos os pacotes com
nmeros menores que X so tambm confirmados. Portanto, se uma mquina recebeu os pacotes 1, 2 e 4, ela
no pode confirmar o 4, pois isso estaria confirmando tambm os pacotes 1, 2 e 3. Nesse caso, ela confirmaria os
pacotes 1 e 2 e esperaria o pacote 3 chegar para poder confirmar o pacote 4.
Os pacotes de confirmao contm o nmero do pacote sendo confirmado e o flag ACK definido (valor 1).
Entretanto, uma confirmao pode ser enviada em um pacote exclusivo para essa finalidade, ou seja, em um
pacote que no contm dados, ou pode ser enviada em um pacote contendo dados. Como todos os pacotes TCP
contm o campo de flag ACK e o campo para informar o nmero do pacote confirmado, normalmente as
confirmaes so enviadas pegando carona nos pacotes de dados. S se envia um pacote exclusivo para
confirmao quando no h dados para transmitir no sentido da conexo que se necessita transmitir a
confirmao.
Controle de fluxo
Os pacotes TCP que chegam a uma mquina ficam em um buffer at que sejam lidos pela aplicao. Quando a
aplicao demora a ler esses dados o buffer pode encher, e se isso acontecer, a mquina no ter onde colocar os
dados que chegarem. Para evitar esse problema o TCP possui um mecanismo que controla a quantidade de dados
que uma mquina pode enviar para outra.
Para isso existe um campo no cabealho TCP onde cada mquina informa para a outra a quantidade de espao
livre no seu buffer. Se uma mquina informar 0 (zero), a outra para de transmitir. Sempre que o valor informado
for maior que zero, a mquina pode transmitir no mximo a quantidade de bytes informada.
Alm deste mecanismo, o TCP possui outros mecanismos complexos, que no estudaremos, mas que permitem
que o TCP adapte a taxa com que envia os pacotes dependendo de como est o trfego na rede.
Formato do pacote TCP
A Figura 9 mostra o formato do cabealho TCP. Explicaremos apenas os principais campos.

Porta de Origem: Porta utilizada pela aplicao transmitindo o pacote.
Porta de Destino: Porta que identifica a aplicao para quem o pacote deve ser entregue.
Nmero de sequncia: Nmero de sequncia do pacote. Lembre-se que na verdade representa a posio do
primeiro byte deste pacote dentro do fluxo de bytes j transmitidos. Se em uma conexo j tivessem sido
transmitidos 8499 bytes, o Nmero deSequncia do prximo pacote seria 8500.
Nmero de confirmao: S vlido quando o flag ACK estiver definido, e indica o nmero do byte reconhecido.
Suponha que se deseja confirmar um pacote recebido que tinha 9000 no campo Nmero de Sequncia e possua
500 bytes. O valor deste campo seria 9501, indicando que os bytes da conexo at o nmero 9500 j foram
recebidos.
Tamanho do cabealho. Indica o tamanho do cabealho TCP (em nmero de palavras de 32 bits), ou seja,
multiplique o valor do campo por 4 para obter o tamanho do cabealho em bytes. necessrio porque podem
existir campos opcionais (por isso a indicao Opes no formato do quadro).
SYN. Se contm 1, indica que o pacote um pedido de conexo.
ACK. Se contm 1, indica que um pacote de confirmao. Se SYN tambm contm 1, indica que uma
confirmao de um pedido de conexo. Se SYN contm 0, uma confirmao de dados, e o campo Nmero de
Confirmao contm o nmero do pacote sendo confirmado.
FIN. Pedido de encerramento de conexo.
RST (Reset). Encerrando uma conexo porque algo estranho aconteceu na conexo. Protege contra ataques ou
erros.
PSH (Push). Usado pelo remetente para solicitar que os dados sejam entregues aplicao de destino o mais
rpido possvel, aps o pacote chegar naquela mquina.
URG (Urgent). Indica que o valor do campo Ponteiro Urgente vlido.
Tamanho da janela. Usado para indicar o tamanho disponvel no buffer (veja a explicao sobre controle de
fluxo).
TCP Checksum. Campo de verificao de erros no cabealho TCP. Semelhante ao campo checksum do cabealho
IP, por exemplo.
Ponteiro Urgente. Usado pela origem para indicar onde se encontra algum dado urgente dentro do segmento.
Opes. O cabealho TCP pode conter campos opcionais. O mais utilizado chama-se MSS (Max Segment Size
Tamanho mximo do segmento) e indica qual deve ser o tamanho mximo de cada pacote TCP gerado pela
mquina para tentar evitar que os pacotes IP que vo conter os segmentos sejam fragmentados. O valor colocado
neste campo baseado no tamanho da parte de dados da camada de enlace da mquina gerando o pacote.
Dados. No um campo do cabealho! Ele apenas indica que aps o cabealho TCP o pacote contm a mensagem
recebida da camada de aplicao.
Protocolo UDP
O protocolo UDP um protocolo de transporte bastante simples que procura oferecer s aplicaes um servio
de entrega de pacotes bsico. Este servio consiste apenas em colocar a mensagem recebida da camada de
aplicao dentro de um segmento (o chamaremos de pacote UDP), utilizando os nmeros de portas para
identificar as aplicaes. Portanto, as caractersticas oferecidas pelo UDP so praticamente as mesmas que o
prprio IP oferece, com a diferena que o pacote UDP utiliza nmeros de porta para identificar as aplicaes.
O UDP no garante que os pacotes sero entregues na ordem em que foram transmitidos. Ou seja, os pacotes so
passados para a camada de aplicao na mquina destino na ordem em que so recebidos por ela e essa ordem
pode ser diferente da que foram transmitidos.
O UDP no garante a entrega de pacotes, pois ele no retransmite pacotes perdidos ou com erro. Na verdade a
origem nem sabe se os pacotes foram perdidos. Como voc ver mais adiante, existe um campo de checksum no
pacote UDP que permite a deteco de pacotes que chegam com erro. Mas os pacotes com erro so descartados
sem que esse fato seja avisado mquina que transmitiu o pacote.
No existe nenhum mecanismo para controlar a taxa com que os pacotes so enviados para a mquina de
destino. Eles so enviados na taxa que a aplicao os gerar.
O UDP no realiza segmentao nem blocagem, ou seja, cada mensagem da camada de aplicao que passada
para o UDP gera exatamente um pacote UDP. A Figura 10 mostra esse procedimento. Observe que Dados
formado pelo contedo do cabealho UDP mais Dados.

Normalmente quanto mais funcionalidades um protocolo tem, mais campos ele precisa ter no seu cabealho.
Como o UDP no oferece muitas funcionalidades, isso se reflete no formato do pacote, fazendo com que ele seja
bastante simples. A Figura 11 mostra o formato de um pacote UDP. O campo Tamanho da Mensagem o
tamanho total do pacote UDP em bytes. Observe que Dados no um campo do cabealho! Ele apenas indica que
aps o cabealho UDP, o pacote contm a mensagem recebida da camada de aplicao.

You might also like