Comunicar dois computadores em redes diferentes por UDP

1. Comunicar dois computadores em redes diferentes por UDP

Samuel
samuelVoador

(usa Debian)

Enviado em 21/07/2017 - 02:24h

Estou com uma dúvida bem estúpida, como que comunico dois computadores que estão em redes diferentes utilizando o protocolo UDP?
Vou tentar explicar melhor:

Tenho um computador "1" que está numa rede local, e nessa rede está com o ip local 192.168.1.3
Tenho outro computador "2" que está em outra rede local, também com o ip local 192.168.1.3(coloquei o mesmo só para ressaltar que estão em duas redes diferentes).

Então o computador 1 está conectado a internet e tem o ip global 159.28.10.66
Então o computador 2 também está conectado a internet e tem o ip global 176.13.40.58

Quero comunicar esses dois computadores utilizando o protocolo UDP, como que faria? Estou querendo uma conexão peer-to-peer, não consigo imaginar como funciona, li que jogos MOBA utiliza esse tipo de conexão, que é por UDP, mas ainda não entendi, como que é feita essa comunicação entre os dois computadores. Você loga na sua conta, ai o servidor do jogo irá ver que você está online e tem você e mais um conectado, por exemplo, ai ele fala, vou passar informação de um para o outro e assim os dois podem se conectar um com outro. Se for assim, o que é feito, ele passa o ip global de um para outro? e se também for assim, como do ip global vai saber qual é o ip local? Acho isso tudo muito confuso.

Antes de tudo, para entende melhor a questão, lembrem-se como era a internet no seu inicio, cada nó da rede havia um único ip válido, porém com a quantidade de nós que foram acrescentados ficou inviável, mesmo com o IPV4 não há números suficientes(ips) para satisfazer todos nós da grande rede, então assim houve a necessidade de criar algo para contornar isso, e surgiu o NAT e as redes locais, a internet não era mais apenas uma grande rede, mas um conjunto de várias outras redes, e o que esse NAT faz? Com ele foi possível traduzir um ip local(ex seu: 192.168.0.6) em um ip global válido na internet, existem vários tipos de NAT, mas o mais comum é o que nos permite utilizar um único ip global(o qual provavelmente é disponibilizado para você por sua contratante) para vários computadores em uma rede local, e o NAT que cuida disso para você, e como ele faz isso? um exemplo, temos um computador em uma rede local com ip local 192.168.0.4 que deseja acessar o https://www.vivaolinux.com.br, abaixo passo-a-passo como acontece:

1 - O usuário do host da rede interna 192.168.0.4 digita no navegador o site do "vivaolinux"

2 - O pacote contendo as informações é encaminhado ao NAT

3 - O NAT retira as informações do IP interno e associa a requisição a uma porta unica, ex: 65660

4 - O NAT envia o pedido ao site

5 - O Site responde

6 - O NAT confere a porta e manda os pacotes para o host que solicitou

referência: http://www.purainfo.com.br/artigos/o-que-e-como-funciona-o-nat/

Mas ai você lembrou do IPV6, e com o IPV6 não será mais necessário o uso de NAT? Possivelmente ainda usaremos, acabamos gostando da segurança adicional e privacidade que o NAT e as redes locais nos trouxeram. E o NAT também é útil para interoperabilidade entre IPV4 e o IPV6, pelo menos a curto prazo acredito que o NAT não irá desaparecer.

Então é só conectar ambos computadores no caso da questão? não é bem assim, pois o NAT bloqueia qualquer tráfico recebido que não seja configurado para ser recebido, mas pense, quando você joga algum jogo ou usa uma aplicação(claro, estou me referindo especificamente ao ponto da questão P2P-UDP), você não tem que permitir ou liberar porta alguma, como isso acontece?

Para uma comunicação UDP, peer-to-peer, é necessário 4 informações(IP local, porta local, IP remoto, porta remota), ou seja traduzindo para o caso da questão(IP local do computador 1, porta do computador 1, IP local do computador 2, porta do computador 2), então como conectaríamos os dois computadores que estão em redes diferentes(ou seja, possuem NATs diferentes), pois assim seria(IP local e global do computador 1, porta local e global do computador 1, IP local e global do computador 2, porta e global do computador 2)?

