6

我在这里问了这个先前的问题:

tcp 两端试图同时连接

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

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

4

2 回答 2

7

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

无法在用户区(您的套接字 api)中指示或控制它,因为这只是 tcp 堆栈/实现。作为紧急标志。

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

于 2010-02-15T08:56:36.710 回答
6

send()您可以使用设置的标志来设置紧急标志MSG_OOB。正如这暗示的那样,发送的数据将是带外的,这意味着调用方通常不会简单地调用它来接收它read()。接收方将获得一些OOB数据的指示,如信号SIGURG,或者套接字将变得异常,可以使用这样的方式进行检查select()

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

于 2010-02-16T19:56:40.593 回答