pourquoi mtr est beaucoup plus rapide que traceroute?

12

Dans les mtrpages de manuel, on peut lire:

mtr combine les fonctionnalités des programmes traceroute et ping dans un seul outil de diagnostic réseau

J'utilise mtrbeaucoup et je trouve que c'est beaucoup plus rapide que traceroute. Instinctivement, mtrme donne la réponse avec empressement, tout en listant traceroutechaque adresse IP toutes les secondes. Sur mon propre ordinateur, j'ai utilisé time mtr www.google.comet time traceroute www.google.comle résultat est de 21,9 s contre 6,1 s.

La question est pourquoi? Depuis mtr = ping + traceroute, cela ne signifie-t-il pas que c'est plus lent ou au moins le même que traceroute.

Quelqu'un peut-il me donner une réponse raisonnable et détaillée?

cizixs
la source

Réponses:

21

Le parallélisme est une raison majeure de variation de la vitesse de ces outils. Un autre facteur contributif est le temps pendant lequel ils attendent une réponse avant que le saut soit considéré comme ne répondant pas. Si le DNS inversé est effectué, vous devez également attendre cela. La commande plain traceroute devient beaucoup plus rapide si vous désactivez le DNS inversé.

Une autre différence importante, que je n'ai pas vue mentionnée, est la façon dont les deux outils rendent la sortie. Traceroute produit la sortie dans l'ordre descendant. Mtr rend la sortie d'une manière différente, où mtr peut revenir en arrière et mettre à jour la sortie sur les lignes précédentes.

Cela signifie que mtr peut afficher la sortie dès qu'elle est disponible, car si des réponses ultérieures rendent cette sortie imprécise, mtr peut revenir en arrière et la mettre à jour. Étant donné que traceroute ne peut pas revenir en arrière et mettre à jour la sortie, il doit attendre jusqu'à ce qu'il ait finalement décidé ce qu'il affichera.

Par exemple, si le saut numéro 2 ne répond pas (ce qui est un symptôme que j'ai vu sur plusieurs FAI), traceroute affichera le saut numéro 1 puis attendra un moment avant d'afficher le saut numéro 2 et 3. Même si la réponse du numéro de saut 3 est arrivé, il n'est pas affiché car traceroute attend toujours la réponse du saut numéro 2. Mtr n'a pas cette restriction et peut afficher la réponse du saut numéro 3 et revenir en arrière pour afficher la réponse du saut numéro 2, si il arrive plus tard.

Trop de parallélisme peut rendre la sortie imprécise. Dans certains scénarios, le nombre de paquets pour lesquels vous pouvez obtenir des réponses est limité. L'envoi de plus de paquets dans ces cas n'accélérera pas le processus, mais cela entraînera plus de paquets perdus, car vous obtenez le même nombre de réponses avec plus de paquets envoyés.

Un exemple de ceci est lorsqu'un saut sur la route ne répond pas aux requêtes ARP. Habituellement, le premier paquet déclenche une demande ARP, et si plus de paquets arrivent avant l'expiration de la demande ARP, seul le dernier de ces paquets sera mis en mémoire tampon et recevra une réponse.

Une autre différence réside dans le nombre de sauts sans réponse qui seront affichés avant que l'outil cesse d'afficher plus de sauts. J'ai vu la commande traceroute continuer pendant autant de sauts que demandé (30 par défaut), tandis que la commande mtr s'arrêtait dès qu'elle avait passé cinq sauts sans réponse.

kasperd
la source
C'est une bien meilleure réponse.
NickW
3

La commande traceroute envoie 3 sondes par saut si vous la limitez à 1 sonde -q 1alors les résultats deviennent comparables

time mtr -r -c 1 google.com
.
.
.
real    0m2.640s
user    0m0.003s
sys     0m0.018s


time traceroute6 -q 1 google.com
.
.
.
real    0m0.445s
user    0m0.006s
sys     0m0.007s

Je m'attendrais à ce que les principales différences entre des tests comparables soient liées au temps de requête DNS et aux différences de chemin. Vous remarquerez que mon traceroute est plus rapide que le mtr mais ce n'est pas toujours le cas.

user9517
la source
2

Je suppose que cela vient de la façon dont le traçage des routes est implémenté. tracerouteenvoyé au moins 3 paquets pour chaque saut dans la route vers la destination, séquentiellement.

mtr découvrez d'abord les sauts de la route, puis envoyez des paquets à chaque nœud en parallèle.

Il me semble également qu'il existe une différence dans la façon dont les mtrpoignées ne répondent pas aux ping / sondes; il ignore alors plus rapidement que celui traceroutequi semble envoyer ses 3 paquets tout le temps, même si les premières tentatives n'ont pas réussi à obtenir de réponse.

Benoit
la source
1

La raison principale est le fonctionnement de traceroute. Il envoie un paquet UDP (ou ICMP sous Windows) avec un TTL de un au premier hôte, et lorsqu'il reçoit une réponse d'expiration (ou qu'il passe un délai d'expiration interne), il génère ensuite le paquet suivant pour l'hôte suivant avec un TTL de deux, et ainsi de suite (en ajoutant un au TTL pour chaque hôte). Le temps total de traceroute comprend donc l'envoi et la réception de paquets pour chaque hôte, séquentiellement.

mtr, après avoir déterminé le chemin emprunté par les paquets, envoie tous les paquets ICMP ECHO en parallèle.

NickW
la source
Comment mtr sait-il où envoyer les paquets?
user9517
Ouais, je devrais ajouter cela, bien que comment cela "en fait" découvre que je pense qu'il me faudrait lire la source :)
NickW
[mtr] investigates the network connection between the host mtr runs on and a user-specified destination host. After it determines the address of each network hop between the machines
NickW
2
@Iain Il envoie tous les paquets à la seule adresse que vous spécifiez. Les différents paquets spécifient une distance maximale différente pour la distance qu'ils parcourront avant de récupérer une erreur. Les adresses affichées par mtr ou traceroute ne sont connues qu'une fois la réponse renvoyée.
kasperd