Existe uma forma, se chama perfuração UDP(UDP Hole Punching), e precisaremos de um servidor para isso, este servidor irá recolher as informações do computador 1 e do computador 2 e compartilhar de um para o outro para que eles possam se conectar diretamente. Irei explicar abaixo uma das maneiras de utilizar "UDP Hole Punching" no caso da questão com dois computadores em NATs diferentes:

1 - Computador 1 e computador 2 iniciaram uma sessão com o servidor com a porta local 4321 para a porta 1234 no servidor.

2 - O NAT do computador 1 atribui a porta 63600 para o ip global(público, no caso da questão, seria o 159.28.10.66). O NAT do computador 2 atribui a porta 30100 para o ip global(público, no caso da questão, seria o 176.13.40.58).

3 - O computador 1 envia os IPs e portas locais(privados) e globais(públicos) para o servidor. O computador 2 faz a mesma coisa.

4 - Agora o computador 1 pede ajuda do servidor para se conectar ao computador 2, então o servidor passa as informações para o computador 1, o IP e porta local(privado) e global(público) do computador 2. E o servidor passa as informações para o computador 2, o IP e porta local(privado) e global(público) do computador 1.

5 - O computador 1 e computador 2 podem enviar pacotes um para o outro.

referência: http://www.brynosaurus.com/pub/net/p2pnat/
http://www.raknet.net/raknet/manual/natpunchthrough.html

E se dois usuários tiverem dentro de uma mesma rede(com um mesmo NAT)? não irei explicar aqui, mas no link acima explica, e também o caso de existir mais de uma camada, ou seja um NAT em cima de outro NAT.

Então consegui entender e responder a questão que estava com dúvida, agora gostaria de saber, preciso implementar isso em meu jogo, está portado para android, enviar os pacotes por UDP eu já implementei com uma API para isso( na verdade estou terminando de escreve-la utilizando Enet, não sei ainda se funciona, mas espero que sim kkk), gostaria é de saber, e do lado do servidor, existe alguma API que faça essa "perfuração de NAT", e se é essa a melhor forma de comunicar dois computadores por UDP-P2P(P2P pois a API que estou escrevendo é P2P, não é necessário ser cliente-servidor, pois é apenas 2 ou no máximo 3 jogadores, o que P2P segura numa boa) para jogos multiplayer em tempo real?


  


2. Re: Comunicar dois computadores em redes diferentes por UDP

Giovanni  M
Giovanni_Menezes

(usa Devuan)

Enviado em 21/07/2017 - 02:32h

O que seria precisamente "comunicar" ?

O protocolo UDP não faz uso de confirmação de pacotes, devido a essa natureza ele é um protocolo de uso muito especifico, por exemplo para transferência de arquivos, que não pode haver perda de pacotes, ele não serve.


--------------------------------------------------------------------------
Somente o Software Livre lhe garante as 4 liberdades.
Open Source =/= Free Software.
https://goo.gl/mRzpg3
http://www.anahuac.eu/contrarrevolucao-osi/


3. Re: Comunicar dois computadores em redes diferentes por UDP

Samuel
samuelVoador

(usa Debian)

Enviado em 21/07/2017 - 02:47h

Isso, mas sei como funciona o protocolo UDP, e ele é utilizado para o multiplayer em tempo real de jogos justamente por essa característica de não reenviar o pacote, pois se tivesse, seria muito lag, o TCP só funciona para jogos em turno, UDP para jogos como MOBA ou MMORPG que perder um ou mais pacotes não importa tanto, pois você vai sincronizar mesmo é a direção x,y por exemplo de um personagem, que está sempre se movimentando.

Disse comunicar, para não confundir, pois no UDP não há conexão como no TCP, ele não estabelece conexão, apenas envia.


4. Re: Comunicar dois computadores em redes diferentes por UDP

Leandro Silva
LSSilva

(usa Outra)

Enviado em 21/07/2017 - 15:37h

No caso, caro amigo, você queria que houvesse comunicação entre esses dois hosts.
Você terá primeiro que estabelecer comunicação entre eles. Isso deriva de uma série de fatores/procedimentos. Uma forma simples de haver comunicação entre eles é criar uma VPN, configurar um HAMACHI, etc. Depois de criada a comunicação os dois hosts poderão se comunicar utilizando protocolo UDP,TCP,ICMP,etc.
Porém você tem que fazer com que se comuniquem.
Se estes IP's são válidos (não estão atrás de nenhum NAT (se você conhece UDP, conhece NAT), você poderia simplesmente criar o server (se o intuito é jogar) em um dos hosts, direcionar a porta no modem/router e acessar do outro host naquela porta (você já sabe os IP's).


