我使用RIOSend在分布式网络上发送部分TCP数据
Nagle被关闭以达到最小延迟
当目的地是本地时看起来都很好,但是如果真的很远(约40毫秒ping)目的地我看到这个问题:
当我发送部分数据时,下一部分delaeyd,无论RIOSend标志 - RIO_MSG_DONTNOTIFY,RIO_MSG_DEFER还是0。
看起来像从另一边发送waiiting的ACK ....
当我使用简单发送一切都很好。
请帮我解决这个问题!
答案 0 :(得分:0)
尝试添加RIO_MSG_COMMIT电话; RIO_MSG_DEFER将延迟您的数据,RIO_MSG_DONTNOTIFY意味着IOCP或事件在完成时不会被引发,尽管它仍将被添加到队列中。
如果TCP连接上的重新传输超时设置为低?你最终获得了数据吗? (例如300ms之后)
您是否使用以下代码禁用Nagle:
int True = -1;
int result = setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char*)&True, 4)
您还在接收器上使用RIO吗?如果是这样,您使用IOCP,事件或轮询的方法是什么?
请记住,在收到IOCP消息后,您需要致电RIONotify以接收另一个消息。
除此之外:从C#测试here获得一些托管互操作,代码为here;可能会提供一些检查的东西;语言可能不一样,但调用应该基本相同。
actual sending功能可能会有所帮助。
答案 1 :(得分:0)
您似乎无法在RIO TCP套接字上禁用Nagle。
我有同样的问题。我写了一个upd / tcp ping测试,服务器发送UDP数据包,客户端接收它,然后用TCP响应。
如果我让服务器一个接一个地发送3条消息,我得到与NIO禁用的RIO相同的结果,就像我使用Nagle仍然启用的常规套接字一样。
第一个数据包TCP响应快速进入,其他2个等待200毫秒,以便ack计时器到期。
我已经运行wireshark来验证所有这些,窗口大小没有任何问题。
*编辑* 很有趣,因为我刚刚重新访问了这一点。事实证明,NIO for RIO没有任何问题。我对TCP发送器的初始编码是使用1个缓冲区的阻塞模型。所以发生了什么,就是当我想发送数据时,操作系统现在保留在缓冲区上,直到我们得到一个ack,所以如果查看网络捕获,它就像Nagle一样启用了 LOOKED ,因为它在确认之前不会释放唯一的缓冲区。我要更改我的TCP发送器以使用多个出站缓冲区,只需要弄清楚一些细节,比如如果只有一个缓冲区的一部分是确认的话该怎么办。