Windows,UDP数据包以静默方式丢弃

时间:2016-02-03 16:58:17

标签: c++ windows sockets udp

我已经阅读了很多关于我的特定问题及其与缓冲区的关系,但我不确定我是否遇到过这类问题。原因如下:

我有一个运行的UDP客户端/服务器程序。我在Windows 7上,已在几台Windows服务器操作系统上测试过,所有操作系统都具有相同的效果。

我在客户端和服务器之间打开UDP连接,基本上会发生什么是客户端发送信息请求(Wireshark说数据包大小为126字节),服务器接收它。客户端现在保持静默等待回复。服务器构建响应并发送它(通常在200-600字节之间),然后等待另一个请求。客户端和服务器之间根本没有发生其他通信,它始终遵循这个顺序。

客户端和服务器都有专用于发送和接收的线程(因此有两个线程),它们立即将数据包转储到缓冲区中以供消费,这里的速度似乎不是问题。

这样做很顺利,我对服务器的传入数据包放置了一个不太准确的delta计数,服务器平均说我们每15ms收到一个新的请求。因此,响应的周转时间非常快,这很好。

然而,第328个数据包正在服务器上静默删除,它永远不会到达我们。但是,对于请求总是成功,我有一个基本的6秒重试计时器。如果我继续运行问题仍然存在,一些数据包可以正常运行,然后一个数据包被丢弃,6秒后重试,一切都很顺利。重新启动服务器可以解决问题。

UDP缓冲区,更改此操作无效。我默认分配了10倍的空间但效果相同,相同的数据包。我没有在接收函数上使用MSG_PEEK,因此每次请求时都应该提取数据。

如果我在发送时向客户端流量添加延迟,则问题会立即清除。我还没有拨打暂停值,但是1秒和半秒都会导致问题到目前为止清除。

这似乎与交通量有关?那是一件事吗?我无法想象我的缓冲区在这里被堵塞,因为我实际上没有收到那么多,我几乎立即清除了缓冲区。我在这里躲过某种防洪吗?<​​/ p>

所有防火墙和AV程序都已完全禁用。

1 个答案:

答案 0 :(得分:1)

TCP支持使用重传和指数退避进行传输调步和丢弃数据报检测。如果在使用UDP时需要这些功能,则必须自己实现它们。

如果您需要TCP提供的所有或几乎所有功能,使用UDP是一个巨大的错误。考虑到TCP已经由网络通信和平台细节方面的顶级专家开发和优化,在极端情况下你不太可能比TCP更好地实现它们。