5. Re: Comunicar dois computadores em redes diferentes por UDP

Samuel
samuelVoador

(usa Debian)

Enviado em 21/07/2017 - 16:25h

LSSilva escreveu:

No caso, caro amigo, você queria que houvesse comunicação entre esses dois hosts.
Você terá primeiro que estabelecer comunicação entre eles. Isso deriva de uma série de fatores/procedimentos. Uma forma simples de haver comunicação entre eles é criar uma VPN, configurar um HAMACHI, etc. Depois de criada a comunicação os dois hosts poderão se comunicar utilizando protocolo UDP,TCP,ICMP,etc.
Porém você tem que fazer com que se comuniquem.
Se estes IP's são válidos (não estão atrás de nenhum NAT (se você conhece UDP, conhece NAT), você poderia simplesmente criar o server (se o intuito é jogar) em um dos hosts, direcionar a porta no modem/router e acessar do outro host naquela porta (você já sabe os IP's).


reformulei a pergunta, da uma conferida se puder.


6. Re: Comunicar dois computadores em redes diferentes por UDP

Leandro Silva
LSSilva

(usa Outra)

Enviado em 21/07/2017 - 16:40h

samuelVoador escreveu:

LSSilva escreveu:

No caso, caro amigo, você queria que houvesse comunicação entre esses dois hosts.
Você terá primeiro que estabelecer comunicação entre eles. Isso deriva de uma série de fatores/procedimentos. Uma forma simples de haver comunicação entre eles é criar uma VPN, configurar um HAMACHI, etc. Depois de criada a comunicação os dois hosts poderão se comunicar utilizando protocolo UDP,TCP,ICMP,etc.
Porém você tem que fazer com que se comuniquem.
Se estes IP's são válidos (não estão atrás de nenhum NAT (se você conhece UDP, conhece NAT), você poderia simplesmente criar o server (se o intuito é jogar) em um dos hosts, direcionar a porta no modem/router e acessar do outro host naquela porta (você já sabe os IP's).


reformulei a pergunta, da uma conferida se puder.


Reformulou mesmo! :)

Então, nessa ideia que citou irá precisar de um intermediário (servidor), o que vai te dar mais trabalho dependendo do que você quer.
Neste seu cenário, algum dos dois pontos assumirá papel de servidor (creio que não será seu android :))?
Se sim, então você deve ir ao modem (do provedor de internet) e configurar um "port forwarding". Você irá fazer o seguinte, irá dizer ao modem que qualquer pacote que chegar na interface de internet (wan) que estiver direcionado para porta UDP do seu servidor MOBA deverá ser direcionada para o host da rede interna na mesma porta (no caso o 192.168.0.3). E ao conectar o cliente ao servidor irá usar o ip válido dele ("ip global") na porta que ele está executando.
Se não, terá que configurar um servidor do jogo em um outro IP Válido e fazer o procedimento acima nele e assim os dois hosts se conectarem à este servidor.

A resposta positiva é a menos trabalhosa.
Se positiva, sabe me dizer o modelo do seu modem?
Se utiliza server linux no lado "servidor" e utiliza firewall iptables, pode usar a seguinte regra:
iptables -t nat -A PREROUTING -i "INTERFACE INTERNET" -p udp --dport PORTADOSERVIDORMOBA -j DNAT --to-destination 192.168.1.3:PORTADOSERVIDORMOBA;



7. Re: Comunicar dois computadores em redes diferentes por UDP

Samuel
samuelVoador

(usa Debian)

Enviado em 21/07/2017 - 16:49h

LSSilva escreveu:

samuelVoador escreveu:

LSSilva escreveu:

No caso, caro amigo, você queria que houvesse comunicação entre esses dois hosts.
Você terá primeiro que estabelecer comunicação entre eles. Isso deriva de uma série de fatores/procedimentos. Uma forma simples de haver comunicação entre eles é criar uma VPN, configurar um HAMACHI, etc. Depois de criada a comunicação os dois hosts poderão se comunicar utilizando protocolo UDP,TCP,ICMP,etc.
Porém você tem que fazer com que se comuniquem.
Se estes IP's são válidos (não estão atrás de nenhum NAT (se você conhece UDP, conhece NAT), você poderia simplesmente criar o server (se o intuito é jogar) em um dos hosts, direcionar a porta no modem/router e acessar do outro host naquela porta (você já sabe os IP's).


