背景

TCP Flag 字段中有两个较为少用的标志:

  • PSH:推送

  • URG:紧急

本文来讲述一下这两个标志是如何使用的。

PSH 标志

要明白 PSH 标志,得先了解 TCP 是如何缓冲数据的。如下图所示:

发送方从应用层接收数据到缓冲区直到达到某个大小开始发送;接收方从缓冲区接收数据,直到达到某个大小开始上报给用户层。在大多数情况下,这种工作模式是很有效率的。

试想在要求实时交互通信的场景(比如启动一个 Telnet 连接):一端的应用进程希望在键入一个命令后立即就能收到对方的响应。如果还是上述的工作模式,有可能你输入的数据太少,未满足发送缓冲大小导致无法发送亦或者接收到的数据太小还没有投递到应用层,这样都会导致响应的不及时。

引入 PSH 标志,可以做到:

  • 提醒发送方立即发送这段数据

  • 提醒接收方立即将数据投递到应用层

说白了,就是:赶快发,赶快收

URG 标志

区别于 PSH 标志,URG 标志的使用必须结合 URG 指针,如下图所示:

要理解 URG 标志,得先了解什么是「紧急数据」。顾名思义,紧急数据就是优先级非常高,需要立即处理的数据。例如,一个程序在远程主机上运行并与之有大量的数据通讯,后发生一些问题,需要立刻取消该程序的运行,故从键盘中发出中断命令(Ctrl+G)。如果不使用紧急数据,则这两个字符将被存储在 TCP 发送数据的末尾发送,且接收方也在处理完其他数据后最后处理这两个字符,从而浪费很多时间。

当 URG = 1 时,发送应用进程就告诉发送方 TCP 有紧急数据要传送,于是发送方 TCP 就把紧急数据插入到报文段的最前面,而紧急数据后面的数据仍然是普通数据。紧急指针(Urgent Pointer)就是表示本报文段中紧急数据的字节数(紧急数据结束后就是普通数据),即紧急数据末尾在报文段中的位置。当所有紧急数据都处理完,TCP 就告诉应用层序恢复到正常操作。值得注意的是,即使窗口为 0,也可发紧急数据。

参考资料