Every network engineer has both tools in muscle memory, and most of us reach for one out of habit rather than intent. But traceroute and mtr answer different questions, and picking the right one first can save you from staring at misleading output, or worse, opening a ticket with your ISP over packet loss that isn’t real.
We covered mtr in depth and traceroute’s inner workings in previous posts. This one is about the decision: which tool, when, and what mistakes to avoid when reading the results.
What traceroute shows
Traceroute answers one question fast: where does the path go, and where does it stop? It sends probes with incrementing TTL values, records each router that replies with an ICMP Time Exceeded, and gives you a snapshot of the path with three RTT samples per hop. Here’s a trace from a cloud agent to Cloudflare’s 1.1.1.1:
$ traceroute 1.1.1.1
traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
1 244.5.8.179 3.832 ms 244.5.0.21 7.178 ms 244.5.5.11 6.438 ms
2 240.0.228.67 0.341 ms 240.0.228.64 0.291 ms 240.0.52.65 0.313 ms
3 242.2.120.193 0.562 ms 242.7.112.65 0.745 ms 242.2.121.199 0.761 ms
4 240.3.180.8 2.618 ms 1.940 ms 240.3.180.39 1.253 ms
5 240.64.220.131 1.284 ms 240.64.220.130 0.688 ms 240.64.220.129 1.055 ms
6 52.46.166.112 1.776 ms 52.46.166.150 1.391 ms 52.46.166.112 1.987 ms
7 52.46.166.113 0.598 ms 0.513 ms 52.46.166.151 0.770 ms
8 173.245.63.179 1.212 ms 173.245.63.215 2.028 ms 173.245.63.199 1.961 ms
9 one.one.one.one (1.1.1.1) 0.728 ms 0.866 ms 0.784 ms Ten seconds later, you know the route and that the destination is reachable. (The 240.x through 244.x early hops are AWS-internal address space, which is why they look unusual. Nothing to worry about there.)
That’s also traceroute’s limit. Three probes per hop is a coin flip, not a statistic. A router dropping 5% of packets or adding occasional latency spikes will sail through a single traceroute looking perfectly healthy.
What MTR adds
mtr runs the same TTL trick continuously, typically one probe per second, and accumulates per-hop statistics: loss percentage, average/best/worst RTT, and standard deviation (a proxy for jitter). Here’s the same path, this time as a 100-cycle report:
$ mtr --report --report-cycles 100 1.1.1.1
HOST: ip-172-31-29-48 Loss% Snt Last Avg Best Wrst StDev
1.|-- 244.5.11.111 0.0% 100 9.8 16.2 0.9 118.5 22.7
2.|-- 240.0.52.130 0.0% 100 0.4 0.3 0.3 0.6 0.1
3.|-- 242.0.202.83 0.0% 100 1.1 2.3 0.4 33.3 5.2
4.|-- 240.3.180.37 0.0% 100 2.1 2.0 1.9 2.4 0.1
5.|-- 240.64.220.128 0.0% 100 2.5 0.9 0.6 2.5 0.3
6.|-- 52.46.166.150 0.0% 100 1.5 1.5 1.4 2.9 0.2
7.|-- 52.46.166.151 0.0% 100 0.8 0.9 0.8 2.9 0.2
8.|-- 173.245.63.112 0.0% 100 1.6 3.2 0.9 20.4 3.9
9.|-- one.one.one.one 0.0% 100 1.2 1.0 1.0 1.5 0.1 After 100 cycles you’re no longer looking at a snapshot, you’re looking at a baseline. Every hop is at 0% loss, so the path is genuinely clean end to end. Notice hop 1, though: a Best of 0.9 ms but a Worst of 118 ms and a high standard deviation. That’s a single early spike, not a sustained problem, and reading the spread rather than just one number is a skill the snapshot can’t teach you. This is the difference between “the path looks fine” and “hop 7 drops 3% of packets every time.”
When traceroute is enough
Reach for traceroute first when the question is binary or topological:
The destination is unreachable and you want to know where the path dies. You changed routing and want to confirm traffic takes the new path. You’re documenting the route for a ticket or a diagram. You need a quick sanity check before digging deeper.
If traceroute answers your question, you’re done. No need to babysit a live display.
When MTR is better
Reach for mtr when the problem is intermittent or performance-related, the two things a snapshot can’t capture:
Users report occasional slowness, drops, or VoIP quality issues. You suspect loss or jitter but a single traceroute looks clean. You’re escalating to an ISP and need evidence: mtr –report –report-cycles 100 produces a shareable summary that carries far more weight than a screenshot of one trace.
A good rule of thumb: traceroute tells you where the path goes, mtr tells you how the path behaves. Reachability question, run traceroute. Behavior question, run mtr.
Common mistakes interpreting results
Panicking over single-hop loss. This is the big one. Here’s a trace toward baidu.com that looks alarming in the middle:
$ mtr --report --report-cycles 100 baidu.com
HOST: ip-172-31-29-48 Loss% Snt Last Avg Best Wrst StDev
1.|-- 242.2.27.193 0.0% 100 59.3 59.8 58.3 76.9 3.1
2.|-- 15.230.88.114 0.0% 100 59.7 61.3 58.3 109.8 8.0
3.|-- 218.30.53.149 3.0% 100 60.3 66.9 58.5 176.7 25.2
4.|-- 202.97.27.209 71.0% 100 209.2 209.2 209.0 209.5 0.2
5.|-- 202.97.51.162 94.0% 100 198.8 198.8 198.7 198.8 0.0
6.|-- 202.97.24.133 89.0% 100 223.6 225.2 222.6 234.0 3.3
7.|-- ??? 100.0 100 0.0 0.0 0.0 0.0 0.0
8.|-- ??? 100.0 100 0.0 0.0 0.0 0.0 0.0
9.|-- 27.129.17.230 17.0% 100 246.2 247.7 243.3 257.4 3.2
10.|-- 222.222.85.102 12.0% 100 235.9 240.3 235.5 313.6 13.8
...
15.|-- 124.237.177.164 15.0% 100 237.5 237.1 236.4 238.2 0.4 Hops 4 through 6 show 71 to 94% loss, which is panic territory, until you look downstream. If those China Telecom routers were really dropping 90% of traffic, hops 9, 10, and 15 couldn’t possibly recover to 12 to 17%. That recovery is the proof: hops 4 through 6 were rate-limiting their own ICMP replies, not dropping transit traffic. Loss only counts when it persists to the end of the trace. The ??? hops in the middle are the same story, routers that don’t answer probes at all, and are equally harmless when the trace continues past them.
Panicking over latency jumps. RTT climbing from single digits to 200+ ms between hops, as it does above when the path crosses into China, usually means your packet crossed an ocean, not that a router is struggling. Judge latency against geography and against the final hop.
Blaming the network when it’s your own end. The opposite trap. Loss or wild latency that shows up on hop 1 and persists through every hop, including the destination, points at your own host or LAN, not the path. An agent on a congested Wi-Fi link produced this against the very same 1.1.1.1 that was flawless above:
1.|-- _gateway 6.0% 100 482.4 950.5 4.4 9248. 2200.0
2.|-- 192.168.1.254 20.0% 100 381.3 912.4 4.5 9144. 2186.9
...
9.|-- one.one.one.one 0.0% 100 13.8 1049. 10.7 9654. 2190.0 The destination is at 0% loss, so the path is fine, but every hop shows second-long average RTTs against a Best of about 11 ms. A fast Internet path can’t hang off a gateway that’s already a second away. The problem is local.
Trusting one direction. Internet routing is asymmetric. Loss that appears near the far end of your trace may live on the return path, inside a network your forward trace never touches. When it matters, trace from both ends.
Assuming there’s only one path. Both tools present the network as a single chain of hops. In reality, ECMP load balancing means your probes, and your users’ traffic, may be hashed across multiple parallel paths, and a classic trace silently mixes them together. We covered how Dublin Traceroute solves this by controlling the flow hash, and newer tools like ttl bring ECMP awareness and automatic rate-limit detection to an interactive mtr-style display.
Beyond the CLI
Both tools share one more limitation: they only run when you’re at the keyboard, after users have already complained. NetBeez agents run traceroute continuously from every location you monitor, and the Path Analysis feature, built on dublin-traceroute, maps ECMP paths between agents and targets over time, flagging route changes, per-hop loss, and latency shifts before they become tickets. It’s the mtr workflow, automated and running from the user’s perspective around the clock.