JAVA - Obter mac_address

askno

Power Member
Boas alguem me sabe dizer como faço para obter o mac_address de um determinado ip na internet?
Tou a usar a biblioteca jpcap e uso um pacote ARP para obter o mac_address de um determinado IP mas na rede local..
No entanto na internet ja não funciona, e precisava para mandar pacotes IPv4!
Se alguem puder ajudar agradecia. Cumpz
 
Não podes e isto é indepentemente da linguagem que uses.
O MAC é um endereço de rede usado em frames Ethernet e identifica o host de rede por onde o pacote foi reencaminhado até chegar a ti.
Fazendo uma analogia com os CTT. Quando recebes a carta o IP é o endereço da pessoa que te enviou a carta, o MAC é o endereço do posto de correios que te levou a carta até casa.
A única maneira de saberes o MAC desse IP é seres tu a explicitamente transferi-lo na camada aplicacional sobre UDP/IP ou TCP/IP.
 
Obrigado pela explicação! Nesse caso como posso otber o mac_adress do "posto de correio" correspondente ao ip, é que tenciono mandar trafego mas sem ter o mac_adress na camada ethernet nao consigo enviar! Se fosse em rede criava um pacote arp e retornava-me com o endereço mas na net que pacote uso? o ICMP ? Obrigado ;)
 
Não sei se estou a perceber bem a tua dúvida.

Imagina que queres mandar uma carta a um vizinho teu que vive no mesmo prédio (rede) que tu.
Neste caso como sabes onde ele mora fisicamente não precisas dos serviços dos CTT (router) e basta pores a carta na caixa de correio dele (através de um switch). Isto é, não precisas de saber a morada completa dele (IP), basta saberes o andar e o nº de porta (o MAC).
Imagina agora que queres mandar uma carta para um apartado qualquer. Sabes a morada (IP) mas fisicamente não fazes ideias onde fica (não sabes o endereço MAC). Portanto envias a carta para alguém que provavelmente sabe (o default gateway) e que neste caso é o posto de CTT mais próximo.

Respondendo concretamente à tua questão, se queres enviar um pacote a alguém que sabes que está fora da tua rede, isto é não tens respostas do ARP, vais usar como MAC o teu default gateway que é o teu router ou no caso de usares um modem é o default gateway que o ISP fornece por DHCP. Como IP obviamente pões o da morada de destino.

Switch - comuta pacotes numa rede
Router - comuta pacotes entre redes

A analogia desta vez não é exactamente a melhor mas julgo que dá para perceber :)
 
Última edição:
Boas obrigado pelos esclarecimentos ja fiquei a perceber mais, mas ainda assim fiquei com uma duvida. O que eu pretendo é mandar pacotes IPv4 do meu pc para outro pc na internet, mas como tou a programar em baixo nivel com o jpcap, tenho de otber o mac_adress do gateway
"que é o teu router ou no caso de usares um modem é o default gateway que o ISP fornece por DHCP"
ora como obtenho entao o IP e o MAC do default gateway do meu ISP?
Obrigado! abraço


Adaptador PPP TMN:
Sufixo DNS específico da ligação. :
Descrição . . . . . . . . . . . . : WAN (PPP/SLIP) Interface
Endereço físico . . . . . . . . . : 00-53-45-00-00-00
DHCP activado . . . . . . . . . . : Não
Endereço IP . . . . . . . . . . . : 89.214.203.22
Máscara de sub-rede . . . . . . . : 255.255.255.255
Gateway predefinido . . . . . . . : 89.214.203.22
Servidores DNS. . . . . . . . . . : 212.55.154.174
10.11.12.14
Servidor WINS principal . . . . . : 10.11.12.13
Servidor WINS secundário . . . . .: 10.11.12.14
 
Ok obrigado mais uma vez ;) portanto na rede da minha universidade consigo fazer isso pois faço arp ao default gateway

Descrição . . . . . . . . . . . . : Intel(R) Wireless WiFi Link 4965AGN
Endereço físico . . . . . . . . . : 00-13-E8-36-E6-EF
DHCP activado . . . . . . . . . . : Sim
Autoconfiguração activada . . . . : Sim
Endereço IP . . . . . . . . . . . : 172.19.105.42
Máscara de sub-rede . . . . . . . : 255.255.240.0
Gateway predefinido . . . . . . . : 172.19.111.254
Servidor DHCP . . . . . . . . . . : 193.137.17.45
Servidores DNS. . . . . . . . . . : 193.137.17.5
193.137.17.45

e retorna-me o mac adress, agora na minha placa 3G

