必须用hping3 -S测TCP SYN往返延迟,因ping的RTT仅反映ICMP包延迟,无法体现TCP三次握手真实耗时;hping3绕过ICMP限制,直击建连路径,结合tcpdump与ss -i可定位本地栈问题,traceroute -T则精准识别慢在哪一跳。

直接看 ping 结尾的 rtt min/avg/max/mdev 没用——它只反映 ICMP 包往返时间,不等于 TCP 连接建立耗时。真要看连接建立过程的物理链路延迟,必须测 TCP 三次握手的实际耗时,而不是 ping 的 RTT。
用 hping3 -S 测 TCP SYN 往返延迟
ICMP 被防火墙拦截、QoS 限速或策略丢弃时,ping 完全失效,但真实业务走的是 TCP。此时 hping3 -S 发送 SYN 包,模拟建连第一步,能暴露中间设备对 TCP 的实际处理延迟。
-
hping3 -S -p 80 -c 5 -i 0.5 14.215.177.39:向目标 80 端口发 5 个 SYN,间隔 0.5 秒 - 输出中
len=46 ip=14.215.177.39 ttl=52 DF id=0 sport=80 flags=SA seq=0 win=14600 rtt=23.4 ms的rtt值才是真实 SYN-ACK 往返延迟 - 若大量出现
timeout或no answer,说明链路某处静默丢弃 SYN(常见于安全组、ACL、状态防火墙) -
hping3不依赖 DNS,也不受 ICMP 策略影响,比ping更贴近真实建连路径
用 tcpdump + ss -i 看本地 socket 层建连耗时
即使 hping3 显示延迟正常,应用层 connect() 仍可能卡住——问题可能出在本地协议栈排队、路由查找或 ARP 解析上。
- 先开抓包:
sudo tcpdump -i any -nn port 80 and tcp[tcpflags] & (tcp-syn|tcp-ack) != 0 -w syn.pcap - 再发起一次连接:
curl -s -o /dev/null http://example.com - 用
ss -i查看该连接的详细指标:ss -tni 'dst 93.184.216.34:80',关注rtt:和rttvar:字段(单位微秒) -
rtt:是内核当前估算的平滑 RTT;rttvar:是其方差,值越大说明抖动越严重;若rtt明显高于hping3结果,说明本地 TCP 栈有排队或重传
用 traceroute -T -p 443 定位哪一跳拖慢了 SYN
单纯知道“建连慢”不够,得知道慢在哪一跳。UDP 模式 traceroute 可能被中间设备忽略,TCP 模式才真实模拟 HTTPS 建连行为。
-
traceroute -T -p 443 -q 3 -w 2 example.com:用 TCP SYN 探测每跳到 443 端口的响应时间,每跳发 3 包,超时 2 秒 - 重点看哪一跳的延迟突然跳升(比如前几跳都
- 若某跳始终显示
* * *,不代表断连,可能是该设备禁用了 ICMP 错误响应,但 TCP SYN 仍能通过——此时需结合mtr --tcp --port 443交叉验证 - 别信“最后一跳延迟高就怪对方服务器”——多数情况下,高延迟出现在第 3–6 跳(骨干网交汇点、省际出口),而非目标机房
真正影响连接建立的物理链路延迟,藏在 SYN 往返里,不在 ping 的 time= 数值中。测不准这一步,后面调 net.ipv4.tcp_fastopen 或改拥塞算法全是白忙。


















