The Problem You're debugging a connectivity issue. ping works fine, but curl times out. The usual approach: Run traceroute with ICMP - looks fine Run traceroute with TCP - dies at hop 6 Manually compare each hop Finally identify the firewall/ACL What if you could see this in one command? Protocol Divergence Localization I added this feature to multiprobe, a Rust network probing library. It runs ICMP, TCP, and UDP traceroutes simultaneously and identifies where protocols start behaving differently. $ sudo multiprobe divergence problematic-host.example.com Protocol Divergence Analysis: problematic-host.example.com (203.0.113.50) Protocols: ["ICMP", "TCP", "UDP"] Hop ICMP TCP UDP Status --- -------------------- -------------------- -------------------- ---------- 1 192.168.1.1 (1.23ms) 192.168.1.1 (1.45ms) 192.168.1.1 (1.12ms) ✓ 2 10.0.0.1 (5.67ms) 10.0.0.1 (5.89ms) 10.0.0.1 (5.34ms) ✓ 3 172.16.0.1 (8.90ms) * (timeout) * (timeout) ⚠ DIVERGE Summary: Protocol divergence detected at hop 3. Path score: 0.33 First divergence at hop 3 Reason: ICMP succeeded, TCP/UDP failed Hop 3 is the culprit. That's 172.16.0.1 - probably a firewall blocking TCP/UDP but allowing ICMP. How It Works Parallel Probing: Send ICMP echo, TCP SYN, and UDP packets with increasing TTL values simultaneously Per-Hop Comparison: At each hop, compare which protocols got responses Divergence Detection: Calculate an "agreement score" (1.0 = all agree, 0.0 = complete disagreement) Report: Identify the first hop where protocols start behaving differently Library Usage use multiprobe::{analyze_divergence, DivergenceOptions, DivergenceProtocol}; use std::time::Duration; #[tokio::main] async fn main() -> Result<(), multiprobe::Error> { let options = DivergenceOptions { max_hops: 30, timeout_per_hop: Duration::from_secs(2), protocols: vec![ DivergenceProtocol::Icmp, DivergenceProtocol::Tcp, DivergenceProtocol::Udp, ], tcp_port: 80, udp_port: 33434, }; let result = analyze_divergence("example.com", &options).await?; if let Some(hop) = result.first_divergence_hop { println!("Divergence at hop {}", hop); } else { println!("No divergence - all protocols behave consistently"); } Ok(()) } Use Cases Firewall Rule Debugging: Find which hop has a blocking ACL Middlebox Detection: Identify protocol-specific traffic shaping ISP Troubleshooting: Pinpoint where the problem is Network Security Audit: Verify filtering rules are applied where expected Installation # CLI tool cargo install multiprobe # Library cargo add multiprobe Requires elevated privileges (raw sockets) on Linux/macOS. Links: crates.io GitHub Documentation