不能,ss -i 仅显示连接建立后的初始 rtt 估算值,不记录 syn_sent/syn_recv 状态的时间戳,无法获取三次握手各阶段耗时;必须用 tcpdump 抓包并比对 syn、syn-ack、ack 的绝对时间戳才能精准计算延迟。

ss -i 能不能看 TCP 三次握手耗时
不能。ss -i 只显示连接的初始 RTT 估算(rtt: 字段),但这个值是在第一个 ACK 收到后才开始更新的,而三次握手本身发生在 ESTABLISHED 状态之前——ss 对 SYN_SENT / SYN_RECV 状态不暴露时间戳,也不记录各包发出/到达时刻。
tcpdump 抓包 + 时间戳是唯一可靠方式
必须用 tcpdump 捕获原始报文,并依赖其纳秒级时间戳计算握手延迟。关键不是“看到 SYN”,而是精确对齐三个事件的时间点:
-
SYN发出时刻(客户端) -
SYN-ACK发出时刻(服务端) -
ACK发出时刻(客户端)
实际耗时 = SYN-ACK 时间 − SYN 时间(服务端响应延迟),再加 ACK 时间 − SYN-ACK 时间(客户端确认延迟)。常用过滤命令:
sudo tcpdump -nn -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn or (tcp[tcpflags] & tcp-ack != 0 and tcp[tcpflags] & tcp-syn == 0)' -c 10
说明:
-
tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn匹配纯 SYN(不含 ACK) -
tcp[tcpflags] & tcp-ack != 0 and tcp[tcpflags] & tcp-syn == 0匹配带 ACK 但不含 SYN 的包(即 SYN-ACK 和后续 ACK) -
-c 10防止抓太多干扰判断;真实排查建议配合host和port过滤,如host 10.0.1.5 and port 8080
Wireshark 分析比命令行更直观但依赖导出
如果已用 tcpdump -w handshake.pcap 保存抓包文件,导入 Wireshark 后可直接:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 右键某 SYN 包 → “Follow” → “TCP Stream”,自动高亮该连接全部报文
- 查看“Time”列(默认相对首个包),或切换为“Absolute time”对比系统时间
- 用“Statistics → Flow Graph”生成时序图,一眼看出握手各阶段间隔
注意:Wireshark 默认显示的是“Delta Time”,即相对于上一个包的差值,容易误读;务必核对“Time”列原始值或启用“View → Time Reference”手动设基准点。
别信 netstat 或 ss 的 “State” 字段时长
netstat -atn 或 ss -ttn 输出里的 State 列(如 SYN_SENT)只表示当前状态,**不包含该状态持续了多久**。内核不维护每个连接的状态进入时间戳,所以没有任何标准命令能直接输出“SYN_SENT 已持续 234ms”这种数据。
常见误区是以为 ss -o 的计时器字段(如 timer:(keepalive,119min,0))能反映握手耗时——它只用于保活、重传等后续机制,和三次握手无关。
真正要定位握手慢,必须回到原始报文时间轴;任何试图绕过抓包、仅靠状态查询的方案,都会漏掉关键路径节点(比如防火墙丢 SYN、中间设备限速、服务端 backlog 溢出导致 SYN-ACK 延迟发包)。










