TCP标志:PSH和URG

时间:2024-03-23 17:38:00

TCP标头包含几个一位布尔字段,称为标志,用于影响TCP连接上的数据流。忽略RFC 3168为拥塞通知添加的CWR和ECE标志,有六个TCP控制标志。下面列出的其中四个用于控制TCP连接的建立,维护和拆除,并且对于甚至进行了基本数据包分析的任何人都应该熟悉。

  • SYN - 启动连接
  • ACK - 确认收到的数据
  • FIN - 关闭连接
  • RST - 中止连接以响应错误

其他两个标志,PSH(推)和URG(紧急),并不是众所周知的。它们是今天文章的焦点。

PSH标志

要了解PSH标志的功能,我们首先需要了解TCP如何缓冲数据。TCP在OSI模型的第四层运行; 它向上层提供了一个简单的套接字,可以读取和写入,掩盖了基于分组的通信的复杂性。为了允许应用程序随时读取和写入此套接字,缓冲区在两个方向上都在TCP连接的两端实现。

下图显示了在发送之前发送方如何缓冲数据,以及接收时接收方如何缓冲数据。

TCP标志:PSH和URG

 

当发送多个最大段大小(MSS)的数据(例如,传输大文件)时,缓冲区允许更有效的数据传输。但是,在处理需要尽可能快地传输数据的实时应用程序时,大缓冲区的弊大于利。考虑一下Telnet会话会发生什么,例如,如果TCP在发送数据包之前等待有足够的数据来填充数据包:在第一个数据包进入远程设备之前,您必须键入超过一千个字符。不是很有用。

这是PSH标志进入的地方.TCP在会话级别提供的套接字可由应用程序写入,可选择立即“推送”数据,而不是等待其他数据进入缓冲区。发生这种情况时,传出TCP数据包中的PSH标志设置为1(打开)。在接收到设置了PSH标志的分组时,连接的另一侧知道立即将该分段转发到应用程序。总而言之,TCP的推送功能完成了两件事:

  • 发送应用程序通知TCP应立即发送数据。
  • TCP报头中的PSH标志通知接收主机应立即将数据推送到接收应用程序。

我们可以看到在HTTP GET请求的数据包捕获中使用的PSH标志的示例。在数据包#4中,我们看到初始HTTP请求已设置其PSH标志,表示客户端没有其他数据要添加,并且请求应立即发送到应用程序(在本例中为Web守护程序)。我们还看到服务器在包#36上设置了PSH标志,包含所请求文件的最后字节。同样,PSH标志用于通知接收方发送方没有其他数据要传输(暂时)。

TCP标志:PSH和URG

如上所述,PSH标志还用于促进通过TCP的实时通信。短Telnet会话的数据包捕获表明,所有携带Telnet数据的数据包都设置了PSH标志,以防止TCP按键缓冲。

URG标志

URG标志用于通知接收站段内的某些数据是紧急的并且应该优先。如果设置了URG标志,则接收站将评估紧急指针,即TCP标头中的16位字段。该指针指示从第一个字节开始计算的段中有多少数据是紧急的。

TCP标志:PSH和URG

 

现代协议并未充分利用URG标志,但我们可以在之前引用的Telnet数据包捕获中看到它的一个示例。在包#86中发送的0xFF字符在包#70中的Telnet命令0xF2(242)之前,表示数据标记。根据RFC 854,应该在设置TCP URG标志的情况下发送此命令。分组#68中的紧急指针指示该分段的第一个字节(在这种情况下是整个分段)应该被认为是紧急数据。

不可否认,这可能不是URG旗帜最具说明性的例子,但在真实世界的捕捉中发现它的其他用途却令人惊讶地难以实现。

有关TCP的PSH和URG功能的更多讨论,请在线查看“TCP / IP指南”

 

转自:http://packetlife.net/blog/2011/mar/2/tcp-flags-psh-and-urg/