Windows,UDP数据包静默丢弃
Posted
技术标签:
【中文标题】Windows,UDP数据包静默丢弃【英文标题】:Windows, UDP packets silently dropped 【发布时间】:2016-02-03 16:58:17 【问题描述】:我已经阅读了很多关于我的特定问题以及它与缓冲区的关系的信息,但我不确定我是否遇到了这种问题。原因如下:
我编写了一个正在运行的 UDP 客户端/服务器程序。我在 Windows 7 上,这已经在几个 Windows 服务器操作系统上进行了测试,效果都一样。
我在客户端和服务器之间打开一个 UDP 连接,基本上发生的情况是客户端发送信息请求(Wireshark 说数据包大小为 126 字节)并且服务器接收它。客户端现在保持沉默等待回复。服务器构建响应并发送它(通常在 200-600 字节之间),然后等待另一个请求。客户端和服务器之间根本没有发生其他通信,并且始终遵循此顺序。
客户端和服务器都有专门用于传输和接收的线程(所以两个线程),它们会立即将数据包转储到缓冲区中以供使用,这里的速度似乎不是问题。
这完全没用了,我对传入服务器的数据包进行了不太准确的增量计数,服务器说我们平均每 15 毫秒收到一个新请求。因此,响应时间非常快。
但是,第 328 个数据包在服务器上被静默丢弃,它永远不会到达我们。但是,对于始终成功的请求,我有一个基本的 6 秒重试计时器。如果我继续运行问题仍然存在,一些数据包正常,然后丢弃一个,6 秒后重试,一切正常。重新启动服务器即可解决此问题。
UDP 缓冲区,更改它的效果为零。我分配了 10 倍的默认空间,但效果相同,数据包相同。我没有在接收函数上使用 MSG_PEEK,因此每次请求时都应提取数据。
如果我在发送时向客户端流量添加延迟,问题就会立即解决。我还没有输入超时值,但到目前为止,1 秒和半秒都会导致问题得到解决。
这似乎与流量有关?那是一回事吗?我无法想象我的缓冲区在这里被堵塞了,因为我实际上并没有收到那么多,我几乎立即清除了缓冲区。我是不是被某种防洪设施绊倒了?
所有防火墙和反病毒程序都被完全禁用。
【问题讨论】:
数据包丢失在哪里?在网络上?服务器操作系统?服务器软件?阅读您的描述,看起来数据包在服务器软件上丢失了。这可能意味着服务器代码中存在错误,但在这一点上没有任何信息可以提供帮助。 对不起,数据包在服务器端被丢弃。客户端重试,一切正常。数据包根本不会从 Windows IP 堆栈收到,它只是丢失/丢弃。我可以通过读出每个数据包中的某个唯一 ID 并将其转储到数组中来确认这一点。丢失数据包的 ID 永远不会出现。接收的线程代码简单地坐在那里,当事件发出信号时,它从堆栈中提取数据包并将其传递到内部队列进行处理,同时线程等待更多。 哦,也许我应该指出数据包出现在服务器端的 Wireshark 中。这就是我知道它也被发送到服务器的方式。 但是您确认原始网络 API 调用根本没有收到数据包?不只是内部排队失败? 我已确认我从未收到来自 API 调用的数据包。我对每个数据包都有一个唯一的 ID,客户端和服务器中的一些测试代码存储了所有进出流量的列表。数据包的唯一 ID 永远不会出现在服务器上。因此,如果客户端发送 ID 1、2、3,服务器会说它收到了 1、3。 2 在某个地方丢失了,但 Wireshark 看到了它。 【参考方案1】:TCP 支持重传和指数退避的传输定步和丢弃数据报检测。如果您在使用 UDP 时需要这些功能,则必须自己实现。
如果您需要 TCP 提供的全部或几乎全部功能,那么使用 UDP 是一个巨大的错误。考虑到 TCP 已经由网络通信和平台细节方面的***专家开发和优化,在极端情况下,您不太可能比 TCP 更好地实现它们。
【讨论】:
不幸的是,我被困在使用 UDP 并且没有办法解决这个问题。不过 TCP 将是最终的解决方案。 那你需要实现重复包检测、重传丢包检测、慢启动、指数退避等。对不起。研究 TCP 以了解它是如何做这些事情的。 是的,其中一些已经实现。我想我更好奇为什么会发生这种情况,以及为什么看起来我沟通得越快,它丢失的越多,而缓冲区似乎没有被溢出。这是一般UDP的行为吗?我知道它可能会丢失一些东西,因为它不如 TVP 强大,但是在流量方面我需要注意某种上行限制吗? @Radius 有一个上限。您可以通过逐渐增加传输速率来检测它,直到您开始丢失数据报。然后你退后。以上是关于Windows,UDP数据包静默丢弃的主要内容,如果未能解决你的问题,请参考以下文章