【发布时间】:2015-12-29 12:53:10
【问题描述】:
我们决定使用 UDP 发送大量数据,例如:
- 客户端 [C++](使用轮询)
- 服务器 [JAVA] [Apache MINA]
我的数据报最大只有 512 字节,以避免在传输过程中产生碎片。
每个数据报都有一个我添加的标题(里面有一个ID),以便我可以监控:
- 收到多少数据报
- 收到了哪些
问题是我们发送数据报太快了。我们像第一个那样收到,然后有很大的损失,然后得到一些,又是大的损失。接收到的 ID 数据报的顺序类似于 [1], [2], [250], [251].....
问题也发生在本地(使用 localhost,仅 1 个网卡) 我不关心丢失数据报,但这里不是因为网络造成的简单丢失(我可以处理)
所以我的问题是:
- 在客户端,我怎样才能得到最好的:
- 设置,还是套接字设置?
- 如何尽可能多地发送而不发送太多?
- 在服务器上,Apache MINA 似乎说它自己管理~“缓冲区套接字的大小”~但是还有一些设置需要关心吗?
- 知道我们的连接已经允许我们在下载常规文件时至少拥有这个带宽,是否有可能达到 1MB/s?
现在,当我们要传输约 4KB 的坐标信息时,我们必须添加睡眠时间,以便等待 5 分钟或更长时间才能完成,知道我们应该每分钟发送一次对我们来说是个大问题至少 10MB 坐标信息。
【问题讨论】:
-
我会首先安装wireshark 以确认数据包正在进入盒子。也可以使用 OS UDP 缓冲区大小。听起来很可疑,即使 mina 处理它们的速度太慢,操作系统也应该缓冲。
-
"要传输约 4KB 的坐标信息,我们必须增加睡眠时间,以便等待 5 分钟或更长时间" 即每 40 秒 1 个数据包......它会更快地切换到电报和莫尔斯电码。
-
这看起来像是一个拥塞问题,所以你需要一些拥塞控制,或者至少限制发送。但是 5 分钟的 4KB 看起来问题要大得多,可能在您的代码中。
-
@SChepurin“我的应用程序在不应该的情况下占用了我的硬盘驱动器上的 1TB”,您的答案是:“购买 2TB 硬盘驱动器”。这不是解决方案。
-
@ElderBug - 最后看到“检查”了吗?这是一个测试,而不是一个解决方案(可以建议什么没有代码的解决方案?)。