代码之家  ›  专栏  ›  技术社区  ›  geza

如何使用tcp/ip高效地发送头+缓冲区?

  •  1
  • geza  · 技术社区  · 6 年前

    假设,我有两个缓冲区:

    • 小标题(10-20字节)
    • 有效载荷(介于~10kib-~10mib之间,但通常小于100kib)

    我需要把这个发给服务器。服务器在收到缓冲区时立即响应。

    现在,如果我用两个 send 调用这个(一个用于头,一个用于有效负载),我在windows上得到了非常糟糕的延迟:在发送之后, recv (服务器响应)到达非常慢(40-100毫秒)。如果我为套接字打开tcp_nodelay,响应会更快,但我仍然不满意结果(5-10毫秒,但服务器立即响应)。ping到服务器的时间是0.1毫秒-它在本地网络上)。

    我读过 here ,我们应该避免写-写-读。但是,这正是我现在所做的。我该怎么解决?

    直接的解决方案是将报头和有效负载复制到一个新的缓冲区中,然后发送它。但我想避免这种情况,因为我需要为此分配一个新的更大的缓冲区(更不用说拷贝了)。

    另一个解决方案是分配一个较小的缓冲区(比如4KB),并将数据分块发送。但是,这样,我不确定这个4KB块将如何被切割成TCP/IP段。最后一部分可能会很小,所以这会导致一些效率低下。

    Linux有 MSG_MORE ,这可能会在Linux上解决此问题。但我看不到与之相当的窗户。

    这个问题的最有效(快速)解决方案是什么?

    0 回复  |  直到 6 年前