Atualmente, estou trabalhando em um projeto que requer NAT transversal, mas parece que estou com dificuldades. Eu tenho a seguinte configuração em execução para testes:
Introdução ao servidor e cliente:
Quando A e B iniciam seu cliente, o cliente envia um "HelloPacket" para o endereço externo de R1 (72.82.59.10) na porta 6666.
Ao receber um HelloPacket, o servidor primeiro verifica se ele já viu o endereço de origem e o identificador da porta de origem.
Após o cliente enviar inicialmente o HelloPacket para o servidor Intro, ele pode esperar receber pacotes chamados IntroPackets do servidor, se houver pares que já tenham se apresentado ao servidor. Estes IntroPackets contêm o ip / port externo e interno de um par.
Agora que o peer conhece os pares existentes, é responsabilidade do recém-conectado enviar um HelloPacket aos pares existentes para informá-los de sua existência. É aqui que estou tendo problemas.
Eu não tenho reputação suficiente para postar imagens, mas aqui está um diagrama que fiz na pintura da configuração: link
Aqui está a ordem dos eventos e o problema que estou enfrentando:
Ponto A: 72,82.59,10, 1024
Ponto B: 72,82.59,10, 1025
O passo 6 é onde meu design está falhando. O Peer A nunca recebe o HelloPacket do ponto B. É do meu conhecimento que quando o roteador recebe um pacote com uma porta de destino de 1024, ele o mapeará para o endereço interno e para a porta usando seu NAT. Está correto?
Eu tentei executar um programa externo que apenas envia datagramas para o endereço externo e a porta mapeada para o cliente A, mas estes não parecem estar passando, então não acho que seja um problema de tempo limite.
Eu também sei que devo tentar conectar-me ao endereço interno e à porta para ver se os clientes estão por trás do mesmo NAT e planejam implementá-lo no futuro.
Além disso, toda a comunicação é feita de forma confiável usando o Go-Back-N no código do cliente e do servidor.
Perguntas:
Qualquer entrada é muito apreciada !! Obrigado!
Tags networking java nat p2p udp