何时在tcp段中设置推送标志

何时在tcp段中设置推送标志,tcp,linux-kernel,packet-sniffers,Tcp,Linux Kernel,Packet Sniffers,我在这里问了前一个问题: 我尝试了解决方案中给出的方法,在使用netcat和ethereal嗅探数据包时,我观察到,当我从一端向另一端发送“hello”字符串时,它是在设置了push标志的段中发送的 谁决定设置推旗? 在tcp段中设置推送或紧急标志的规则是什么? 是否可以使用sockets api执行此操作?tcp堆栈使用PUSH标志基本上表示“我现在已经完成了”。它只是表示数据段完全由源传输 在userland(您的套接字api)中无法指示或控制它,因为这只是实现它的tcp堆栈/实现。作为紧

我在这里问了前一个问题:

我尝试了解决方案中给出的方法,在使用netcat和ethereal嗅探数据包时,我观察到,当我从一端向另一端发送“hello”字符串时,它是在设置了push标志的段中发送的

谁决定设置推旗? 在tcp段中设置推送或紧急标志的规则是什么?
是否可以使用sockets api执行此操作?

tcp堆栈使用PUSH标志基本上表示“我现在已经完成了”。它只是表示数据段完全由源传输

在userland(您的套接字api)中无法指示或控制它,因为这只是实现它的tcp堆栈/实现。作为紧急信号旗


(来源:,第20章)

您可以使用
send()
MSG\u OOB
标志集设置紧急标志。这意味着,发送的数据将是带外的,这意味着调用方通常不会简单地调用
read()
。接收端将获得一些OOB数据指示,如信号
SIGURG
,或者插座将变得异常,可以使用
select()
进行检查


大多数情况下,您不想设置紧急标志。

上面的评论是错误的,因为没有办法从用户空间控制发送推送标志。请参阅TCP_节点延迟和TCP_软木插槽选项(man 7 TCP)和MSG_更多标志(man 2发送)。