Acabei de executar o Fing na minha rede sem fio. Usando tcpdump
, parece que a Fing gera pacotes de solicitação Protocolo de resolução de endereços (ARP). O ARP é um protocolo bastante simples que é executado no nível do protocolo Ethernet (link de dados, nível OSI 2). Um pacote de solicitação ARP tem o endereço de transmissão (ff: ff: ff: ff: ff: ff) como o endereço "to", o endereço MAC e IP do telefone Android como a informação "de" e um endereço IP que o Fing deseja saber sobre. Parece que o Fing apenas percorre qualquer sub-rede, no meu caso 172.31.0.0/24, portanto, 255 endereços IP, de 172.31.0.1 a 172.31.0.254. Após a marcha, parece tentar endereços IP que não responderam uma segunda vez. Isso me parece que o Fing tenta endereços IP em lotes e confia no kernel Linux subjacente para armazenar em buffer respostas ARP, para que um thread de Fing lide o mais rápido possível. Se Fing decidir que há um tempo limite, ele reenvia. Não está claro para mim como o Fing (um programa Java) obtém o kernel do Linux do telefone para gerar pacotes ARP.
O notório nmap , chamado com -sn
, o sinalizador "ping scan", faz a mesma coisa. Eu fiz um strace
on nmap -sn 172.31.0.0/24
para ver como o kernel envia solicitações ARP. Parece que nmap
cria um soquete TCP / IP comum e chama connect()
no soquete para a porta TCP 80, com um endereço IP. nmap
deve estar fazendo isso no modo sem bloqueio, já que faz um grande número de connect()
chamadas sequencialmente, mais rápido do que seria necessário para o Linux decidir o tempo limite de um connect()
quando não há host com o endereço IP .
Portanto, há sua resposta: criar um soquete TCP / IP, chamar connect()
com uma porta e um endereço IP específicos e, em seguida, ver qual é o erro. Se o erro for ECONNREFUSED, é um endereço IP ativo, mas nada está escutando nessa porta. Se você obtiver uma conexão TCP, esse endereço IP terá um host. Endereços IP que a chamada connect()
atinge, não tem uma máquina associada. Você precisa agrupar as chamadas de connect()
, e você precisa esperar que as chamadas connect()
expirem para decidir se um endereço IP não tem uma máquina associada a ele.