Multiplexação e demultiplexação não orientadas para conexão

Lembre-se, da aula: Programação de aplicações com UDP , de que um programa em Java que roda em um hospedeiro pode criar uma porta UDP com a linha

DatagramSocket mySocket = new DatagramSocket();

Quando uma porta UDP é criada dessa maneira, a camada de transporte automaticamente designa um número de porta ao socket. Em especial, a camada de transporte designa um número de porta na faixa de 1024 a 65535 que não esteja sendo usado naquele instante por qualquer outra porta UDP no hospedeiro. Alternativamente, um programa Java poderia criar uma porta com a linha

DatagramSocket mySocket = new DatagramSocket(19157);   

Nesse caso, a aplicação designa um número de porta específico — a saber, 19157 — à porta UDP. Se o desenvolvedor responsável por escrever o código da aplicação estivesse implementando o lado servidor de um ‘protocolo bem conhecido’, ele teria de designar o número de porta bem conhecido correspondente. O lado cliente da aplicação normalmente permite que a camada de transporte designe o número de porta automaticamente — e transparentemente — ao passo que o lado servidor da aplicação designa um número de porta específico.

Agora que os sockets UDP já têm seus números de porta designados, podemos descrever multiplexação/ demultiplexação UDP com precisão. Suponha que um processo no hospedeiro A, cujo número de porta UDP é 19157, queira enviar uma porção de dados de aplicação a um processo cujo número de porta UDP seja 46428 no hospedeiro B. A camada de transporte no hospedeiro A cria um segmento de camada de transporte que inclui os dados de aplicação, o número da porta da fonte (19157), o número da porta de destino (46428) e mais outros dois valores (que serão discutidos mais adiante, mas que não são importantes para a discussão em curso). Então, a camada de transporte passa o segmento resultante para a camada de rede. Essa camada encapsula o segmento em um datagrama IP e faz uma tentativa de melhor esforço para entregar o segmento ao hospedeiro destinatário. Se o segmento chegar à máquina de destino B, a camada de destino no hospedeiro destinatário examinará o número da porta de destino no segmento (46428) e o entregará a seu socket identificado pelo número 46428. Note que a máquina B poderia estar rodando vários processos, cada um com sua própria porta UDP e número de porta associado. À medida que segmentos UDP chegassem da rede, a máquina B direcionaria (demultiplexaria) cada segmento à porta apropriada examinando o número de porta de destino do segmento. 

É importante notar que um socket UDP é totalmente identificado por uma tupla com dois elementos, consistindo em um endereço IP de destino e um número de porta de destino. Consequentemente, se dois segmentos UDP tiverem endereços IP de fonte e/ou números de porta de fonte diferentes, porém o mesmo endereço IP de destino e o mesmo número de porta de destino, eles serão direcionados ao mesmo processo de destino por meio do mesmo socket de destino. 


É possível que agora você esteja imaginando qual é a finalidade do número de porta da fonte. Como mostra a Figura 3.4, no segmento A-B, o número de porta da fonte serve como parte de um “endereço de retorno” — quando B quer enviar um segmento de volta para A, a porta de destino no segmento B-A tomará seu valor do valor da porta de fonte do segmento A-B. (O endereço de retorno completo é o endereço IP e o número de porta de fonte de A). Como exemplo, lembre-se do programa servidor UDP que estudamos Programação de aplicações com UDP. Em UDPServer. java, o servidor usa um método para extrair o número de porta da fonte do segmento que recebe do cliente; então envia um novo segmento ao cliente, com o número de porta que extraiu servindo como o número de porta de destino desse novo segmento. 


ATIVIDADE DE FIXAÇÃO

Comentários

Postagens mais visitadas deste blog

Wi-Fi: LANs sem fio 802.11

Caches Web

Acesso celular à Internet