【问题标题】:Is there an equivalent to TCP_CORK in Winsock?Winsock 中是否有相当于 TCP_CORK 的功能?
【发布时间】:2014-04-02 18:09:13
【问题描述】:

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

TCP_CORK(自 Linux 2.2 起)

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

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

【问题讨论】:

    标签: sockets winapi winsock nagle


    【解决方案1】:

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

    【讨论】:

    • 谢谢;在这种情况下,我仍然会设置 TCP_NODELAY 以避免 Nagle 和可能的 200 毫秒延迟。
    【解决方案2】:

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

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

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

    【讨论】:

    • 有趣...你的意思是反过来(未设置,然后设置)?不过,我一定会尝试一下,谢谢!
    • 是的,我就是这个意思。我会修复帖子:)
    猜你喜欢
    • 2012-06-18
    • 2023-03-31
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多