Aula 06 - Camada de Transporte                                                   By Victor Hugo Xavier

6.1 Introdução
         A camada de transporte é a segunda camada de cima para baixo da arquitetura TCP/IP, posicionada imediatamente abaixo da camada de aplicação. Ela promove uma
comunicação lógica entre processos viabilizando a troca de mensagens de protocolos da camada de aplicação.
        A unidade de transporte da camada de transporte é o segmento. Portanto, os  segmentos da camada de transporte carregam nos seus campos de dados as mensagens da camada de aplicação. Por exemplo, um pedido de página
HTML previsto pelo protocolo HTTP.
          A Figura 3.1 ilustra a comunicação lógica entre processos promovida pela camada de transporte.

          A camada de transporte da arquitetura TCP/IP dispõe de basicamente dois serviços que são oferecidos pelos protocolos Transmition Control Protocol - TCP e User Datagram Protocol -UDP.

6.2 Funções da Camada de Transporte
         Os serviços oferecidos pelo protocolo IP não oferecem confiabilidade. Problemas comuns como congestionamento, perda ou ordenação de pacotes não são tratados. Entretanto as aplicações (HTTP, FTP e SMTP, por exemplo) necessitam prover um serviço de qualidade para o usuário. A camada de transporte pode oferecer um serviço confiável de entrega de dados das aplicações utilizando um serviço não confiável prestado pela camada de rede.
         Os principais serviços oferecidos pela camada de transporte são:

6.2.1 Controle de Conexão
       
A camada de transporte possui protocolos que oferecem serviços orientados à conexão e não orientados à  conexão. Os serviços não orientados à conexão tem conceito semelhante ao funcionamento do protocolo IP. Já o serviço orientado à conexão, primeiramente estabelece uma comunicação entre usuários finais e só depois começa a transmissão.

6.2.2 Fragmentação
        Esta função é similar a camada de rede, mas a fragmentação é feita apenas no transmissor e receptor, pois os dispositivos de rede em geral não entendem a camada de transporte. Esta fragmentação não está relacionada com a feita pela camada de rede.
         Para exemplificar, imagine um email (SMTP) enviado apenas com um texto simples como: "Prezada Fulana, vamos sair hoje? Beijos, Fulano". Agora pense num e-mail com todas as fotos de um passeio ou com três arquivos de MP3. Nota-se que uma mensagem SMTP pode conter de alguns bytes até dezenas de megabytes. Logo é necessário fragmentar tais informações em pacotes de tamanhos menores para serem encapsulados pela camada de rede.

6.2.3 Endereçamento
       Conhecemos o endereçamento IP e sabemos que a identificação de um host na Internet é única. Mas imagine duas situações:
        •Um servidor web (HTTP) também é servidor de transferência de arquivos (FTP);
       •Você abre duas janelas do Firefox acessando dois links diferentes de um mesmo site.
       Como identificar dois serviços num mesmo host? Como identificar duas sessões diferentes entre uma estação e um servidor web? Para resolver estas perguntas a camada de transporte oferece à camada de aplicação a função de endereçamento, onde os serviços são identificados pela sua porta (HTTP-80, FTP-20/21, SMTP-25, DNS-53...) e uma conexão entre sua estação e outro host é feita através de um socket1 (IP+porta).

6.2.4 Confiabilidade
        Para garantir a confiabilidade, a camada de transporte oferece:
        • Controle de fluxo;
        • Controle de erros;
        • Controle de congestionamento e Qualidade de Serviço.

