TCP中推送和紧急标志之间的区别

时间:2012-02-05 22:15:10

标签: tcp

我试图理解TCP段与标志PSH和标志URG之间的区别。 我读了RFC但仍然无法得到它,其中一个是否在将数据发送到进程之前缓冲数据而另一个没有?

3 个答案:

答案 0 :(得分:96)

它们是两种截然不同的机制。

PSH和PUSH功能

发送数据时,TCP会对其进行缓冲。因此,如果您发送一个角色,它将不会立即发送,而是等待您是否有更多。但也许你希望它直接上线:这就是PUSH功能的用武之地。如果你推送数据你的TCP将立即创建一个段(或几个段)并推送它们。 / p>

但这个故事并不止于此。当对等TCP收到数据时,它会自然地缓冲它们它不会干扰每个字节的应用程序。这里是PSH标志开始的地方。如果接收TCP看到PSH标志,它将立即数据推送到应用程序。

没有用于设置PSH标志的API。通常,它在清空缓冲区时由内核设置。来自TCP / IP Illustrated:

  

此标志通常用于指示发送数据包的一侧的缓冲区已经存在   与发送数据包一起清空。换句话说,当设置了PSH位字段的数据包离开发送方时,发送方没有更多数据要发送。

但请注意史蒂文斯也说:

  

推送(接收方应尽快将此数据传递给应用程序   可能 - 未可靠实施或使用

URG和OOB数据

TCP是面向流的协议。因此,如果你在一侧推动64K字节,你最终将获得64k字节。所以想象一下你推了很多数据,然后有一些消息说:“嘿,你知道我刚发送的所有数据吗?是的,扔掉它”。问题的关键是,一旦你在连接上推送数据,就必须等待接收者在获得新数据之前获得所有数据。

这是URG标志启动的地方。当您发送紧急数据时,您的TCP会创建一个特殊的段,在该段中设置URG标志以及紧急指针字段。这会导致接收TCP将紧急数据转发到应用程序的单独通道(例如,在Unix上,您的进程获得SIGURG)。这允许应用程序处理数据带外1


作为旁注,重要的是要意识到紧急数据在今天很少使用,并且没有很好地实施。使用单独的渠道或完全不同的方法要容易得多。


¹:RFC 6093不同意这种“带外”的使用并说明:

  

TCP紧急机制不是发送“带外”的机制   数据:所谓的“紧急数据”应该“在线”发送到   TCP用户。

然后它继续承认:

  

默认情况下,“紧急数据”的最后一个字节是“带外”传送的   到申请。也就是说,它不作为一部分提供   普通数据流。

申请必须不受约束并指明例如SO_OOBINLINE以获得符合标准的紧急语义。

如果所有这些听起来很复杂,只需不要使用紧急数据

答案 1 :(得分:6)

向已经回答的人提供更多信息。

  • URG位,如果设置优先级数据,则意味着而不是等待传输的整个字节流超过" Urgent"数据,紧急数据将被紧急发送,不会等待传输的整个字节流在它之前。

  • 当设置URG位时,还设置了紧急指针(在TCP标题选项字段中:16位)。

  • URG指针指示已到达的段中数据的紧急字节数。 (例如,如果数据大小为100字节且仅紧急50字节,则紧急指针的值为50)。

  • 现在来PSH位。 PSH位的目的是告诉TCP不要等待缓冲区变满并立即发送数据。类似地,当接收器接收到设置了PSH标志的段时,应立即将数据发送到上层而不等待接收缓冲器变满。这方面的实际例子是telnet应用程序,其中应用程序以几次击键的形式发送数据。如果telnet等待缓冲区变满,然后将数据传输到接收器,telnet就会变得无法使用。

答案 2 :(得分:0)

我不会过于严格地接受RFC中的所有内容,似乎对这些标志的实现存在一些歧义。 URG涉及在填充缓冲区之前发送数据包,而PSH控制在接收端将数据向上移动