Como o ping (8) funciona?

4

Eu estava aprendendo noções básicas de servidor / cliente, como parte do meu desenvolvimento de habilidades de programação de rede.

Então, basicamente eu escrevo servidor escutando em alguma porta, e cliente conectando-se a ele e o fluxo de dados continua ...

Agora estou fascinado como o ping é capaz de receber resposta da máquina remota, sem nenhum serviço respondendo a isso? Ou estou confundindo aqui?

    
por JalilKarimov 11.10.2012 / 16:43

3 respostas

10

À medida que o ping (mais precisamente, solicitações de eco ICMP) faz parte do Protocolo da Internet, sua pilha de rede (que é a implementação do protocolo do seu sistema operacional) atende a essas solicitações.

Não é nem TCP nem UDP nem qualquer outro protocolo de transporte. No cabeçalho da Internet, há um campo de protocolo que indica o tipo de carga útil que o pacote IP contém. Para pacotes TCP, esse campo indica TCP. Para pacotes de ping, indica ICMP.

Entre. este não é o único uso do ICMP. Por exemplo. quando o TTL de um pacote cai para zero enquanto viaja pela rede, ele é descartado e o remetente é notificado por um ICMP pacote.

Se você quer saber como ping (8) consegue exibir as respostas recebidas de ICMP do espaço do usuário, ele faz isso usando a API de soquete. Esta é a seção relevante do código-fonte:

/* Initialize raw ICMP socket */
proto = getprotobyname ("icmp");
if (!proto)
  {
    fprintf (stderr, "ping: unknown protocol icmp.\n");
    return NULL;
  }

fd = socket (AF_INET, SOCK_RAW, proto->p_proto);
    
por 11.10.2012 / 16:48
5

Sim, você está um pouco enganado.

Quando uma solicitação de ping é enviada para um host, pelo padrão (RFC 1122), um host deve responder. Assim, há um "serviço" respondendo a ele. Não é um serviço de nível de aplicativo - a pilha TCP / IP em si é a resposta do "serviço".

O ping é sem sessão - o que pode estar confundindo você. Ping usa IP que não requer que uma sessão seja estabelecida através de negociação (o que o TCP faz). Quando você escreveu seu programa para sua classe, eu aposto que você o escreveu usando soquetes TCP.

    
por 11.10.2012 / 16:48
2

ping na verdade faz uma requisição ICMP contra a própria pilha IP, então nenhum serviço na máquina irá registrá-la, mas se você tem algo como wireshark rodando, você pode detectar os pacotes dessa maneira.

    
por 11.10.2012 / 16:47