通过UDP套接字发送的限制

时间:2011-09-22 02:50:29

标签: c++ udp

我有一个很大的1GB文件,我试图将其发送到另一个节点。发送方发送200个数据包(发送完整文件之前)后,代码跳出。说“Sendto没有可用的发送空间”。可能是什么问题以及如何处理它。

除此之外,我们需要在此转移中获得最大吞吐量。那么我们应该使用什么来发送缓冲区大小才能有效?

在没有碎片的情况下,我们可以使用多少MTU来传输文件?

由于 日图


感谢您的回答。实际上,我们的项目指定使用UDP,然后使用一些额外的代码来处理丢失的数据包。

现在我可以使用阻塞UDP套接字发送完整文件。

我在类似环境的emulab上运行整个设置,称为Deter。我已将链路丢失设置为0但仍然丢失了一些数据包。可能背后的原因是什么?即使我在发送每个数据包后添加延迟(假设接收器在其缓冲区已满时丢弃数据包),但此数据包丢失仍然存在。

2 个答案:

答案 0 :(得分:5)

可以使用UDP进行高速数据传输,但是您必须确保不要将数据发送()速度超过网卡可以将数据泵送到线路上。在实践中,这意味着要么使用阻塞I / O,要么阻塞select(),并且只有当select()指示套接字已准备好写入时才发送下一个数据包。 (理想情况下,您也不会比接收机器接收数据更快地发送数据,但这些日子不是问题,因为现代CPU速度通常比现代网络I / O速度快得多)

一旦你的逻辑正常工作,发送缓冲区的大小就不是非常重要了。 (即你的发送缓冲区永远不会大到足以保存1GB文件,因此确保程序不会溢出发送缓冲区是发送缓冲区是大还是小的关键问题)接收缓冲区的大小虽然接收器很重要,但最好尽可能大,所以如果接收进程被另一个程序从CPU中移开,接收计算机将不会丢弃数据包。

关于MTU,如果您想避免数据包碎片(并假设您的数据包通过以太网传输),那么您不应将超过1468个字节放入每个UDP数据包(如果您使用的是IPv6,则为1452个字节)。 (通过从以太网的1500字节帧大小中减去必要的IP和UDP报头的大小来计算)

答案 1 :(得分:2)

同意@jonfen。没有UDP用于高速文件传输。

UDP会减少协议开销。但是,在最大传输速率下,传输错误是不可避免的(例如丢包)。因此必须将TCP与纠错方案结合起来。最终结果低于TCP性能。