TCP 流分析82 条

TCP 握手 SYN 重传

客户端未见 SYN-ACK 会按超时重发 SYN(间隔近似 1s、2s、4s…递增);抓包看到同一 seq 的多个 SYN 说明建连在超时重试。

SYN 重传在说什么

客户端发出 SYN 后如果没有收到 SYN-ACK,会按超时机制重发 SYN:间隔大致按一秒、两秒、四秒、八秒递增,序列号与首次相同。抓包上表现为同源地址、同源端口、同序列号的多个 SYN,且时间间隔成倍增长。这是判断「请求发出去了但没有被应答」的直接证据。重试次数由内核参数决定,最终放弃的时间点由这些间隔累加而成,因此这类故障在客户端侧通常表现为几秒到几十秒的等待。

基本信息

抓取写法dst port 443 and tcp[tcpflags] = tcp-syn
识别特征同源同端口同序列号的重复 SYN,间隔递增
重试次数由内核参数控制(常见系统参数为六次左右)
放弃时间各次间隔累加,通常跨度为数十秒
Wireshark 视角相对时间列能直接看出间隔是否成倍增长

典型使用场景

  • 确认连接超时的原因:是本地没有发出还是发出后没有回应
  • 评估故障影响范围:统计多少客户端出现同一目标的重传
  • 判断问题出在哪一段:配合服务端抓包确定 SYN 是否到达
  • 核对内核参数调整效果:对比调整前后的重试次数与放弃时间
  • 识别负载均衡健康检查:健康检查也会产生重传,需先剥离

常用示例

常用示例
tcpdump -i eth0 -nn 'dst port 443 and tcp[tcpflags] = tcp-syn' -c 20   # 只看建连请求
tcpdump -i eth0 -nn -ttt 'dst port 443 and tcp[tcpflags] = tcp-syn' -c 10   # 加间隔看重传节奏
tcpdump -i eth0 -nn 'host 10.0.0.9 and tcp[tcpflags] = tcp-syn'        # 某客户端的重试
tcpdump -nn -r a.pcap 'tcp[tcpflags] = tcp-syn and dst port 8443' | wc -l   # 统计请求总数
sysctl net.ipv4.tcp_syn_retries                                     # 查看当前重试次数

重传过程的观察点

观察项正常表现异常表现
重传次数一到两次偶发属于链路波动稳定出现多次说明持续性丢包或服务不可达
重传间隔成倍增长(约一秒起)间隔不规则可能是抓包点丢包导致采样不全
序列号每次重传保持一致序列号变化说明这是新连接而非重传
是否有应答重传后收到服务端应答始终无应答说明请求未到达或服务端未处理
源端口同一源端口持续重试源端口变化说明客户端在新建连接而不是重试
重传只在发送侧可见,服务端是否收到必须靠对端抓包确认。单向抓包只能说「这里没有看到应答」,不能断言服务端没有收到请求。
负载均衡与监控的健康检查会周期性地产生 SYN,如果目标不可用,它们同样会重传。统计业务影响前先按来源地址或端口把探测流量分离出来。

与内核参数配合

与内核参数配合
sysctl net.ipv4.tcp_syn_retries net.ipv4.tcp_synack_retries   # 两侧的重试次数
ss -tan state syn-sent | head -20                            # 本机处于等待应答状态的连接
journalctl -k | grep -i 'syn' | tail -20                     # 内核日志里是否有相关提示

判读要点

  • 客户端重传而服务端完全没有抓到 SYN,说明请求在路径上被丢弃
  • 服务端抓到了 SYN 但没有回 SYN-ACK,重点查监听状态与队列参数
  • 服务端回了 SYN-ACK 而客户端仍在重传,说明回程方向丢失,属于典型的不对称故障
  • 只有个别客户端重传时优先查这些客户端的出口链路与本地策略配置

易错点

  • 只看客户端抓包就断定服务端未响应,缺少对端证据的结论不可靠
  • 把偶发的单次重传当故障,公网环境下个别重传属于常态
  • 忽略健康检查流量,导致对影响的统计明显偏大
  • 把源端口变化的新连接误认成重传,两者的处理方式完全不同
  • 未核对内核参数就断言重试次数,不同系统的默认值差异较大

数据来源与参考

  • RFC 6298(RTO 计算)
  • RFC 9293(建连重传)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