Adaptador PPP TMN:
Sufixo DNS específico da ligação. :
Descrição . . . . . . . . . . . . : WAN (PPP/SLIP) Interface
Endereço físico . . . . . . . . . : 00-53-45-00-00-00
DHCP activado . . . . . . . . . . : Não
Endereço IP . . . . . . . . . . . : 89.214.203.22
Máscara de sub-rede . . . . . . . : 255.255.255.255
Gateway predefinido . . . . . . . : 89.214.203.22
Servidores DNS. . . . . . . . . . : 212.55.154.174
10.11.12.14
Servidor WINS principal . . . . . : 10.11.12.13
Servidor WINS secundário . . . . .: 10.11.12.14

suspostamente o Gateway é igual ao meu endereço IP e nao consigo fazer ARP diz-me is not a local address! Obrigado pela ajuda ;) abraço
 
Pois, no caso da tua placa de rede não estás ligado por Ethernet, mas por PPP over Ethernet vulgo PPPoE. Aliás pelo output que puseste é SLIP que é um antecedente do PPP e que só transporta IP e não outros protocolos nível 3.
De qualquer forma, o objectivo destes protocolos ponto a ponto, é permitir entre outras coisas definir caracteristicas do circuito (virtual) e autenticá-lo com username/password via CHAP ou PAP (protocolos de autenticação que assentam sobre PPP e que são usados na fase inicial de estabelecimento do circuito), coisas que não existem em Ethernet.

Os programas que se ligam à Internet continuam todos a funcionar porque trabalham ao nível IP para cima (TCP>HTTP p ex.) que por sua vez assentam em Ethernet no caso da tua UNI ou em PPP no caso da tua placa 3G. O SO baseando-se na tabela de routing (comando route no windows/linux) vai ver que interface trata desse endereço específico e por algum tipo de método chama o driver que controla essa interface (driver génerico do Win ou da Huawei para a placa 3G), delegando a tarefa de envio do pacote para este. O driver constrói um novo pacote Ethernet + PPP e encapsula o pacote IP que recebeu, enviando-o de seguida e físicamente por HSDPA (3G).

Agora que eu próprio estou um bocado mais elucidado (nada como ir lendo umas coisas) e espero que tu também, portanto acho que concordas comigo que não vais ser capaz de construir o pacote por inteiro e enviá-lo para a rede, pelo menos não nos SO's convencionais.
A maneira padrão de comunicar com interfaces de rede é por sockets e se já trabalhaste com sockets vais reparar que MACs nem vê-los. É o SO que o controla e faz as chamadas ARP e afins por ti.
Podes programar um driver para controlar a placa 3G mas é melhor nem ir por aí :)

Bom tópico :)
Já agora, o que andas a fazer ao certo?
 
Última edição:
Boas obrigado mais uma vez ;)
Tou a fazer um trabalho para uma cadeira de Redes, tenho de fazer um gerador de trafego sintectico, seguindo distruibuições Poisson Burst ou Periodic para simular diferentes tipos de trafego como voip, p2p, http etc, e tenho editar o campo TOS (Type Of Service) porque alguns ISP's pelos vistos usam-no para diferenciar o trafego e assim atribuir diferente tratamento aos pacotes, e no receptor vou fazer analise de desempenho, o objectivo final é ver as diferenças de desempenho na net consoante o diferente TOS.
Mas pelos vistos como tu disseste com a placa 3G nao vai ser possivel fazer isso pelo menos em java.. Porque com sockets ou datagram nao vou conseguir mudar o Type Of Service daí tar a usar jpcap.
Mas pronto tou arrependido de ter usado java é que se tiver ligado no mesmo router ate consigo enviar pacotes IP por wireless no entanto o java mede com erros as chegadas dos pacotes o que torna toda este trabalho inutil...
Por exemplo faço um contador usando a System.nanoTime () e marco todos os pacotes enviados ou seja se enviar pacotes de 200 em 200ms eles vao ter um timestamp de 0, 200, 400, 600, 800, ...
no receptor inicio contador assim que chega o 1 pacote ou seja deveria chegar qq coisa como 0 201 403 606 se o atraso medio fosse 3ms, e ate chega assim segundo o wireshark, so que o meu receptor mede tipo isto 0 183 394 etc ou seja isto ate poderia ser possivel se o router tivesse cache ou algum contexto especifico sei la o pacote tomar outros caminhos e chegarem 2 quase ao mesmo tempo, mas claro o wireshark veio desmentir-me esta possibilidade ou seja é mesmo da porcaria do java... nao percebo.. e tb mostrei o codigo ao meu professor e ele disse que realmente nao tava a detectar nenhum erro no meu codigo poderia ser do java..
De qualquer das maneiras obrigado pela ajuda ;) ainda vamos tentar ver medições de outra maneira por relogio sincronizado o meu prof falou no procolo NTP e em relação
a mandar pacotes marcados pela net so mesmo com router/modem dado que com a placa 3G isso nao vai ser possivel ne.
Bem sorry o testamento lol... Abraço
 
Back
Topo