什么时候在tcp段中设置了push标志

Roh*_*nga 6 tcp linux-kernel packet-sniffers

我在这里问过这个问题:

tcp双方试图同时连接

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

谁决定设置推旗?在tcp段中设置push或urgent标志的规则是什么?是否可以使用套接字api来做到这一点?

Eri*_*ven 6

您可以通过设置紧急标志send()MSG_OOB标志设置.这意味着,发送的数据将是带外的,这意味着呼叫方通常不会简单地呼叫它read().接收方将获得一些OOB数据的指示,如信号SIGURG,或插座将变得异常,并可以使用这样检查select().

大多数情况下,您不想设置URGENT标志.


Pat*_*ick 5

tcp堆栈使用PUSH标志基本上说"我现在已经完成了".它只是表明数据段是由源完全传输的.

无法在userland(您的套接字api)中指示或控制它,因为这只是tcp堆栈/实现.作为URGENT标志.

(来源:Richard Stevens - Tcp/ip插图第1卷,第20章)

  • 关于没有办法从用户空间控制发送的推送标志,上述评论是错误的.请参阅TCP_NODELAY和TCP_CORK套接字选项(man 7 tcp)和MSG_MORE标志(man 2 send). (10认同)