标志位是什么
标志位是连接报文头里的一组控制比特,决定这个报文的语义:建连与关连、复位、确认、催促上层尽快读取数据,以及用于拥塞通知的两个标志。抓包工具把常用标志缩写成一个或两个字母,看懂这些缩写是读包的入门功夫。它们不是可有可无的装饰——同一个报文是否置位确认,含义完全不同;出现复位往往意味着连接被异常终止。
基本信息
| 数量 | 规范定义了九个标志位 |
|---|---|
| 常见 | 同步、确认、结束、复位、催促 |
| 少见 | 紧急指针、拥塞通知相关、随机数隐藏保护 |
| 读取方式 | 抓包工具用字母缩写组合表示 |
| 关键理解 | 标志位组合决定报文语义,不要孤立看单个标志 |
九个标志位
| 标志 | 含义 | 何时出现 |
|---|---|---|
| 同步 | 同步序号、请求建连 | 握手第一步与第二步 |
| 确认 | 确认号字段有效 | 除首个建连请求外几乎都有 |
| 结束 | 发送方没有更多数据 | 关闭阶段 |
| 复位 | 复位连接 | 异常终止或被拒绝 |
| 催促 | 尽快把数据交给应用 | 发送方缓冲清空时常置位 |
| 紧急 | 紧急指针有效 | 历史遗留,实际少见 |
| 拥塞回显 | 显式拥塞通知的回显 | 启用了该机制的链路 |
| 窗口缩减 | 拥塞窗口已减小 | 启用了该机制的发送方 |
| 随机数隐藏 | 早期随机数防护 | 极少数实现使用 |
按标志抓包
按标志抓包
tcpdump -nn 'tcp[tcpflags] & tcp-rst != 0' -c 10 # 只抓带复位的报文
tcpdump -nn 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' -c 20 # 抓建连与关连的报文
# 排查建连异常时优先看是否有复位,复位说明对端明确拒绝,而不是链路丢包典型使用场景
- 定位连接被重置:看复位报文由哪一方发出,判断是拒绝还是异常终止
- 分析建连问题:观察建连请求是否被回应,区分丢包与拒绝
- 排查关闭异常:看结束标志与确认的交互顺序是否完整
- 确认数据是否被催促下发:理解应用读取延迟是否与置位有关
- 验证中间设备是否干预:异常的复位往往来自链路中的设备
排查要点
- 抓包工具里只有确认的报文显示为方括号加点,容易与普通数据包混淆
- 复位报文要确认来源方向,来自中间设备与来自对端含义完全不同
- 置位催促不代表错误,它只是发送方建议尽快交付,不要当成异常
抓包工具用字母缩写表示标志组合,例如数据包里的点号只代表确认,带同步的组合表示建连与确认同时置位。把这些缩写误读成错误,会让排障方向完全跑偏。
复位报文的出现位置比它本身更有信息量:由服务端发出通常意味着端口无监听或连接状态不匹配,由中间设备发出则说明链路中的策略设备主动干预。