6.3 Protocolo TCP (Transmission Control Protocol)      
        O TCP é o protocolo da camada de transporte da arquitetura Internet responsável em oferecer confiabilidade na transmissão. Alguns autores consideram-no como a chave do sucesso da Internet. O TCP fornece um serviço orientado a conexão, confiável e full-duplex para os serviços de aplicação. Para isso:

         • O TCP é orientado à conexão - para ter o controle dos pacotes enviados e conseguir efetuar a fragmentação, o TCP precisa que os usuários finais tenham o controle do que está sendo enviado. O protocolo TCP especifica três fases durante uma conexão: estabelecimento da ligação, transferência e término de ligação. Para estabelecimento da conexão o TCP necessita que: "O cliente inicia a ligação enviando um pacote TCP com a flag SYN activa e espera-se que o servidor aceite a ligação enviando um pacote SYN+ACK. Se, durante um determinado espaço de tempo, esse pacote não for recebido ocorre um timeout e o pacote SYN é reenviado. O estabelecimento da ligação é concluído por parte do cliente, confirmando a aceitação do servidor respondendo-lhe com um pacote ACK" - Wikipedia.
          • Efetua desconexão "suave" (Graceful Connection Shutdown) - O TCP só encerra a conexão depois de entregar os dados ao receptor. A desconexão é feita conforme visto na figura 02.

         • O TCP é Full-duplex - É possível a transferência simultânea nas duas direções durante a sessão.
          • Utiliza o conceito de stream - O TCP envia uma sequencia limitada e contínua de bytes sem noão dos registros ou quantidade de pacotes que serão recebidos. •Enxerga a rede como uma conexão ponto-a-ponto - O protocolo TCP fornece uma conexão diretamente entre aplicativos dos hosts. Tal conexão é denominada conexão virtual ponto-a-ponto, pois entre o transmissor e o receptor, os dispositivos de rede (roteadores) não enxergam a camada de transporte (Figura 03). O TCP permite a camada de aplicação enxergar a rede como uma conexão virtual.

6.3.1 Confiabilidade do TCP
        A Perda de Pacote e Retransmissão - Quando o TCP envia os dados, ele inicializa um mecanismo de timeout (temporizador) para receber a confirmação de recebimento. Caso a confirmação não seja recebida ele retransmite o pacote. A retransmissão é a base do sucesso do TCP. Reflita sobre a retransmissão no atraso de entrega.
        Retransmissão adaptativa e Controle de Tempo - O TCP monitora o atraso do envio dos pacotes e adapta seu temporizador. Mas como ele pode fazer isso se os relógios não são sincronizados? Será que esta técnica é eficiente?

        Controle de Fluxo (buffers e janelas de transmissão) - Um problema no mundo das redes é garantir o controle de fluxo entre usuários finais. A imprevisibilidade do tráfego é o maior problema. Imagine o resultado do vestibular de uma universidade publicado na internet. Diversos usuários irão fazer requisições em pouco tempo podendo ser mais rápido do que a entrega do servidor web. Assim diversas requisições serão novamente realizadas, gerando ainda mais tráfego e pacotes duplicados. Daí o TCP utiliza o conceito de buffers (armazenamento de pedidos e respostas) e janelas deslizantes:

                  • Janela deslizante é uma característica de alguns protocolos que permite que o remetente transmita mais que um pacote de dados antes de receber uma confirmação. Depois de recebê-lo para o primeiro pacote enviado, o remetente desliza a janela do pacote e manda outra confirmação. O número de pacotes transmitidos sem confirmação é conhecido como o tamanho da janela; aumentando o tamanho da janela melhora-se a vazão.

       Controle de Congestionamento - O termo controle de congestionamento, introduzido na Internet no final da década de 80 por Van Jacobson, é usado para descrever os esforços realizados pelos nós da rede para impedir ou responder a condições de sobrecarga. O controle de congestionamento do TCP é realizado por quatro algoritmos [30]: Slow Start, Congestion Avoidance, Fast Retransmite e Fast Recovery. Apesar de serem independentes, esses algoritmos são geralmente implementados de forma conjunta. A seção abaixo descreve o funcionamento desses algoritmos.

6.3.1.1 Algoritmo Slow Start
         StartSlow start é um mecanismo do TCP desenvolvido para iniciar ou reiniciar uma transmissão. A idéia básica desse algoritmo consiste em elevar gradualmente a taxa de transmissão de tráfego na rede até que uma situação de equilíbrio seja atingida.
        O algoritmo slow start adiciona uma nova janela para a fonte chamada de janela de congestionamento (congestion window - cwnd). No início de uma transmissão ou após uma perda de pacote o valor de cwnd é equivalente a um segmento. Para cada ACK recebido, a janela de congestionamento aumenta de um segmento. Para permitir novas transmissões, a fonte deve considerar o tamanho da janela como o mínimo entre a janela anunciada (awnd) e a janela de congestionamento (cwnd), sendo a janela de congestionamento o controle de fluxo imposto pela fonte e a janela anunciada o controle de fluxo imposto pelo destinatário.
      A fonte inicia a transmissão com um segmento e espera o recebimento do respectivo ACK. Quando o ACK é recebido a janela de congestionamento é aumentada de um para dois segmentos, e dois segmentos podem ser injetados na rede. Quando cada um destes dois segmentos for confirmado, a janela de congestionamento é aumentada para quatro segmentos. Apesar do seu nome, o algoritmo slow start proporciona um crescimento exponencial para a janela de transmissão até que o valor de cwnd se iguale awnd.

