Comment fonctionne ping (8)?


4

J'apprenais les bases du serveur / client, dans le cadre du développement de mes compétences en programmation réseau.

Donc, fondamentalement, j'écris le serveur en écoute sur un port, et le client s'y connectant et le flux de données continue ...

Maintenant je suis fasciné comment ping est capable de recevoir une réponse de la machine distante, sans aucun service y répondant? Ou je me trompe ici?


Voir ma réponse mise à jour pour savoir comment ping peut accéder aux messages ICMP reçus
artistoex

Réponses:


10

Comme le ping (plus précisément, les requêtes d'écho ICMP) fait partie du protocole Internet, votre pile réseau (qui est la mise en œuvre du protocole de votre système d'exploitation) répond à ces requêtes.

Ce n'est ni TCP, ni UDP, ni aucun autre protocole de transport. Dans l'en-tête Internet, un champ de protocole indique le type de charge utile contenu dans le paquet IP. Pour les paquets TCP, ce champ indique TCP. Pour les paquets ping, cela indique ICMP.

Btw. ce n'est pas la seule utilisation d'ICMP. Par exemple. quand le TTL d’un paquet tombe à zéro lorsqu’il voyage sur le réseau, il est rejeté et l’expéditeur est averti par un paquet ICMP.

Si vous vous demandez comment ping (8) parvient à afficher les réponses ICMP reçues à partir de l'espace utilisateur, à l'aide de l'API de socket. Voici la section pertinente du code source:

/* 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);

5

Oui, vous vous trompez légèrement.

Lorsqu'un demande de ping est envoyé à un hôte, conformément à la norme (RFC 1122), un hôte doit répondre. Il y a donc un "service" qui y répond. Ce n'est pas un service de niveau application - la pile TCP / IP elle-même est le "service" qui répond.

Ping est sans session - c'est ce qui pourrait vous dérouter. Ping utilise une adresse IP qui ne nécessite pas l'établissement d'une session par négociation (contrairement à TCP). Lorsque vous avez écrit votre programme pour votre classe, je parierais que vous l'avez écrit en utilisant des sockets TCP.


Cela devient drôle quand la documentation sur les règles sans état d’iptables parle de «connexions» ping :-) quand il ya vraiment moins de connexion.
artistoex

3
UDP? Faux. Il utilise ICMP sur IP.
artistoex

@artistoex, tu as raison. Je vais éditer. J'ai UDP sur le cerveau - faire quelque chose avec. :)
John

@artistoex, à propos d'iptables, je pense qu'il est plus difficile pour les gens d'imaginer des connexions "moins de connexion". Il est simplement plus facile d'utiliser génériquement une référence à un terme commun, par exemple. "bande passante" vs "vitesse". etc.
John

Désolé, je voulais dire iptables stateful règles
artistoex

2

ping Effectuez en fait une requête ICMP sur la pile IP elle-même, de sorte qu'aucun service de la machine ne l'enregistrera, mais si vous avez quelque chose comme LeadShark en cours d'exécution, vous pouvez détecter les paquets de cette façon.


Contre le NIC? C'est faux.
artistoex

Corrigée. Excuses, encore tôt ici ....
Jared Tritsch

Corrigé, c'est juste la pile IP, il n'y a pas TCP impliqué ( ICMP prend sa place)
Darth Android
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.