首页/网络/协议速查/PSH 与 URG 标志语义
TCP 与 UDP54 条

PSH 与 URG 标志语义

PSH 提示接收方「尽快把数据交给应用」,URG 指示紧急指针有效;现代协议栈大多不依赖两者,但抓包里会看到 PSH 频繁出现。

协议速查网络更新于 2026-10-13

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' -v

TCP 标志位速查

标志位值含义
SYN0x02建立连接,同步序号
ACK0x10确认序号有效
FIN0x01发送方没有更多数据
RST0x04强制重置连接
PSH0x08提示尽快把数据交付应用
URG0x20紧急指针有效
PSH 与消息边界无关:TCP 是面向字节流的协议,边界只能由应用协议(长度字段、分隔符、帧结构)定义;看到多个小包也不代表对端在「按条发送」。
现代内核常用 PSH 表示「发送缓冲已清空」,因此它出现在绝大多数数据包里;把 PSH 当异常信号是常见误判。
一些老防火墙与入侵检测设备对 URG 的处理不一致,攻击者历史上曾用带外数据绕过内容检查;现代协议栈多直接忽略 URG。
应用层需要「中断/紧急消息」时,应在协议内定义独立消息类型,而不是指望 URG 与紧急指针能把信号插到对端读取序列前面。

易错点

  • 把 PSH 当消息边界做解析,会写出在弱网下必然出错的粘包与拆包逻辑
  • 期待 URG 实现应用层中断,会在多数现代协议栈上失效
  • 用 tcp[tcpflags] 过滤时忘记掩码(直接写等于 tcp-push),会把带 ACK 的报文全部漏掉
  • 看到 PSH 就断定「应用写得太碎」:需结合发送缓冲状态与 Nagle 行为一起分析

数据来源与参考

  • RFC 9293 §3.1(标志定义)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