假设,我有两个缓冲区:
-
小标题(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上解决此问题。但我看不到与之相当的窗户。
这个问题的最有效(快速)解决方案是什么?