PSH 与 URG 是什么
PSH 与 URG 是 TCP 首部的两个控制标志位。PSH(push)提示接收方「尽快把已收到的数据交给应用」,发送缓冲被清空时内核往往自动置位;URG(urgent)表示紧急指针字段有效,指向带外数据,历史上被 Telnet 一类协议使用,如今基本退出实用范围(RFC 9293 §3.1)。
基本信息
| 位置 | TCP 首部标志位:PSH 为 0x08、URG 为 0x20 |
|---|---|
| PSH 语义 | 提示尽快把数据交付应用,不定义消息边界 |
| URG 语义 | 紧急指针有效,指向带外数据 |
| 现状 | 抓包里 PSH 极常见,URG 罕见 |
| 规范 | RFC 9293 §3.1(TCP 首部与标志定义) |
典型使用场景
- 抓包分析:判断某个数据包为何被立即上交应用
- 协议实现与调试:理解 Nagle 算法与延迟确认的相互作用
- 排障:解释应用层「消息被合并或拆分」的困惑
- 安全监测:带 URG 的异常流量(历史上被用于绕过内容检查)
- 性能调优:小包过多时结合 PSH 与 Nagle 行为一起分析
- 教学演示:用 tcpdump 过滤标志位,观察真实流量分布
过滤观察
过滤观察
# 抓取带 PSH 标志的报文
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-push != 0' -c 5
# 抓带 URG 的报文(现实中很少见到)
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-urg != 0' -c 5
# 同时匹配 PSH 或 URG,并显示标志位细节
tcpdump -nn -i eth0 'tcp[tcpflags] & (tcp-push|tcp-urg) != 0' -vTCP 标志位速查
| 标志 | 位值 | 含义 |
|---|---|---|
| SYN | 0x02 | 建立连接,同步序号 |
| ACK | 0x10 | 确认序号有效 |
| FIN | 0x01 | 发送方没有更多数据 |
| RST | 0x04 | 强制重置连接 |
| PSH | 0x08 | 提示尽快把数据交付应用 |
| URG | 0x20 | 紧急指针有效 |
PSH 与消息边界无关:TCP 是面向字节流的协议,边界只能由应用协议(长度字段、分隔符、帧结构)定义;看到多个小包也不代表对端在「按条发送」。
现代内核常用 PSH 表示「发送缓冲已清空」,因此它出现在绝大多数数据包里;把 PSH 当异常信号是常见误判。
一些老防火墙与入侵检测设备对 URG 的处理不一致,攻击者历史上曾用带外数据绕过内容检查;现代协议栈多直接忽略 URG。
应用层需要「中断/紧急消息」时,应在协议内定义独立消息类型,而不是指望 URG 与紧急指针能把信号插到对端读取序列前面。