hping3 -s 测得的 syn→syn-ack 延迟最贴近真实 tcp 建连延迟,tcpdump 可精确定位卡点,traceroute -t 仅辅助路径推测;三者需按“hping3→tcpdump→traceroute”顺序使用。

不能靠 ping 或 mtr 看“连接建立过程中的物理链路延迟”,因为它们测的是 ICMP 路径,而 TCP 连接建立(SYN → SYN-ACK → ACK)走的是真实传输层路径,中间设备可能对 TCP 和 ICMP 区别对待。真正能反映建连阶段链路行为的,是 hping3 -S 和 tcpdump 配合分析。
用 hping3 -S 模拟三次握手并抓 RTT
hping3 发送原始 SYN 包,等对方回 SYN-ACK,直接给出单向建连延迟(即从发 SYN 到收 SYN-ACK 的时间),这比 ping 更贴近真实建连体验。
-
hping3 -c 3 -S -p 443 example.com:发 3 个 SYN 到 443 端口,输出里的rtt=xx.xms就是这次建连的耗时 - 若
rtt波动极大(比如 8ms → 320ms),说明中间某设备(WAF、云防火墙、运营商 QoS 设备)在深度检测或限速 TCP 握手包 - 如果
hping3有响应但curl https://example.com超时,大概率是服务端没开 TLS 或证书异常,不是链路问题 - 注意:目标端口必须开放且监听,否则收不到 SYN-ACK,
hping3会显示超时或无响应
用 tcpdump 抓包看每个握手包的时间戳
仅看 rtt= 数值不够细,要定位具体哪一跳拖慢了握手,就得用 tcpdump 抓包,再用 Wireshark 或 tshark 分析时间差。
- 在客户端执行:
tcpdump -i any -w handshake.pcap "host example.com and port 443" - 触发一次
curl -s https://example.com > /dev/null,确保产生完整三次握手 - 用
tshark -r handshake.pcap -Y "tcp.flags.syn==1 || tcp.flags.ack==1" -T fields -e frame.time_epoch -e ip.src -e tcp.flags提取关键帧时间戳 - 计算第一个
Syn到第一个SynAck的差值,就是实际建连延迟;若这个值远高于hping3结果,说明本地网卡或协议栈有延迟(如 iptables 规则、conntrack 堆积)
为什么 traceroute -T 不等于建连延迟
traceroute -T 是用 TCP SYN 包逐跳探测,但它每跳只发一个包、等超时才进下跳,无法反映你真实业务连接所走的那条路径的建连行为。
-
traceroute -T -p 443 example.com可能卡在第 5 跳,但你的实际连接绕过了它(比如用了 Anycast 或不同出口) - 它的延迟是“到该跳并止步”的时间,不是“端到端完成三次握手”的时间
- 某些云厂商会丢弃 TTL=1 的 TCP SYN,导致
traceroute -T中途断掉,但你的业务连接完全正常 - 真正要验证建连路径是否一致,得对比
tcpdump里源/目的 IP 和traceroute -T最后一跳是否相同
建连延迟不是单一数值,它由物理链路、中间设备策略、本地协议栈状态共同决定;hping3 -S 给你一个可操作的基线,tcpdump 告诉你哪里卡住,而 traceroute -T 只能辅助猜路径——三者缺一不可,但顺序不能反:先 hping3 快筛,再 tcpdump 定位,最后用 traceroute -T 对照。











