五元组复用带来的麻烦
源地址、目的地址、源端口、目的端口、协议这五项相同的一组流量,在抓包工具里被视为同一条会话。但真实网络里同一组五元组会被反复使用:连接关闭后客户端很快用相同的本地端口再建一条,或者经过地址转换后多条内部连接被映射到同一个出口端口。分析时必须按时间把这几条逻辑连接切开,否则会把不同连接的失败率算到同一条上。
基本信息
| 核心字段 | tcp.stream 用于标识逻辑连接,同一五元组的复用会对应多个取值 |
|---|---|
| 连接起点 | 以不带确认标志的 SYN 作为一条新连接的开始 |
| 分析手段 | 结合握手时间与首包位置做时间切分 |
| 报告写法 | 引用时同时给出时间戳与流编号,避免歧义 |
| 高发场景 | 地址转换出口、短连接密集的客户端、压测工具 |
| 注意事项 | 流编号是工具按出现顺序分配的,不是协议里的标识 |
典型使用场景
- 失败率统计:按连接而不是按五元组算,避免把多次复用混成一条长连接
- 短连接分析:压测或轮询场景下大量连接复用同一组端口,需要按时间切片
- 地址转换排查:出口端口复用导致多用户流量交织,按时间与来源区分
- 时序复盘:把同一个五元组的多次建连按时间排好,还原真实交互顺序
- 报告复核:给出时间与流编号,让看报告的人能独立还原
按时间切开复用连接
按时间切开复用连接
# 同一组五元组上出现的所有握手, 按时间列出, 每个 SYN 就是一条新连接
tshark -r a.pcap -Y 'ip.src == 10.0.0.5 && tcp.srcport == 51234 && tcp.flags.syn == 1' \
-T fields -e frame.number -e frame.time -e tcp.dstport -e tcp.stream
# 看该五元组一共对应几个流编号
tshark -r a.pcap -Y 'ip.src == 10.0.0.5 && tcp.srcport == 51234' -T fields -e tcp.stream | sort -u
# 按时间窗统计各流的情况, 避免混算
tshark -r a.pcap -Y 'tcp.stream == 12 || tcp.stream == 15 || tcp.stream == 19' -T fields -e frame.number -e _ws.col.info | head -30现象与处理
| 现象 | 含义 | 处理方式 |
|---|---|---|
| 同五元组多个 SYN | 端口被复用了多次 | 按 SYN 位置切分连接 |
| 同一流编号内出现两次握手 | 极少见, 需确认是否漏判边界 | 核对时间与序列号确认 |
| 大量短连接 | 轮询或压测场景 | 按时间切片统计成功率 |
| 出口端口高度集中 | 地址转换导致复用 | 按内网来源再区分 |
| 失败集中在一段时间 | 该时段资源或链路问题 | 结合时间窗排查而非按流编号 |
流编号由工具按出现顺序分配,刷新、重新过滤或换工具打开都可能变化;把它写进报告时务必附带时间戳,否则对方对不上。
地址转换环境下出口端口复用率很高,同一条五元组可能对应几十条连接;统计连接数时以握手次数为准,而不是以五元组组合数。