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

TCP中推送标志和紧急标志的区别,tcp,Tcp,我试图理解带有标志PSH和带有标志URG的TCP段之间的区别。 我读取了RFC,但仍然无法获取它,其中一个是否在数据发送到进程之前缓冲了数据,而另一个没有?我不会太严格地接受RFC中的所有内容,这些标志的实现似乎有些模糊。URG涉及在填充缓冲区之前发送数据包,而PSH控制在接收端向上移动数据堆栈。它们是两种截然不同的机制 PSH与推送功能 发送数据时,您的TCP会对其进行缓冲。因此,如果你发送一个字符,它不会立即发送,而是等待看你是否有更多。但也许你想让它直接在电线上运行:这就是推功能的作用。如

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

我不会太严格地接受RFC中的所有内容,这些标志的实现似乎有些模糊。URG涉及在填充缓冲区之前发送数据包,而PSH控制在接收端向上移动数据堆栈。

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

PSH与推送功能 发送数据时,您的
TCP
会对其进行缓冲。因此,如果你发送一个字符,它不会立即发送,而是等待看你是否有更多。但也许你想让它直接在电线上运行:这就是推功能的作用。如果您推送数据,TCP将立即创建一个段(或几个段)并推送它们

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

没有设置
PSH
标志的API。通常,它是由内核在清空缓冲区时设置的。从TCP/IP中可以看出:

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

但要知道史蒂文斯也说:

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

URG和OOB数据 TCP是一种面向流的协议。因此,如果你把64K字节推到一边,你最终会在另一边得到64K字节。想象一下,你推了很多数据,然后有一条信息说:“嘿,你知道我刚才发送的所有数据吗?是的,扔掉它。”。问题的要点是,一旦你在一个连接上推送数据,你就必须等待接收者获得所有数据,然后才能获得新的数据

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


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


1:不同意“带外”的使用,并声明:

TCP紧急机制不是用于发送“带外”的机制 数据:所谓的“紧急数据”应“在线”交付给客户 TCP用户

但它接着承认:

默认情况下,“紧急数据”的最后一个字节是“带外”传递的 对应用程序进行修改。也就是说,它不是作为项目的一部分交付的 正常数据流

应用程序必须特意指定,例如
SO\OOBINLINE
,以获得符合语义的标准


如果这一切听起来很复杂,就不要使用紧急数据,在已经回答的数据中添加更多信息

  • 如果设置了
    URG
    位,则该位对数据进行优先级排序,这意味着不等待传输“紧急”数据之前的整个字节流,而是紧急发送紧急数据,而不等待传输它之前的整个字节流

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

  • URG
    指针指示到达的段中有多少字节的数据是紧急的。(例如,如果数据大小为100字节,并且只有前50个字节是紧急的,则紧急指针的值为50)

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


但我在RFC中读到,当URG设置为1时,它使用push功能!如果设置了URG,那么如果URG只是在填充缓冲区之前发送数据包,那么指向紧急字节的指针的作用是什么?这个答案或多或少是正确的,但没有提到实际如何推送数据。据我所知,这没有API,它是由内核自动决定的。@apenwarr没有API。我在答案中添加了一些细节。内核真的让数据到达和完成recv调用之间的时间流逝了吗?我从来没有注意到这一点,这似乎是一个坏主意。@usr这是有道理的。除了进程不调用<代码> RecV<代码>的简单情况,或者它根本没有被调度,考虑对等体正在以非常快的速度发送小片段的情况。单独交付每一条数据将是一个性能问题。@Matteo I修改了答案。最后,RFC强调,指定的紧急机制确实是一致的,但v