6.3.1.2 Algoritmo Congestion Avoidance
         Durante a fase inicial  de transferência  de dados  de  uma  conexão TCP, o algoritmo slow start é utilizado. Entretanto, se durante o slow start for necessário descartar um ou mais pacotes devido a congestionamento, o algoritmo congestion avoidance [30] é utilizado para diminuir a taxa de transmissão.
            Esse algoritmo parte do princípio de que a perda de pacotes causada por erro é muito inferior a 1%, e portanto, a perda de pacote é um indício de ocorrência de congestionamento entre a fonte e o destino. O congestionamento pode ser detectado de duas maneiras diferentes: através da expiração do tempo de transmissão (timeout) ou do recebimento de ACK`s duplicados.
       Os algoritmos congestion avoidance e slow start são independentes e têm objetivos distintos. Mas quando ocorre um congestionamento é necessário diminuir a taxa de transmissão dos pacotes na rede, e utilizar o algoritmo slow start para reiniciar o processo de transmissão. Na prática esses algoritmos são implementados em conjunto. Para o trabalho conjunto desses algoritmos, duas variáveis são utilizadas: a janela de congestionamento cwnd e um limiar para slow startdefinido como ssthresh (slow start threshold). O algoritmo combinado está descrito abaixo [30]:

                1. No início de uma conexão, cwnd é igual a um segmento e ssthresh igual a 65536 bytes;
                 2. A janela de transmissão é igual ao mínimo entre as janelas anunciadas e de congestionamento;
          3. Quando  ocorrer  congestionamento (sinalizado por timeout ou pelo  recebimento de três reconhecimentos duplicados), a variável ssthresh é atualizada com a metade do valor atual da janela de transmissão. Adicionalmente, se o congestionamento for sinalizado por um timeout, cwnd é configurado com o valor de um segmento (slow start);
                4. Quando um novo ACK é recebido, a janela de congestionamento cwnd pode ser aumentada de duas maneiras distintas:
                   a. Se o valor de cwnd for menor ou igual a ssthresh, a janela de congestionamento é aumentada de acordo com o algoritmo de slow start, isto é, de um segmento a cada reconhecimento recebido;
                     b. Quando o  valor de cwnd for maior do que ssthresh, prevalece o algoritmo de congestion avoidance, onde cwnd é incrementado de 1/cwnd a cada reconhecimento recebido.
        Enquanto o algoritmo de slow start aumenta a janela de congestionamento exponencialmente, o algoritmo de congestion avoidance corresponde a um crescimento linear de no máximo um segmento por RTT.


6.3.1.3 Algoritmos Fast Retransmit e Fast Recovery
          O protocolo TCP gera um ACK duplicado para informar à fonte que um segmento foi recebido fora de ordem no receptor. A chegada de segmentos fora de ordem pode ocorrer em duas situações: quando há atraso de um dos segmentos (provavelmente por ter seguido um caminho distinto dos outros durante o roteamento) ou quando há perda de um segmento. Para distinguir uma situação da outra, observa-se o número de ACK's duplicados que são recebidos. Para o primeiro caso, apenas um ou dois ACK's duplicados são tolerados. A partir do terceiro é considerada a perda do segmento.
          Quando o algoritmo de fast retransmit estiver sendo utilizado, o recebimento de três reconhecimentos duplicados faz com que a fonte imediatamente retransmita o segmento correspondente sem que se espere pelo estouro do temporizador, aumentando consequentemente a vazão da conexão. Em seguida, o algoritmo congestion avoidance, e não slow start, é executado. A execução do congestion avoidance nesta fase caracteriza o algoritmo fast recovery.
          A razão pela qual não se faz o slow start neste caso é que o recebimento de ACKs duplicados diz mais do que simplesmente um segmento foi perdido. Sabe-se que o nó destino só pode gerar ACKs duplicados quando outro segmento for recebido, isto é, o segmento deixou a camada física e está no buffer do nó de destino. Com isso, podemos concluir que ainda temos dados trafegando entre os dois nós. Então, não é aconselhável reduzir o fluxo abruptamente usando o slow start.

6.4 Protocolo UDP (User Datagram Protocol)
         O UDP é um protocolo da camada de transporte não confiável e não orientado à conexão. Fornece apenas os serviços de endereçamento e fragmentação, não provendo confiabilidade (controle de fluxo, erro, congestionamento). Isso indica que o UDP não adiciona serviços ao protocolo IP. O que nos leva então a utilizar o UDP?
      O UDP por ser mais simples possui um cabeçalho menor gerando um menor overhead. Ideal para algumas aplicações onde a velocidade é mais útil que a confiabilidade como aplicações multimídia. Afinal não faz sentido algum receber um trecho de um arquivo música que já passou.
       Além de aplicações multimídia, o UDP é utilizado também pelo TFTP (Trivial File Transfer Protocol), RIP (Routing Information Protocol), SNMP (Simple Network Management Protocol) e DNS (Domain Name System).
       O segmento UDP é dividido em palavras de 16 bits. As palavras são somadas e ao final calcula-se o complemento de 1.
     A Figura 3.5 ilustra o cálculo do campo de soma de verificação (checksum) considerando apenas duas palavras de 16 bits.

          Observe que no exemplo da Figura 3.5 ocorreu o transbordo do bit 1 que passa a fazer parte de uma terceira palavra de 16 bits (0000000000000001).
         Quando o segmento chega ao receptor mais uma vez ele é dividido em palavras de 16 bits, incluindo o campo checksum que foi calculado na origem. O resultado da soma das palavras de 16 bits no destino deve ser também uma palavra com 16 bits 1.
        A Figura 3.6 apresenta o processo de verificação no destino de acordo com o cálculo do checksum obtido no exemplo da Figura 3.5.

6.5 Demultiplexação e Multiplexação

         Atualmente, a maioria dos sistemas operacionais são multitarefa e executam mais de um processo, permitindo quetais processos compartilhem o processador. Considere, por exemplo, que uma determinada máquina A está executando três processos. Quando a máquina A recebe uma informação da rede essa informação deve ser encaminhada para qual dos três processos?
       A ação de entregar as informações transportadas pelos segmentos (unidade de transporte da camada de transporte) para um processo específico é chamada de demultiplexação. O processo inverso, encaminhar segmentos de diferentes processos em um host de origem através da camada de transporte é chamado de multiplexação.
       Como a camada de transporte fornece uma comunicação lógica entre processos, os protocolos da camada de transporte precisam implementar a multiplexação e a demultiplexação. A Figura 3.2 mostra um exemplo de demultiplexação.

6.6 Sockets
         Conforme já foi discutido, a camada de transporte implementa uma comunicação lógica entre processos. A comunicação entre dois processos exige que os dados trocados atravessem o núcleo da rede passando pelas camadas inferiores (rede, enlace e física). Assim, pode-se dizer que um processo envia e recebe dados diretamente da rede.
      Para um processo que coopera com outro a fim de viabilizar uma aplicação distribuída, a infraestrutura de rede é abstraída por uma interface entre a camada de aplicação e a camada de transporte. Essa interface é chamada de Socket. Quando um processo deseja encaminhar uma informação para outro processo ele encaminha os dados para um socket. O socket é uma espécie de portão onde tudo que chega ou sai de ou para um processo deve passar por ele.
        A Figura 3.3 ilustra os sockets de dois processos que cooperam via rede.

     No processo de desenvolvimento da aplicação o desenvolvedor utiliza uma Application Program Interface (API) para implementar o socket. Note que a abstração da infraestrutura de rede utilizando o conceito do socket simplifica significativamente o trabalho do desenvolvedor da aplicação distribuída. Ele apenas precisa criar o socket e utilizar as referências apropriadas para se comunicar com o processo correto do outro lado da rede.
        O desenvolvedor não precisa saber por quais roteadores os dados serão enviados, qual a tecnologia empregada nos enlaces da rota utilizada ou mesmo qual a rota utilizada. Tal abordagem potencializa o desenvolvimento de novas aplicações, uma vez que é muito simples viabilizar a comunicação entre dois processos via rede utilizando sockets.

By Victor Hugo Xavier                                                                                                                                Postado em 02/05/2016

Crie o seu site grátis! Este site foi criado com a Webnode. Crie o seu gratuitamente agora! Comece agora