reformulei a pergunta, da uma conferida se puder.


Reformulou mesmo! :)

Então, nessa ideia que citou irá precisar de um intermediário (servidor), o que vai te dar mais trabalho dependendo do que você quer.
Neste seu cenário, algum dos dois pontos assumirá papel de servidor (creio que não será seu android :))?
Se sim, então você deve ir ao modem (do provedor de internet) e configurar um "port forwarding". Você irá fazer o seguinte, irá dizer ao modem que qualquer pacote que chegar na interface de internet (wan) que estiver direcionado para porta UDP do seu servidor MOBA deverá ser direcionada para o host da rede interna na mesma porta (no caso o 192.168.0.3). E ao conectar o cliente ao servidor irá usar o ip válido dele ("ip global") na porta que ele está executando.
Se não, terá que configurar um servidor do jogo em um outro IP Válido e fazer o procedimento acima nele e assim os dois hosts se conectarem à este servidor.

A resposta positiva é a menos trabalhosa.
Se positiva, sabe me dizer o modelo do seu modem?
Se utiliza server linux no lado "servidor" e utiliza firewall iptables, pode usar a seguinte regra:
iptables -t nat -A PREROUTING -i "INTERFACE INTERNET" -p udp --dport PORTADOSERVIDORMOBA -j DNAT --to-destination 192.168.1.3:PORTADOSERVIDORMOBA;


O problema é que não será eu, nunca saberei o modelo, pode ser qualquer usuário, o que penso em fazer, é ter um servidor onde os usuários estarão cadastrados em um banco de dados, onlines ou offline, exemplo, um novo usuário abriu uma sessão com o servidor, o servidor então verifica se há algum usuário online, se tiver, passa informações de um usuário para o outro e eles podem se conectar. O queria saber é se existe uma API já para lidar com isso.



8. Re: Comunicar dois computadores em redes diferentes por UDP

Leandro Silva
LSSilva

(usa Outra)

Enviado em 21/07/2017 - 17:57h

Pois é, nessa parte(API) já não sei te ajudar.
Porém se houver necessidade de montar um servidor dedicado do software em questão, as dicas acima poderão valer de alguma coisa (se for você a configurar, é claro).


[]'


9. Re: Comunicar dois computadores em redes diferentes por UDP

Samuel
samuelVoador

(usa Debian)

Enviado em 21/07/2017 - 18:08h

LSSilva escreveu:

Pois é, nessa parte(API) já não sei te ajudar.
Porém se houver necessidade de montar um servidor dedicado do software em questão, as dicas acima poderão valer de alguma coisa (se for você a configurar, é claro).


[]'


Me confundi de novo aqui.

Se eu tenho um servidor(não NAT), e dois computadores em NATs diferentes, como que faria? conectaria primeiramente os dois computadores com o servidor, assim o servidor teria o IP:porta publico de ambos, então eu passaria para cada um as informações do outro assim eles podem agora se conectar. O que ainda não entendo, veja aqui http://www.brynosaurus.com/pub/net/p2pnat/, é o porque preciso passar os IPs privado dos computadores para o servidor, e como é feito isso, e agora olhando para o enet, eu conectaria usando o endereço publico e porta certo? então para que preciso do privado?


10. Re: Comunicar dois computadores em redes diferentes por UDP

Leandro Silva
LSSilva

(usa Outra)

Enviado em 24/07/2017 - 08:12h

Se houver um servidor com um IP válido em alguma das interfaces de rede, não precisa de passar IP privado. No caso o IP privado é utilizado quando o servidor está atrás de um NAT, então o pacote chegará direcionado ao IP válido do NAT (IP destino/Porta) e será direcionado à um IP privado neste escopo (via regra de direcionamento já exemplificada nesta discussão). Se há um servidor com IP válido e aceitando conexões em um porta onde roda uma aplicação, do servidor de jogos, por exemplo, então não há necessidade de configurações adicionais; apenas libere a porta no servidor e conecte as estações (onde for) utilizando o IP válido do servidor (externo) e porta da aplicação. Não terá problemas com isso.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts