gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:28:41 27 4
gpt4 key购买 nike

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

最佳答案

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

###PSH 和 PUSH 函数

当您发送数据时,您的 TCP 会对其进行缓冲。因此,如果您发送一个字符,它不会立即发送,而是等着看您是否有更多。但也许您希望它直接在线上传输:这就是 PUSH 函数的用武之地。如果您推送数据,您的 TCP 将立即创建一个段(或几个段)并推送它们。

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

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

This flag is conventionally used to indicate that the buffer at the side sending the packet has beenemptied in conjunction with sending the packet. In other words, when the packet with the PSH bit field set left the sender, the sender had no more data to send.

但请注意史蒂文斯还说:

Push (the receiver should pass this data to the application as soon aspossible—not reliably implemented or used)

###URG 和 OOB 数据

TCP 是一种面向流的协议(protocol)。因此,如果您在一侧推送 64K 字节,您最终会在另一侧获得 64K 字节。所以想象一下,你推送了大量数据,然后有一些消息说“嘿,你知道我刚刚发送的所有数据吗?是的,把它扔掉”。问题的要点是,一旦您将数据推送到连接上,您必须等待接收方在获取新数据之前获取所有数据。

这就是 URG 标志发挥作用的地方。当您发送紧急数据时,您的 TCP 会创建一个特殊的段,在其中设置 URG 标志和紧急指针字段。这会导致接收 TCP 在单独的 channel 上将紧急数据转发给应用程序(例如,在 Unix 上,您的进程获得 SIGURG)。这允许应用程序处理数据带外¹


附带说明一下,重要的是要意识到,紧急数据如今很少使用,而且实现得不是很好。使用单独的 channel 或完全不同的方法要容易得多。


¹:RFC 6093不同意这种“带外”的用法,并指出:

The TCP urgent mechanism is NOT a mechanism for sending "out-of-band"data: the so-called "urgent data" should be delivered "in-line" to theTCP user.

但随后它继续承认:

By default, the last byte of "urgent data" is delivered "out of band"to the application. That is, it is not delivered as part of thenormal data stream.

应用程序必须特意指定,例如SO_OOBINLINE 以获得符合标准的紧急语义。

如果这一切听起来很复杂,请不要使用紧急数据

关于tcp - TCP 中推送标志和紧急标志之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9153566/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com