Na verdade, o traceroute no Linux moderno tem opções que combinam com o comportamento mtr (e vice-versa). Podemos ver que isso é apenas uma questão de padrões.
traceroute
foi o original. Os detalhes do método original podem ser inferidos do documentação , mas não foi considerado necessário explicá-lo. Como o traceroute do Linux adicionou várias opções, as diferenças são descritas.
O padrão dedefault
The traditional, ancient method of tracerouting. Used by default.
Probe packets are udp datagrams with so-called "unlikely" destination ports. The "unlikely" port of the first probe is 33434, then for each next probe it is incremented by one.
icmp
Most usual method for now, which uses icmp echo packets for probes. If you can ping(8) the destination host, icmp tracerouting is applicable as well.
mtr
parece ser icmp, o "método mais comum para agora".
Conclusão
Espera-se que o roteamento de vários caminhosmantenha os pacotes da mesma conexão no mesmo caminho. Isso evita a entrega fora de ordem, o que pode ser bastante indesejável. Ele faz isso olhando o endereço e a porta da origem e do destino. (Juntamente com o protocolo. Esses valores são descritos como "5-tupla").
O padrão de% p_de% do% altera a porta UDP de cada teste, então eles alteram os caminhos.
O padrão traceroute
usa o eco ICMP, que não possui um número de porta e, portanto, seus testes seguirão o mesmo caminho.
Se você solicitar o traceroute UDP ou TCP em mtr
, os diferentes caminhos serão exibidos. Pode haver outras diferenças em comparação com mtr
, mas a esse respeito acontece de se comportar de maneira semelhante.
Sidetrack: por que o icmp não foi usado?
Portanto, o Linux traceroute
permanece fiel ao original, incluindo sua opção de modo padrão. Mas a razão para a escolha original não está totalmente clara.
Lembrei-me de ler traceroute
:
commercial [IPv4] routers do not return enough information in icmp error messages. Probably, it will change, when they will be updated. For now [tracepath] uses Van Jacobson's trick, sweeping a range of UDP ports to maintain trace history.
no entanto, o ponto é que man tracepath
usa recursos mais novos para evitar a necessidade de privilégios de root. O problema mencionado é que as respostas de erro ICMP não incluiriam a carga útil de um pacote UDP . A carga de um pacote de eco ICMP seria incluída (mas a geração desses testes requer raiz).
Traceroute varies (increments) the UDP destination port number for each probe sent out, in order to reliably match ICMP TTL Exceeded messages to individual probes. Because the UDP ports occur right after the IP header, they can be relied on to be included in the "original packet" portion of the ICMP TTL Exceeded messages, even though the ICMP standards only mandate that the first eight octets following the IP header of the original packet be included in ICMP messages (it is allowed to send more though).
When ICMP ECHO requests are used, the probes can be disambiguated by using the sequence number field, which also happens to be located just before that 8-octet boundary.
PERT prossegue sugerindo
It is believed that this is because at that time, some gateways (as routers were called then) refused to send ICMP (TTL exceeded) messages in response to ICMP messages, as specified in the introduction of RFC 792, "Internet Control Message Protocol". Therefore the UDP variant was more robust.
Os comentários do código fonte explicar o uso da porta UDP também, mas não o uso de UDP sobre o eco ICMP. Uma leitura estrita sugere uma outra possibilidade
since icmp's aren't sent for icmp's
No contexto, o ponto é que os erros icmp nunca são enviados em resposta a uma resposta icmp , a fim de evitar um ciclo infinito de respostas. É certamente plausível que as implementações apliquem isso a todos os pacotes icmp, em vez de apenas respostas. Os comentários também mencionam vários bugs de implementação, que os usuários tinham que ter em mente para interpretar o resultado do traceroute.
No entanto, também é possível que Van Jacobson tenha confundido o ponto. Pode-se simplesmente ter assumido que os erros icmp não seriam retornados para qualquer pacote icmp, com vista a que isso não se aplicasse necessariamente às solicitações icmp echo.
Don't use this as a coding example. I was trying to find a routing problem and this code sort-of popped out after 48 hours without sleep. I was amazed it ever compiled, much less ran.