5

在许多 UNIX TCP 实现中,TCP_CORK提供了一个套接字选项,它允许调用者绕过Nagle 算法并明确指定何时发送物理数据包。Windows(Winsock)中是否有等效功能?

TCP_CORK(自 Linux 2.2 起)

如果设置,则不发送部分帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用 sendfile(2) 之前添加标头或吞吐量优化很有用。按照目前的实施,TCP_CORK 对输出进行软木塞的时间有 200 毫秒的上限。如果达到此上限,则自动传输排队的数据。只有从 Linux 2.5.71 起,此选项才能与 TCP_NODELAY 结合使用。此选项不应在旨在可移植的代码中使用。

(我知道TCP_NODELAY,但这不是我需要的;我仍然希望在发送缓冲区中累积多个写入,然后在我准备好发送物理数据包时触发 TCP 堆栈。)

4

2 回答 2

8

FWIW 我成功地使用 TCP_NODELAY 来获得 TCP_CORK 风格的行为。我这样做:

  1. 取消设置套接字上的 TCP_NODELAY 标志
  2. 调用 send() 零次或多次以将传出数据添加到 Nagle 队列中
  3. 在套接字上设置 TCP_NODELAY 标志
  4. 调用 send() 并将字节数参数设置为零,以强制立即发送 Nagle 排队数据

在 Windows、MacOS/X 和 Linux 下,这对我来说效果很好。(请注意,在 Linux 下,最后的零字节 send() 不是必需的)

于 2014-03-01T18:44:23.240 回答
3

没有等价物。你能做的最好的就是先把你的数据块收集到你自己的缓冲区中,然后在准备好时将完成的缓冲区发送到套接字,让 Nagle 正常处理数据包。

于 2014-03-01T16:50:38.727 回答